unicode_utils 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/cdata/canonical_decomposition_map +1 -0
- data/cdata/composition_exclusion_set +1 -0
- data/cdata/jamo_short_names +66 -0
- data/cdata/names +0 -20
- data/lib/unicode_utils/canonical_decomposition.rb +86 -0
- data/lib/unicode_utils/canonical_equivalents_q.rb +20 -0
- data/lib/unicode_utils/combining_class.rb +1 -1
- data/lib/unicode_utils/conditional_casing.rb +8 -8
- data/lib/unicode_utils/downcase.rb +2 -2
- data/lib/unicode_utils/hangul_syllable_decomposition.rb +44 -0
- data/lib/unicode_utils/jamo_short_name.rb +20 -0
- data/lib/unicode_utils/name.rb +26 -21
- data/lib/unicode_utils/nfc.rb +142 -0
- data/lib/unicode_utils/nfd.rb +15 -0
- data/lib/unicode_utils/{read_special_casing_map.rb → read_multivalued_map.rb} +1 -1
- data/lib/unicode_utils/read_names.rb +22 -0
- data/lib/unicode_utils/upcase.rb +2 -2
- data/lib/unicode_utils/version.rb +1 -1
- data/lib/unicode_utils.rb +18 -0
- data/test/test_normalization.rb +75 -0
- data/test/test_unicode_utils.rb +34 -0
- metadata +16 -4
@@ -0,0 +1 @@
|
|
1
|
+
0000c0000041000300xxxxxx0000c1000041000301xxxxxx0000c2000041000302xxxxxx0000c3000041000303xxxxxx0000c4000041000308xxxxxx0000c500004100030axxxxxx0000c7000043000327xxxxxx0000c8000045000300xxxxxx0000c9000045000301xxxxxx0000ca000045000302xxxxxx0000cb000045000308xxxxxx0000cc000049000300xxxxxx0000cd000049000301xxxxxx0000ce000049000302xxxxxx0000cf000049000308xxxxxx0000d100004e000303xxxxxx0000d200004f000300xxxxxx0000d300004f000301xxxxxx0000d400004f000302xxxxxx0000d500004f000303xxxxxx0000d600004f000308xxxxxx0000d9000055000300xxxxxx0000da000055000301xxxxxx0000db000055000302xxxxxx0000dc000055000308xxxxxx0000dd000059000301xxxxxx0000e0000061000300xxxxxx0000e1000061000301xxxxxx0000e2000061000302xxxxxx0000e3000061000303xxxxxx0000e4000061000308xxxxxx0000e500006100030axxxxxx0000e7000063000327xxxxxx0000e8000065000300xxxxxx0000e9000065000301xxxxxx0000ea000065000302xxxxxx0000eb000065000308xxxxxx0000ec000069000300xxxxxx0000ed000069000301xxxxxx0000ee000069000302xxxxxx0000ef000069000308xxxxxx0000f100006e000303xxxxxx0000f200006f000300xxxxxx0000f300006f000301xxxxxx0000f400006f000302xxxxxx0000f500006f000303xxxxxx0000f600006f000308xxxxxx0000f9000075000300xxxxxx0000fa000075000301xxxxxx0000fb000075000302xxxxxx0000fc000075000308xxxxxx0000fd000079000301xxxxxx0000ff000079000308xxxxxx000100000041000304xxxxxx000101000061000304xxxxxx000102000041000306xxxxxx000103000061000306xxxxxx000104000041000328xxxxxx000105000061000328xxxxxx000106000043000301xxxxxx000107000063000301xxxxxx000108000043000302xxxxxx000109000063000302xxxxxx00010a000043000307xxxxxx00010b000063000307xxxxxx00010c00004300030cxxxxxx00010d00006300030cxxxxxx00010e00004400030cxxxxxx00010f00006400030cxxxxxx000112000045000304xxxxxx000113000065000304xxxxxx000114000045000306xxxxxx000115000065000306xxxxxx000116000045000307xxxxxx000117000065000307xxxxxx000118000045000328xxxxxx000119000065000328xxxxxx00011a00004500030cxxxxxx00011b00006500030cxxxxxx00011c000047000302xxxxxx00011d000067000302xxxxxx00011e000047000306xxxxxx00011f000067000306xxxxxx000120000047000307xxxxxx000121000067000307xxxxxx000122000047000327xxxxxx000123000067000327xxxxxx000124000048000302xxxxxx000125000068000302xxxxxx000128000049000303xxxxxx000129000069000303xxxxxx00012a000049000304xxxxxx00012b000069000304xxxxxx00012c000049000306xxxxxx00012d000069000306xxxxxx00012e000049000328xxxxxx00012f000069000328xxxxxx000130000049000307xxxxxx00013400004a000302xxxxxx00013500006a000302xxxxxx00013600004b000327xxxxxx00013700006b000327xxxxxx00013900004c000301xxxxxx00013a00006c000301xxxxxx00013b00004c000327xxxxxx00013c00006c000327xxxxxx00013d00004c00030cxxxxxx00013e00006c00030cxxxxxx00014300004e000301xxxxxx00014400006e000301xxxxxx00014500004e000327xxxxxx00014600006e000327xxxxxx00014700004e00030cxxxxxx00014800006e00030cxxxxxx00014c00004f000304xxxxxx00014d00006f000304xxxxxx00014e00004f000306xxxxxx00014f00006f000306xxxxxx00015000004f00030bxxxxxx00015100006f00030bxxxxxx000154000052000301xxxxxx000155000072000301xxxxxx000156000052000327xxxxxx000157000072000327xxxxxx00015800005200030cxxxxxx00015900007200030cxxxxxx00015a000053000301xxxxxx00015b000073000301xxxxxx00015c000053000302xxxxxx00015d000073000302xxxxxx00015e000053000327xxxxxx00015f000073000327xxxxxx00016000005300030cxxxxxx00016100007300030cxxxxxx000162000054000327xxxxxx000163000074000327xxxxxx00016400005400030cxxxxxx00016500007400030cxxxxxx000168000055000303xxxxxx000169000075000303xxxxxx00016a000055000304xxxxxx00016b000075000304xxxxxx00016c000055000306xxxxxx00016d000075000306xxxxxx00016e00005500030axxxxxx00016f00007500030axxxxxx00017000005500030bxxxxxx00017100007500030bxxxxxx000172000055000328xxxxxx000173000075000328xxxxxx000174000057000302xxxxxx000175000077000302xxxxxx000176000059000302xxxxxx000177000079000302xxxxxx000178000059000308xxxxxx00017900005a000301xxxxxx00017a00007a000301xxxxxx00017b00005a000307xxxxxx00017c00007a000307xxxxxx00017d00005a00030cxxxxxx00017e00007a00030cxxxxxx0001a000004f00031bxxxxxx0001a100006f00031bxxxxxx0001af00005500031bxxxxxx0001b000007500031bxxxxxx0001cd00004100030cxxxxxx0001ce00006100030cxxxxxx0001cf00004900030cxxxxxx0001d000006900030cxxxxxx0001d100004f00030cxxxxxx0001d200006f00030cxxxxxx0001d300005500030cxxxxxx0001d400007500030cxxxxxx0001d50000dc000304xxxxxx0001d60000fc000304xxxxxx0001d70000dc000301xxxxxx0001d80000fc000301xxxxxx0001d90000dc00030cxxxxxx0001da0000fc00030cxxxxxx0001db0000dc000300xxxxxx0001dc0000fc000300xxxxxx0001de0000c4000304xxxxxx0001df0000e4000304xxxxxx0001e0000226000304xxxxxx0001e1000227000304xxxxxx0001e20000c6000304xxxxxx0001e30000e6000304xxxxxx0001e600004700030cxxxxxx0001e700006700030cxxxxxx0001e800004b00030cxxxxxx0001e900006b00030cxxxxxx0001ea00004f000328xxxxxx0001eb00006f000328xxxxxx0001ec0001ea000304xxxxxx0001ed0001eb000304xxxxxx0001ee0001b700030cxxxxxx0001ef00029200030cxxxxxx0001f000006a00030cxxxxxx0001f4000047000301xxxxxx0001f5000067000301xxxxxx0001f800004e000300xxxxxx0001f900006e000300xxxxxx0001fa0000c5000301xxxxxx0001fb0000e5000301xxxxxx0001fc0000c6000301xxxxxx0001fd0000e6000301xxxxxx0001fe0000d8000301xxxxxx0001ff0000f8000301xxxxxx00020000004100030fxxxxxx00020100006100030fxxxxxx000202000041000311xxxxxx000203000061000311xxxxxx00020400004500030fxxxxxx00020500006500030fxxxxxx000206000045000311xxxxxx000207000065000311xxxxxx00020800004900030fxxxxxx00020900006900030fxxxxxx00020a000049000311xxxxxx00020b000069000311xxxxxx00020c00004f00030fxxxxxx00020d00006f00030fxxxxxx00020e00004f000311xxxxxx00020f00006f000311xxxxxx00021000005200030fxxxxxx00021100007200030fxxxxxx000212000052000311xxxxxx000213000072000311xxxxxx00021400005500030fxxxxxx00021500007500030fxxxxxx000216000055000311xxxxxx000217000075000311xxxxxx000218000053000326xxxxxx000219000073000326xxxxxx00021a000054000326xxxxxx00021b000074000326xxxxxx00021e00004800030cxxxxxx00021f00006800030cxxxxxx000226000041000307xxxxxx000227000061000307xxxxxx000228000045000327xxxxxx000229000065000327xxxxxx00022a0000d6000304xxxxxx00022b0000f6000304xxxxxx00022c0000d5000304xxxxxx00022d0000f5000304xxxxxx00022e00004f000307xxxxxx00022f00006f000307xxxxxx00023000022e000304xxxxxx00023100022f000304xxxxxx000232000059000304xxxxxx000233000079000304xxxxxx000340000300xxxxxx000341000301xxxxxx000343000313xxxxxx000344000308000301xxxxxx0003740002b9xxxxxx00037e00003bxxxxxx0003850000a8000301xxxxxx000386000391000301xxxxxx0003870000b7xxxxxx000388000395000301xxxxxx000389000397000301xxxxxx00038a000399000301xxxxxx00038c00039f000301xxxxxx00038e0003a5000301xxxxxx00038f0003a9000301xxxxxx0003900003ca000301xxxxxx0003aa000399000308xxxxxx0003ab0003a5000308xxxxxx0003ac0003b1000301xxxxxx0003ad0003b5000301xxxxxx0003ae0003b7000301xxxxxx0003af0003b9000301xxxxxx0003b00003cb000301xxxxxx0003ca0003b9000308xxxxxx0003cb0003c5000308xxxxxx0003cc0003bf000301xxxxxx0003cd0003c5000301xxxxxx0003ce0003c9000301xxxxxx0003d30003d2000301xxxxxx0003d40003d2000308xxxxxx000400000415000300xxxxxx000401000415000308xxxxxx000403000413000301xxxxxx000407000406000308xxxxxx00040c00041a000301xxxxxx00040d000418000300xxxxxx00040e000423000306xxxxxx000419000418000306xxxxxx000439000438000306xxxxxx000450000435000300xxxxxx000451000435000308xxxxxx000453000433000301xxxxxx000457000456000308xxxxxx00045c00043a000301xxxxxx00045d000438000300xxxxxx00045e000443000306xxxxxx00047600047400030fxxxxxx00047700047500030fxxxxxx0004c1000416000306xxxxxx0004c2000436000306xxxxxx0004d0000410000306xxxxxx0004d1000430000306xxxxxx0004d2000410000308xxxxxx0004d3000430000308xxxxxx0004d6000415000306xxxxxx0004d7000435000306xxxxxx0004da0004d8000308xxxxxx0004db0004d9000308xxxxxx0004dc000416000308xxxxxx0004dd000436000308xxxxxx0004de000417000308xxxxxx0004df000437000308xxxxxx0004e2000418000304xxxxxx0004e3000438000304xxxxxx0004e4000418000308xxxxxx0004e5000438000308xxxxxx0004e600041e000308xxxxxx0004e700043e000308xxxxxx0004ea0004e8000308xxxxxx0004eb0004e9000308xxxxxx0004ec00042d000308xxxxxx0004ed00044d000308xxxxxx0004ee000423000304xxxxxx0004ef000443000304xxxxxx0004f0000423000308xxxxxx0004f1000443000308xxxxxx0004f200042300030bxxxxxx0004f300044300030bxxxxxx0004f4000427000308xxxxxx0004f5000447000308xxxxxx0004f800042b000308xxxxxx0004f900044b000308xxxxxx000622000627000653xxxxxx000623000627000654xxxxxx000624000648000654xxxxxx000625000627000655xxxxxx00062600064a000654xxxxxx0006c00006d5000654xxxxxx0006c20006c1000654xxxxxx0006d30006d2000654xxxxxx00092900092800093cxxxxxx00093100093000093cxxxxxx00093400093300093cxxxxxx00095800091500093cxxxxxx00095900091600093cxxxxxx00095a00091700093cxxxxxx00095b00091c00093cxxxxxx00095c00092100093cxxxxxx00095d00092200093cxxxxxx00095e00092b00093cxxxxxx00095f00092f00093cxxxxxx0009cb0009c70009bexxxxxx0009cc0009c70009d7xxxxxx0009dc0009a10009bcxxxxxx0009dd0009a20009bcxxxxxx0009df0009af0009bcxxxxxx000a33000a32000a3cxxxxxx000a36000a38000a3cxxxxxx000a59000a16000a3cxxxxxx000a5a000a17000a3cxxxxxx000a5b000a1c000a3cxxxxxx000a5e000a2b000a3cxxxxxx000b48000b47000b56xxxxxx000b4b000b47000b3exxxxxx000b4c000b47000b57xxxxxx000b5c000b21000b3cxxxxxx000b5d000b22000b3cxxxxxx000b94000b92000bd7xxxxxx000bca000bc6000bbexxxxxx000bcb000bc7000bbexxxxxx000bcc000bc6000bd7xxxxxx000c48000c46000c56xxxxxx000cc0000cbf000cd5xxxxxx000cc7000cc6000cd5xxxxxx000cc8000cc6000cd6xxxxxx000cca000cc6000cc2xxxxxx000ccb000cca000cd5xxxxxx000d4a000d46000d3exxxxxx000d4b000d47000d3exxxxxx000d4c000d46000d57xxxxxx000dda000dd9000dcaxxxxxx000ddc000dd9000dcfxxxxxx000ddd000ddc000dcaxxxxxx000dde000dd9000ddfxxxxxx000f43000f42000fb7xxxxxx000f4d000f4c000fb7xxxxxx000f52000f51000fb7xxxxxx000f57000f56000fb7xxxxxx000f5c000f5b000fb7xxxxxx000f69000f40000fb5xxxxxx000f73000f71000f72xxxxxx000f75000f71000f74xxxxxx000f76000fb2000f80xxxxxx000f78000fb3000f80xxxxxx000f81000f71000f80xxxxxx000f93000f92000fb7xxxxxx000f9d000f9c000fb7xxxxxx000fa2000fa1000fb7xxxxxx000fa7000fa6000fb7xxxxxx000fac000fab000fb7xxxxxx000fb9000f90000fb5xxxxxx00102600102500102exxxxxx001b06001b05001b35xxxxxx001b08001b07001b35xxxxxx001b0a001b09001b35xxxxxx001b0c001b0b001b35xxxxxx001b0e001b0d001b35xxxxxx001b12001b11001b35xxxxxx001b3b001b3a001b35xxxxxx001b3d001b3c001b35xxxxxx001b40001b3e001b35xxxxxx001b41001b3f001b35xxxxxx001b43001b42001b35xxxxxx001e00000041000325xxxxxx001e01000061000325xxxxxx001e02000042000307xxxxxx001e03000062000307xxxxxx001e04000042000323xxxxxx001e05000062000323xxxxxx001e06000042000331xxxxxx001e07000062000331xxxxxx001e080000c7000301xxxxxx001e090000e7000301xxxxxx001e0a000044000307xxxxxx001e0b000064000307xxxxxx001e0c000044000323xxxxxx001e0d000064000323xxxxxx001e0e000044000331xxxxxx001e0f000064000331xxxxxx001e10000044000327xxxxxx001e11000064000327xxxxxx001e1200004400032dxxxxxx001e1300006400032dxxxxxx001e14000112000300xxxxxx001e15000113000300xxxxxx001e16000112000301xxxxxx001e17000113000301xxxxxx001e1800004500032dxxxxxx001e1900006500032dxxxxxx001e1a000045000330xxxxxx001e1b000065000330xxxxxx001e1c000228000306xxxxxx001e1d000229000306xxxxxx001e1e000046000307xxxxxx001e1f000066000307xxxxxx001e20000047000304xxxxxx001e21000067000304xxxxxx001e22000048000307xxxxxx001e23000068000307xxxxxx001e24000048000323xxxxxx001e25000068000323xxxxxx001e26000048000308xxxxxx001e27000068000308xxxxxx001e28000048000327xxxxxx001e29000068000327xxxxxx001e2a00004800032exxxxxx001e2b00006800032exxxxxx001e2c000049000330xxxxxx001e2d000069000330xxxxxx001e2e0000cf000301xxxxxx001e2f0000ef000301xxxxxx001e3000004b000301xxxxxx001e3100006b000301xxxxxx001e3200004b000323xxxxxx001e3300006b000323xxxxxx001e3400004b000331xxxxxx001e3500006b000331xxxxxx001e3600004c000323xxxxxx001e3700006c000323xxxxxx001e38001e36000304xxxxxx001e39001e37000304xxxxxx001e3a00004c000331xxxxxx001e3b00006c000331xxxxxx001e3c00004c00032dxxxxxx001e3d00006c00032dxxxxxx001e3e00004d000301xxxxxx001e3f00006d000301xxxxxx001e4000004d000307xxxxxx001e4100006d000307xxxxxx001e4200004d000323xxxxxx001e4300006d000323xxxxxx001e4400004e000307xxxxxx001e4500006e000307xxxxxx001e4600004e000323xxxxxx001e4700006e000323xxxxxx001e4800004e000331xxxxxx001e4900006e000331xxxxxx001e4a00004e00032dxxxxxx001e4b00006e00032dxxxxxx001e4c0000d5000301xxxxxx001e4d0000f5000301xxxxxx001e4e0000d5000308xxxxxx001e4f0000f5000308xxxxxx001e5000014c000300xxxxxx001e5100014d000300xxxxxx001e5200014c000301xxxxxx001e5300014d000301xxxxxx001e54000050000301xxxxxx001e55000070000301xxxxxx001e56000050000307xxxxxx001e57000070000307xxxxxx001e58000052000307xxxxxx001e59000072000307xxxxxx001e5a000052000323xxxxxx001e5b000072000323xxxxxx001e5c001e5a000304xxxxxx001e5d001e5b000304xxxxxx001e5e000052000331xxxxxx001e5f000072000331xxxxxx001e60000053000307xxxxxx001e61000073000307xxxxxx001e62000053000323xxxxxx001e63000073000323xxxxxx001e6400015a000307xxxxxx001e6500015b000307xxxxxx001e66000160000307xxxxxx001e67000161000307xxxxxx001e68001e62000307xxxxxx001e69001e63000307xxxxxx001e6a000054000307xxxxxx001e6b000074000307xxxxxx001e6c000054000323xxxxxx001e6d000074000323xxxxxx001e6e000054000331xxxxxx001e6f000074000331xxxxxx001e7000005400032dxxxxxx001e7100007400032dxxxxxx001e72000055000324xxxxxx001e73000075000324xxxxxx001e74000055000330xxxxxx001e75000075000330xxxxxx001e7600005500032dxxxxxx001e7700007500032dxxxxxx001e78000168000301xxxxxx001e79000169000301xxxxxx001e7a00016a000308xxxxxx001e7b00016b000308xxxxxx001e7c000056000303xxxxxx001e7d000076000303xxxxxx001e7e000056000323xxxxxx001e7f000076000323xxxxxx001e80000057000300xxxxxx001e81000077000300xxxxxx001e82000057000301xxxxxx001e83000077000301xxxxxx001e84000057000308xxxxxx001e85000077000308xxxxxx001e86000057000307xxxxxx001e87000077000307xxxxxx001e88000057000323xxxxxx001e89000077000323xxxxxx001e8a000058000307xxxxxx001e8b000078000307xxxxxx001e8c000058000308xxxxxx001e8d000078000308xxxxxx001e8e000059000307xxxxxx001e8f000079000307xxxxxx001e9000005a000302xxxxxx001e9100007a000302xxxxxx001e9200005a000323xxxxxx001e9300007a000323xxxxxx001e9400005a000331xxxxxx001e9500007a000331xxxxxx001e96000068000331xxxxxx001e97000074000308xxxxxx001e9800007700030axxxxxx001e9900007900030axxxxxx001e9b00017f000307xxxxxx001ea0000041000323xxxxxx001ea1000061000323xxxxxx001ea2000041000309xxxxxx001ea3000061000309xxxxxx001ea40000c2000301xxxxxx001ea50000e2000301xxxxxx001ea60000c2000300xxxxxx001ea70000e2000300xxxxxx001ea80000c2000309xxxxxx001ea90000e2000309xxxxxx001eaa0000c2000303xxxxxx001eab0000e2000303xxxxxx001eac001ea0000302xxxxxx001ead001ea1000302xxxxxx001eae000102000301xxxxxx001eaf000103000301xxxxxx001eb0000102000300xxxxxx001eb1000103000300xxxxxx001eb2000102000309xxxxxx001eb3000103000309xxxxxx001eb4000102000303xxxxxx001eb5000103000303xxxxxx001eb6001ea0000306xxxxxx001eb7001ea1000306xxxxxx001eb8000045000323xxxxxx001eb9000065000323xxxxxx001eba000045000309xxxxxx001ebb000065000309xxxxxx001ebc000045000303xxxxxx001ebd000065000303xxxxxx001ebe0000ca000301xxxxxx001ebf0000ea000301xxxxxx001ec00000ca000300xxxxxx001ec10000ea000300xxxxxx001ec20000ca000309xxxxxx001ec30000ea000309xxxxxx001ec40000ca000303xxxxxx001ec50000ea000303xxxxxx001ec6001eb8000302xxxxxx001ec7001eb9000302xxxxxx001ec8000049000309xxxxxx001ec9000069000309xxxxxx001eca000049000323xxxxxx001ecb000069000323xxxxxx001ecc00004f000323xxxxxx001ecd00006f000323xxxxxx001ece00004f000309xxxxxx001ecf00006f000309xxxxxx001ed00000d4000301xxxxxx001ed10000f4000301xxxxxx001ed20000d4000300xxxxxx001ed30000f4000300xxxxxx001ed40000d4000309xxxxxx001ed50000f4000309xxxxxx001ed60000d4000303xxxxxx001ed70000f4000303xxxxxx001ed8001ecc000302xxxxxx001ed9001ecd000302xxxxxx001eda0001a0000301xxxxxx001edb0001a1000301xxxxxx001edc0001a0000300xxxxxx001edd0001a1000300xxxxxx001ede0001a0000309xxxxxx001edf0001a1000309xxxxxx001ee00001a0000303xxxxxx001ee10001a1000303xxxxxx001ee20001a0000323xxxxxx001ee30001a1000323xxxxxx001ee4000055000323xxxxxx001ee5000075000323xxxxxx001ee6000055000309xxxxxx001ee7000075000309xxxxxx001ee80001af000301xxxxxx001ee90001b0000301xxxxxx001eea0001af000300xxxxxx001eeb0001b0000300xxxxxx001eec0001af000309xxxxxx001eed0001b0000309xxxxxx001eee0001af000303xxxxxx001eef0001b0000303xxxxxx001ef00001af000323xxxxxx001ef10001b0000323xxxxxx001ef2000059000300xxxxxx001ef3000079000300xxxxxx001ef4000059000323xxxxxx001ef5000079000323xxxxxx001ef6000059000309xxxxxx001ef7000079000309xxxxxx001ef8000059000303xxxxxx001ef9000079000303xxxxxx001f000003b1000313xxxxxx001f010003b1000314xxxxxx001f02001f00000300xxxxxx001f03001f01000300xxxxxx001f04001f00000301xxxxxx001f05001f01000301xxxxxx001f06001f00000342xxxxxx001f07001f01000342xxxxxx001f08000391000313xxxxxx001f09000391000314xxxxxx001f0a001f08000300xxxxxx001f0b001f09000300xxxxxx001f0c001f08000301xxxxxx001f0d001f09000301xxxxxx001f0e001f08000342xxxxxx001f0f001f09000342xxxxxx001f100003b5000313xxxxxx001f110003b5000314xxxxxx001f12001f10000300xxxxxx001f13001f11000300xxxxxx001f14001f10000301xxxxxx001f15001f11000301xxxxxx001f18000395000313xxxxxx001f19000395000314xxxxxx001f1a001f18000300xxxxxx001f1b001f19000300xxxxxx001f1c001f18000301xxxxxx001f1d001f19000301xxxxxx001f200003b7000313xxxxxx001f210003b7000314xxxxxx001f22001f20000300xxxxxx001f23001f21000300xxxxxx001f24001f20000301xxxxxx001f25001f21000301xxxxxx001f26001f20000342xxxxxx001f27001f21000342xxxxxx001f28000397000313xxxxxx001f29000397000314xxxxxx001f2a001f28000300xxxxxx001f2b001f29000300xxxxxx001f2c001f28000301xxxxxx001f2d001f29000301xxxxxx001f2e001f28000342xxxxxx001f2f001f29000342xxxxxx001f300003b9000313xxxxxx001f310003b9000314xxxxxx001f32001f30000300xxxxxx001f33001f31000300xxxxxx001f34001f30000301xxxxxx001f35001f31000301xxxxxx001f36001f30000342xxxxxx001f37001f31000342xxxxxx001f38000399000313xxxxxx001f39000399000314xxxxxx001f3a001f38000300xxxxxx001f3b001f39000300xxxxxx001f3c001f38000301xxxxxx001f3d001f39000301xxxxxx001f3e001f38000342xxxxxx001f3f001f39000342xxxxxx001f400003bf000313xxxxxx001f410003bf000314xxxxxx001f42001f40000300xxxxxx001f43001f41000300xxxxxx001f44001f40000301xxxxxx001f45001f41000301xxxxxx001f4800039f000313xxxxxx001f4900039f000314xxxxxx001f4a001f48000300xxxxxx001f4b001f49000300xxxxxx001f4c001f48000301xxxxxx001f4d001f49000301xxxxxx001f500003c5000313xxxxxx001f510003c5000314xxxxxx001f52001f50000300xxxxxx001f53001f51000300xxxxxx001f54001f50000301xxxxxx001f55001f51000301xxxxxx001f56001f50000342xxxxxx001f57001f51000342xxxxxx001f590003a5000314xxxxxx001f5b001f59000300xxxxxx001f5d001f59000301xxxxxx001f5f001f59000342xxxxxx001f600003c9000313xxxxxx001f610003c9000314xxxxxx001f62001f60000300xxxxxx001f63001f61000300xxxxxx001f64001f60000301xxxxxx001f65001f61000301xxxxxx001f66001f60000342xxxxxx001f67001f61000342xxxxxx001f680003a9000313xxxxxx001f690003a9000314xxxxxx001f6a001f68000300xxxxxx001f6b001f69000300xxxxxx001f6c001f68000301xxxxxx001f6d001f69000301xxxxxx001f6e001f68000342xxxxxx001f6f001f69000342xxxxxx001f700003b1000300xxxxxx001f710003acxxxxxx001f720003b5000300xxxxxx001f730003adxxxxxx001f740003b7000300xxxxxx001f750003aexxxxxx001f760003b9000300xxxxxx001f770003afxxxxxx001f780003bf000300xxxxxx001f790003ccxxxxxx001f7a0003c5000300xxxxxx001f7b0003cdxxxxxx001f7c0003c9000300xxxxxx001f7d0003cexxxxxx001f80001f00000345xxxxxx001f81001f01000345xxxxxx001f82001f02000345xxxxxx001f83001f03000345xxxxxx001f84001f04000345xxxxxx001f85001f05000345xxxxxx001f86001f06000345xxxxxx001f87001f07000345xxxxxx001f88001f08000345xxxxxx001f89001f09000345xxxxxx001f8a001f0a000345xxxxxx001f8b001f0b000345xxxxxx001f8c001f0c000345xxxxxx001f8d001f0d000345xxxxxx001f8e001f0e000345xxxxxx001f8f001f0f000345xxxxxx001f90001f20000345xxxxxx001f91001f21000345xxxxxx001f92001f22000345xxxxxx001f93001f23000345xxxxxx001f94001f24000345xxxxxx001f95001f25000345xxxxxx001f96001f26000345xxxxxx001f97001f27000345xxxxxx001f98001f28000345xxxxxx001f99001f29000345xxxxxx001f9a001f2a000345xxxxxx001f9b001f2b000345xxxxxx001f9c001f2c000345xxxxxx001f9d001f2d000345xxxxxx001f9e001f2e000345xxxxxx001f9f001f2f000345xxxxxx001fa0001f60000345xxxxxx001fa1001f61000345xxxxxx001fa2001f62000345xxxxxx001fa3001f63000345xxxxxx001fa4001f64000345xxxxxx001fa5001f65000345xxxxxx001fa6001f66000345xxxxxx001fa7001f67000345xxxxxx001fa8001f68000345xxxxxx001fa9001f69000345xxxxxx001faa001f6a000345xxxxxx001fab001f6b000345xxxxxx001fac001f6c000345xxxxxx001fad001f6d000345xxxxxx001fae001f6e000345xxxxxx001faf001f6f000345xxxxxx001fb00003b1000306xxxxxx001fb10003b1000304xxxxxx001fb2001f70000345xxxxxx001fb30003b1000345xxxxxx001fb40003ac000345xxxxxx001fb60003b1000342xxxxxx001fb7001fb6000345xxxxxx001fb8000391000306xxxxxx001fb9000391000304xxxxxx001fba000391000300xxxxxx001fbb000386xxxxxx001fbc000391000345xxxxxx001fbe0003b9xxxxxx001fc10000a8000342xxxxxx001fc2001f74000345xxxxxx001fc30003b7000345xxxxxx001fc40003ae000345xxxxxx001fc60003b7000342xxxxxx001fc7001fc6000345xxxxxx001fc8000395000300xxxxxx001fc9000388xxxxxx001fca000397000300xxxxxx001fcb000389xxxxxx001fcc000397000345xxxxxx001fcd001fbf000300xxxxxx001fce001fbf000301xxxxxx001fcf001fbf000342xxxxxx001fd00003b9000306xxxxxx001fd10003b9000304xxxxxx001fd20003ca000300xxxxxx001fd3000390xxxxxx001fd60003b9000342xxxxxx001fd70003ca000342xxxxxx001fd8000399000306xxxxxx001fd9000399000304xxxxxx001fda000399000300xxxxxx001fdb00038axxxxxx001fdd001ffe000300xxxxxx001fde001ffe000301xxxxxx001fdf001ffe000342xxxxxx001fe00003c5000306xxxxxx001fe10003c5000304xxxxxx001fe20003cb000300xxxxxx001fe30003b0xxxxxx001fe40003c1000313xxxxxx001fe50003c1000314xxxxxx001fe60003c5000342xxxxxx001fe70003cb000342xxxxxx001fe80003a5000306xxxxxx001fe90003a5000304xxxxxx001fea0003a5000300xxxxxx001feb00038exxxxxx001fec0003a1000314xxxxxx001fed0000a8000300xxxxxx001fee000385xxxxxx001fef000060xxxxxx001ff2001f7c000345xxxxxx001ff30003c9000345xxxxxx001ff40003ce000345xxxxxx001ff60003c9000342xxxxxx001ff7001ff6000345xxxxxx001ff800039f000300xxxxxx001ff900038cxxxxxx001ffa0003a9000300xxxxxx001ffb00038fxxxxxx001ffc0003a9000345xxxxxx001ffd0000b4xxxxxx002000002002xxxxxx002001002003xxxxxx0021260003a9xxxxxx00212a00004bxxxxxx00212b0000c5xxxxxx00219a002190000338xxxxxx00219b002192000338xxxxxx0021ae002194000338xxxxxx0021cd0021d0000338xxxxxx0021ce0021d4000338xxxxxx0021cf0021d2000338xxxxxx002204002203000338xxxxxx002209002208000338xxxxxx00220c00220b000338xxxxxx002224002223000338xxxxxx002226002225000338xxxxxx00224100223c000338xxxxxx002244002243000338xxxxxx002247002245000338xxxxxx002249002248000338xxxxxx00226000003d000338xxxxxx002262002261000338xxxxxx00226d00224d000338xxxxxx00226e00003c000338xxxxxx00226f00003e000338xxxxxx002270002264000338xxxxxx002271002265000338xxxxxx002274002272000338xxxxxx002275002273000338xxxxxx002278002276000338xxxxxx002279002277000338xxxxxx00228000227a000338xxxxxx00228100227b000338xxxxxx002284002282000338xxxxxx002285002283000338xxxxxx002288002286000338xxxxxx002289002287000338xxxxxx0022ac0022a2000338xxxxxx0022ad0022a8000338xxxxxx0022ae0022a9000338xxxxxx0022af0022ab000338xxxxxx0022e000227c000338xxxxxx0022e100227d000338xxxxxx0022e2002291000338xxxxxx0022e3002292000338xxxxxx0022ea0022b2000338xxxxxx0022eb0022b3000338xxxxxx0022ec0022b4000338xxxxxx0022ed0022b5000338xxxxxx002329003008xxxxxx00232a003009xxxxxx002adc002add000338xxxxxx00304c00304b003099xxxxxx00304e00304d003099xxxxxx00305000304f003099xxxxxx003052003051003099xxxxxx003054003053003099xxxxxx003056003055003099xxxxxx003058003057003099xxxxxx00305a003059003099xxxxxx00305c00305b003099xxxxxx00305e00305d003099xxxxxx00306000305f003099xxxxxx003062003061003099xxxxxx003065003064003099xxxxxx003067003066003099xxxxxx003069003068003099xxxxxx00307000306f003099xxxxxx00307100306f00309axxxxxx003073003072003099xxxxxx00307400307200309axxxxxx003076003075003099xxxxxx00307700307500309axxxxxx003079003078003099xxxxxx00307a00307800309axxxxxx00307c00307b003099xxxxxx00307d00307b00309axxxxxx003094003046003099xxxxxx00309e00309d003099xxxxxx0030ac0030ab003099xxxxxx0030ae0030ad003099xxxxxx0030b00030af003099xxxxxx0030b20030b1003099xxxxxx0030b40030b3003099xxxxxx0030b60030b5003099xxxxxx0030b80030b7003099xxxxxx0030ba0030b9003099xxxxxx0030bc0030bb003099xxxxxx0030be0030bd003099xxxxxx0030c00030bf003099xxxxxx0030c20030c1003099xxxxxx0030c50030c4003099xxxxxx0030c70030c6003099xxxxxx0030c90030c8003099xxxxxx0030d00030cf003099xxxxxx0030d10030cf00309axxxxxx0030d30030d2003099xxxxxx0030d40030d200309axxxxxx0030d60030d5003099xxxxxx0030d70030d500309axxxxxx0030d90030d8003099xxxxxx0030da0030d800309axxxxxx0030dc0030db003099xxxxxx0030dd0030db00309axxxxxx0030f40030a6003099xxxxxx0030f70030ef003099xxxxxx0030f80030f0003099xxxxxx0030f90030f1003099xxxxxx0030fa0030f2003099xxxxxx0030fe0030fd003099xxxxxx00f900008c48xxxxxx00f9010066f4xxxxxx00f902008ecaxxxxxx00f903008cc8xxxxxx00f904006ed1xxxxxx00f905004e32xxxxxx00f9060053e5xxxxxx00f907009f9cxxxxxx00f908009f9cxxxxxx00f909005951xxxxxx00f90a0091d1xxxxxx00f90b005587xxxxxx00f90c005948xxxxxx00f90d0061f6xxxxxx00f90e007669xxxxxx00f90f007f85xxxxxx00f91000863fxxxxxx00f9110087baxxxxxx00f9120088f8xxxxxx00f91300908fxxxxxx00f914006a02xxxxxx00f915006d1bxxxxxx00f9160070d9xxxxxx00f9170073dexxxxxx00f91800843dxxxxxx00f91900916axxxxxx00f91a0099f1xxxxxx00f91b004e82xxxxxx00f91c005375xxxxxx00f91d006b04xxxxxx00f91e00721bxxxxxx00f91f00862dxxxxxx00f920009e1exxxxxx00f921005d50xxxxxx00f922006febxxxxxx00f9230085cdxxxxxx00f924008964xxxxxx00f9250062c9xxxxxx00f9260081d8xxxxxx00f92700881fxxxxxx00f928005ecaxxxxxx00f929006717xxxxxx00f92a006d6axxxxxx00f92b0072fcxxxxxx00f92c0090cexxxxxx00f92d004f86xxxxxx00f92e0051b7xxxxxx00f92f0052dexxxxxx00f9300064c4xxxxxx00f931006ad3xxxxxx00f932007210xxxxxx00f9330076e7xxxxxx00f934008001xxxxxx00f935008606xxxxxx00f93600865cxxxxxx00f937008defxxxxxx00f938009732xxxxxx00f939009b6fxxxxxx00f93a009dfaxxxxxx00f93b00788cxxxxxx00f93c00797fxxxxxx00f93d007da0xxxxxx00f93e0083c9xxxxxx00f93f009304xxxxxx00f940009e7fxxxxxx00f941008ad6xxxxxx00f9420058dfxxxxxx00f943005f04xxxxxx00f944007c60xxxxxx00f94500807exxxxxx00f946007262xxxxxx00f9470078caxxxxxx00f948008cc2xxxxxx00f9490096f7xxxxxx00f94a0058d8xxxxxx00f94b005c62xxxxxx00f94c006a13xxxxxx00f94d006ddaxxxxxx00f94e006f0fxxxxxx00f94f007d2fxxxxxx00f950007e37xxxxxx00f95100964bxxxxxx00f9520052d2xxxxxx00f95300808bxxxxxx00f9540051dcxxxxxx00f9550051ccxxxxxx00f956007a1cxxxxxx00f957007dbexxxxxx00f9580083f1xxxxxx00f959009675xxxxxx00f95a008b80xxxxxx00f95b0062cfxxxxxx00f95c006a02xxxxxx00f95d008afexxxxxx00f95e004e39xxxxxx00f95f005be7xxxxxx00f960006012xxxxxx00f961007387xxxxxx00f962007570xxxxxx00f963005317xxxxxx00f9640078fbxxxxxx00f965004fbfxxxxxx00f966005fa9xxxxxx00f967004e0dxxxxxx00f968006cccxxxxxx00f969006578xxxxxx00f96a007d22xxxxxx00f96b0053c3xxxxxx00f96c00585exxxxxx00f96d007701xxxxxx00f96e008449xxxxxx00f96f008aaaxxxxxx00f970006bbaxxxxxx00f971008fb0xxxxxx00f972006c88xxxxxx00f9730062fexxxxxx00f9740082e5xxxxxx00f9750063a0xxxxxx00f976007565xxxxxx00f977004eaexxxxxx00f978005169xxxxxx00f9790051c9xxxxxx00f97a006881xxxxxx00f97b007ce7xxxxxx00f97c00826fxxxxxx00f97d008ad2xxxxxx00f97e0091cfxxxxxx00f97f0052f5xxxxxx00f980005442xxxxxx00f981005973xxxxxx00f982005eecxxxxxx00f9830065c5xxxxxx00f984006ffexxxxxx00f98500792axxxxxx00f9860095adxxxxxx00f987009a6axxxxxx00f988009e97xxxxxx00f989009ecexxxxxx00f98a00529bxxxxxx00f98b0066c6xxxxxx00f98c006b77xxxxxx00f98d008f62xxxxxx00f98e005e74xxxxxx00f98f006190xxxxxx00f990006200xxxxxx00f99100649axxxxxx00f992006f23xxxxxx00f993007149xxxxxx00f994007489xxxxxx00f9950079caxxxxxx00f996007df4xxxxxx00f99700806fxxxxxx00f998008f26xxxxxx00f9990084eexxxxxx00f99a009023xxxxxx00f99b00934axxxxxx00f99c005217xxxxxx00f99d0052a3xxxxxx00f99e0054bdxxxxxx00f99f0070c8xxxxxx00f9a00088c2xxxxxx00f9a1008aaaxxxxxx00f9a2005ec9xxxxxx00f9a3005ff5xxxxxx00f9a400637bxxxxxx00f9a5006baexxxxxx00f9a6007c3exxxxxx00f9a7007375xxxxxx00f9a8004ee4xxxxxx00f9a90056f9xxxxxx00f9aa005be7xxxxxx00f9ab005dbaxxxxxx00f9ac00601cxxxxxx00f9ad0073b2xxxxxx00f9ae007469xxxxxx00f9af007f9axxxxxx00f9b0008046xxxxxx00f9b1009234xxxxxx00f9b20096f6xxxxxx00f9b3009748xxxxxx00f9b4009818xxxxxx00f9b5004f8bxxxxxx00f9b60079aexxxxxx00f9b70091b4xxxxxx00f9b80096b8xxxxxx00f9b90060e1xxxxxx00f9ba004e86xxxxxx00f9bb0050daxxxxxx00f9bc005beexxxxxx00f9bd005c3fxxxxxx00f9be006599xxxxxx00f9bf006a02xxxxxx00f9c00071cexxxxxx00f9c1007642xxxxxx00f9c20084fcxxxxxx00f9c300907cxxxxxx00f9c4009f8dxxxxxx00f9c5006688xxxxxx00f9c600962exxxxxx00f9c7005289xxxxxx00f9c800677bxxxxxx00f9c90067f3xxxxxx00f9ca006d41xxxxxx00f9cb006e9cxxxxxx00f9cc007409xxxxxx00f9cd007559xxxxxx00f9ce00786bxxxxxx00f9cf007d10xxxxxx00f9d000985exxxxxx00f9d100516dxxxxxx00f9d200622exxxxxx00f9d3009678xxxxxx00f9d400502bxxxxxx00f9d5005d19xxxxxx00f9d6006deaxxxxxx00f9d7008f2axxxxxx00f9d8005f8bxxxxxx00f9d9006144xxxxxx00f9da006817xxxxxx00f9db007387xxxxxx00f9dc009686xxxxxx00f9dd005229xxxxxx00f9de00540fxxxxxx00f9df005c65xxxxxx00f9e0006613xxxxxx00f9e100674exxxxxx00f9e20068a8xxxxxx00f9e3006ce5xxxxxx00f9e4007406xxxxxx00f9e50075e2xxxxxx00f9e6007f79xxxxxx00f9e70088cfxxxxxx00f9e80088e1xxxxxx00f9e90091ccxxxxxx00f9ea0096e2xxxxxx00f9eb00533fxxxxxx00f9ec006ebaxxxxxx00f9ed00541dxxxxxx00f9ee0071d0xxxxxx00f9ef007498xxxxxx00f9f00085faxxxxxx00f9f10096a3xxxxxx00f9f2009c57xxxxxx00f9f3009e9fxxxxxx00f9f4006797xxxxxx00f9f5006dcbxxxxxx00f9f60081e8xxxxxx00f9f7007acbxxxxxx00f9f8007b20xxxxxx00f9f9007c92xxxxxx00f9fa0072c0xxxxxx00f9fb007099xxxxxx00f9fc008b58xxxxxx00f9fd004ec0xxxxxx00f9fe008336xxxxxx00f9ff00523axxxxxx00fa00005207xxxxxx00fa01005ea6xxxxxx00fa020062d3xxxxxx00fa03007cd6xxxxxx00fa04005b85xxxxxx00fa05006d1exxxxxx00fa060066b4xxxxxx00fa07008f3bxxxxxx00fa0800884cxxxxxx00fa0900964dxxxxxx00fa0a00898bxxxxxx00fa0b005ed3xxxxxx00fa0c005140xxxxxx00fa0d0055c0xxxxxx00fa1000585axxxxxx00fa12006674xxxxxx00fa150051dexxxxxx00fa1600732axxxxxx00fa170076caxxxxxx00fa1800793cxxxxxx00fa1900795exxxxxx00fa1a007965xxxxxx00fa1b00798fxxxxxx00fa1c009756xxxxxx00fa1d007cbexxxxxx00fa1e007fbdxxxxxx00fa20008612xxxxxx00fa22008af8xxxxxx00fa25009038xxxxxx00fa260090fdxxxxxx00fa2a0098efxxxxxx00fa2b0098fcxxxxxx00fa2c009928xxxxxx00fa2d009db4xxxxxx00fa30004faexxxxxx00fa310050e7xxxxxx00fa3200514dxxxxxx00fa330052c9xxxxxx00fa340052e4xxxxxx00fa35005351xxxxxx00fa3600559dxxxxxx00fa37005606xxxxxx00fa38005668xxxxxx00fa39005840xxxxxx00fa3a0058a8xxxxxx00fa3b005c64xxxxxx00fa3c005c6exxxxxx00fa3d006094xxxxxx00fa3e006168xxxxxx00fa3f00618exxxxxx00fa400061f2xxxxxx00fa4100654fxxxxxx00fa420065e2xxxxxx00fa43006691xxxxxx00fa44006885xxxxxx00fa45006d77xxxxxx00fa46006e1axxxxxx00fa47006f22xxxxxx00fa4800716exxxxxx00fa4900722bxxxxxx00fa4a007422xxxxxx00fa4b007891xxxxxx00fa4c00793exxxxxx00fa4d007949xxxxxx00fa4e007948xxxxxx00fa4f007950xxxxxx00fa50007956xxxxxx00fa5100795dxxxxxx00fa5200798dxxxxxx00fa5300798exxxxxx00fa54007a40xxxxxx00fa55007a81xxxxxx00fa56007bc0xxxxxx00fa57007df4xxxxxx00fa58007e09xxxxxx00fa59007e41xxxxxx00fa5a007f72xxxxxx00fa5b008005xxxxxx00fa5c0081edxxxxxx00fa5d008279xxxxxx00fa5e008279xxxxxx00fa5f008457xxxxxx00fa60008910xxxxxx00fa61008996xxxxxx00fa62008b01xxxxxx00fa63008b39xxxxxx00fa64008cd3xxxxxx00fa65008d08xxxxxx00fa66008fb6xxxxxx00fa67009038xxxxxx00fa680096e3xxxxxx00fa690097ffxxxxxx00fa6a00983bxxxxxx00fa70004e26xxxxxx00fa710051b5xxxxxx00fa72005168xxxxxx00fa73004f80xxxxxx00fa74005145xxxxxx00fa75005180xxxxxx00fa760052c7xxxxxx00fa770052faxxxxxx00fa7800559dxxxxxx00fa79005555xxxxxx00fa7a005599xxxxxx00fa7b0055e2xxxxxx00fa7c00585axxxxxx00fa7d0058b3xxxxxx00fa7e005944xxxxxx00fa7f005954xxxxxx00fa80005a62xxxxxx00fa81005b28xxxxxx00fa82005ed2xxxxxx00fa83005ed9xxxxxx00fa84005f69xxxxxx00fa85005fadxxxxxx00fa860060d8xxxxxx00fa8700614exxxxxx00fa88006108xxxxxx00fa8900618exxxxxx00fa8a006160xxxxxx00fa8b0061f2xxxxxx00fa8c006234xxxxxx00fa8d0063c4xxxxxx00fa8e00641cxxxxxx00fa8f006452xxxxxx00fa90006556xxxxxx00fa91006674xxxxxx00fa92006717xxxxxx00fa9300671bxxxxxx00fa94006756xxxxxx00fa95006b79xxxxxx00fa96006bbaxxxxxx00fa97006d41xxxxxx00fa98006edbxxxxxx00fa99006ecbxxxxxx00fa9a006f22xxxxxx00fa9b00701exxxxxx00fa9c00716exxxxxx00fa9d0077a7xxxxxx00fa9e007235xxxxxx00fa9f0072afxxxxxx00faa000732axxxxxx00faa1007471xxxxxx00faa2007506xxxxxx00faa300753bxxxxxx00faa400761dxxxxxx00faa500761fxxxxxx00faa60076caxxxxxx00faa70076dbxxxxxx00faa80076f4xxxxxx00faa900774axxxxxx00faaa007740xxxxxx00faab0078ccxxxxxx00faac007ab1xxxxxx00faad007bc0xxxxxx00faae007c7bxxxxxx00faaf007d5bxxxxxx00fab0007df4xxxxxx00fab1007f3exxxxxx00fab2008005xxxxxx00fab3008352xxxxxx00fab40083efxxxxxx00fab5008779xxxxxx00fab6008941xxxxxx00fab7008986xxxxxx00fab8008996xxxxxx00fab9008abfxxxxxx00faba008af8xxxxxx00fabb008acbxxxxxx00fabc008b01xxxxxx00fabd008afexxxxxx00fabe008aedxxxxxx00fabf008b39xxxxxx00fac0008b8axxxxxx00fac1008d08xxxxxx00fac2008f38xxxxxx00fac3009072xxxxxx00fac4009199xxxxxx00fac5009276xxxxxx00fac600967cxxxxxx00fac70096e3xxxxxx00fac8009756xxxxxx00fac90097dbxxxxxx00faca0097ffxxxxxx00facb00980bxxxxxx00facc00983bxxxxxx00facd009b12xxxxxx00face009f9cxxxxxx00facf02284axxxxxx00fad0022844xxxxxx00fad10233d5xxxxxx00fad2003b9dxxxxxx00fad3004018xxxxxx00fad4004039xxxxxx00fad5025249xxxxxx00fad6025cd0xxxxxx00fad7027ed3xxxxxx00fad8009f43xxxxxx00fad9009f8exxxxxx00fb1d0005d90005b4xxxxxx00fb1f0005f20005b7xxxxxx00fb2a0005e90005c1xxxxxx00fb2b0005e90005c2xxxxxx00fb2c00fb490005c1xxxxxx00fb2d00fb490005c2xxxxxx00fb2e0005d00005b7xxxxxx00fb2f0005d00005b8xxxxxx00fb300005d00005bcxxxxxx00fb310005d10005bcxxxxxx00fb320005d20005bcxxxxxx00fb330005d30005bcxxxxxx00fb340005d40005bcxxxxxx00fb350005d50005bcxxxxxx00fb360005d60005bcxxxxxx00fb380005d80005bcxxxxxx00fb390005d90005bcxxxxxx00fb3a0005da0005bcxxxxxx00fb3b0005db0005bcxxxxxx00fb3c0005dc0005bcxxxxxx00fb3e0005de0005bcxxxxxx00fb400005e00005bcxxxxxx00fb410005e10005bcxxxxxx00fb430005e30005bcxxxxxx00fb440005e40005bcxxxxxx00fb460005e60005bcxxxxxx00fb470005e70005bcxxxxxx00fb480005e80005bcxxxxxx00fb490005e90005bcxxxxxx00fb4a0005ea0005bcxxxxxx00fb4b0005d50005b9xxxxxx00fb4c0005d10005bfxxxxxx00fb4d0005db0005bfxxxxxx00fb4e0005e40005bfxxxxxx01d15e01d15701d165xxxxxx01d15f01d15801d165xxxxxx01d16001d15f01d16exxxxxx01d16101d15f01d16fxxxxxx01d16201d15f01d170xxxxxx01d16301d15f01d171xxxxxx01d16401d15f01d172xxxxxx01d1bb01d1b901d165xxxxxx01d1bc01d1ba01d165xxxxxx01d1bd01d1bb01d16exxxxxx01d1be01d1bc01d16exxxxxx01d1bf01d1bb01d16fxxxxxx01d1c001d1bc01d16fxxxxxx02f800004e3dxxxxxx02f801004e38xxxxxx02f802004e41xxxxxx02f803020122xxxxxx02f804004f60xxxxxx02f805004faexxxxxx02f806004fbbxxxxxx02f807005002xxxxxx02f80800507axxxxxx02f809005099xxxxxx02f80a0050e7xxxxxx02f80b0050cfxxxxxx02f80c00349exxxxxx02f80d02063axxxxxx02f80e00514dxxxxxx02f80f005154xxxxxx02f810005164xxxxxx02f811005177xxxxxx02f81202051cxxxxxx02f8130034b9xxxxxx02f814005167xxxxxx02f81500518dxxxxxx02f81602054bxxxxxx02f817005197xxxxxx02f8180051a4xxxxxx02f819004eccxxxxxx02f81a0051acxxxxxx02f81b0051b5xxxxxx02f81c0291dfxxxxxx02f81d0051f5xxxxxx02f81e005203xxxxxx02f81f0034dfxxxxxx02f82000523bxxxxxx02f821005246xxxxxx02f822005272xxxxxx02f823005277xxxxxx02f824003515xxxxxx02f8250052c7xxxxxx02f8260052c9xxxxxx02f8270052e4xxxxxx02f8280052faxxxxxx02f829005305xxxxxx02f82a005306xxxxxx02f82b005317xxxxxx02f82c005349xxxxxx02f82d005351xxxxxx02f82e00535axxxxxx02f82f005373xxxxxx02f83000537dxxxxxx02f83100537fxxxxxx02f83200537fxxxxxx02f83300537fxxxxxx02f834020a2cxxxxxx02f835007070xxxxxx02f8360053caxxxxxx02f8370053dfxxxxxx02f838020b63xxxxxx02f8390053ebxxxxxx02f83a0053f1xxxxxx02f83b005406xxxxxx02f83c00549exxxxxx02f83d005438xxxxxx02f83e005448xxxxxx02f83f005468xxxxxx02f8400054a2xxxxxx02f8410054f6xxxxxx02f842005510xxxxxx02f843005553xxxxxx02f844005563xxxxxx02f845005584xxxxxx02f846005584xxxxxx02f847005599xxxxxx02f8480055abxxxxxx02f8490055b3xxxxxx02f84a0055c2xxxxxx02f84b005716xxxxxx02f84c005606xxxxxx02f84d005717xxxxxx02f84e005651xxxxxx02f84f005674xxxxxx02f850005207xxxxxx02f8510058eexxxxxx02f8520057cexxxxxx02f8530057f4xxxxxx02f85400580dxxxxxx02f85500578bxxxxxx02f856005832xxxxxx02f857005831xxxxxx02f8580058acxxxxxx02f8590214e4xxxxxx02f85a0058f2xxxxxx02f85b0058f7xxxxxx02f85c005906xxxxxx02f85d00591axxxxxx02f85e005922xxxxxx02f85f005962xxxxxx02f8600216a8xxxxxx02f8610216eaxxxxxx02f8620059ecxxxxxx02f863005a1bxxxxxx02f864005a27xxxxxx02f8650059d8xxxxxx02f866005a66xxxxxx02f8670036eexxxxxx02f8680036fcxxxxxx02f869005b08xxxxxx02f86a005b3exxxxxx02f86b005b3exxxxxx02f86c0219c8xxxxxx02f86d005bc3xxxxxx02f86e005bd8xxxxxx02f86f005be7xxxxxx02f870005bf3xxxxxx02f871021b18xxxxxx02f872005bffxxxxxx02f873005c06xxxxxx02f874005f53xxxxxx02f875005c22xxxxxx02f876003781xxxxxx02f877005c60xxxxxx02f878005c6exxxxxx02f879005cc0xxxxxx02f87a005c8dxxxxxx02f87b021de4xxxxxx02f87c005d43xxxxxx02f87d021de6xxxxxx02f87e005d6exxxxxx02f87f005d6bxxxxxx02f880005d7cxxxxxx02f881005de1xxxxxx02f882005de2xxxxxx02f88300382fxxxxxx02f884005dfdxxxxxx02f885005e28xxxxxx02f886005e3dxxxxxx02f887005e69xxxxxx02f888003862xxxxxx02f889022183xxxxxx02f88a00387cxxxxxx02f88b005eb0xxxxxx02f88c005eb3xxxxxx02f88d005eb6xxxxxx02f88e005ecaxxxxxx02f88f02a392xxxxxx02f890005efexxxxxx02f891022331xxxxxx02f892022331xxxxxx02f893008201xxxxxx02f894005f22xxxxxx02f895005f22xxxxxx02f8960038c7xxxxxx02f8970232b8xxxxxx02f8980261daxxxxxx02f899005f62xxxxxx02f89a005f6bxxxxxx02f89b0038e3xxxxxx02f89c005f9axxxxxx02f89d005fcdxxxxxx02f89e005fd7xxxxxx02f89f005ff9xxxxxx02f8a0006081xxxxxx02f8a100393axxxxxx02f8a200391cxxxxxx02f8a3006094xxxxxx02f8a40226d4xxxxxx02f8a50060c7xxxxxx02f8a6006148xxxxxx02f8a700614cxxxxxx02f8a800614exxxxxx02f8a900614cxxxxxx02f8aa00617axxxxxx02f8ab00618exxxxxx02f8ac0061b2xxxxxx02f8ad0061a4xxxxxx02f8ae0061afxxxxxx02f8af0061dexxxxxx02f8b00061f2xxxxxx02f8b10061f6xxxxxx02f8b2006210xxxxxx02f8b300621bxxxxxx02f8b400625dxxxxxx02f8b50062b1xxxxxx02f8b60062d4xxxxxx02f8b7006350xxxxxx02f8b8022b0cxxxxxx02f8b900633dxxxxxx02f8ba0062fcxxxxxx02f8bb006368xxxxxx02f8bc006383xxxxxx02f8bd0063e4xxxxxx02f8be022bf1xxxxxx02f8bf006422xxxxxx02f8c00063c5xxxxxx02f8c10063a9xxxxxx02f8c2003a2exxxxxx02f8c3006469xxxxxx02f8c400647exxxxxx02f8c500649dxxxxxx02f8c6006477xxxxxx02f8c7003a6cxxxxxx02f8c800654fxxxxxx02f8c900656cxxxxxx02f8ca02300axxxxxx02f8cb0065e3xxxxxx02f8cc0066f8xxxxxx02f8cd006649xxxxxx02f8ce003b19xxxxxx02f8cf006691xxxxxx02f8d0003b08xxxxxx02f8d1003ae4xxxxxx02f8d2005192xxxxxx02f8d3005195xxxxxx02f8d4006700xxxxxx02f8d500669cxxxxxx02f8d60080adxxxxxx02f8d70043d9xxxxxx02f8d8006717xxxxxx02f8d900671bxxxxxx02f8da006721xxxxxx02f8db00675exxxxxx02f8dc006753xxxxxx02f8dd0233c3xxxxxx02f8de003b49xxxxxx02f8df0067faxxxxxx02f8e0006785xxxxxx02f8e1006852xxxxxx02f8e2006885xxxxxx02f8e302346dxxxxxx02f8e400688exxxxxx02f8e500681fxxxxxx02f8e6006914xxxxxx02f8e7003b9dxxxxxx02f8e8006942xxxxxx02f8e90069a3xxxxxx02f8ea0069eaxxxxxx02f8eb006aa8xxxxxx02f8ec0236a3xxxxxx02f8ed006adbxxxxxx02f8ee003c18xxxxxx02f8ef006b21xxxxxx02f8f00238a7xxxxxx02f8f1006b54xxxxxx02f8f2003c4exxxxxx02f8f3006b72xxxxxx02f8f4006b9fxxxxxx02f8f5006bbaxxxxxx02f8f6006bbbxxxxxx02f8f7023a8dxxxxxx02f8f8021d0bxxxxxx02f8f9023afaxxxxxx02f8fa006c4exxxxxx02f8fb023cbcxxxxxx02f8fc006cbfxxxxxx02f8fd006ccdxxxxxx02f8fe006c67xxxxxx02f8ff006d16xxxxxx02f900006d3exxxxxx02f901006d77xxxxxx02f902006d41xxxxxx02f903006d69xxxxxx02f904006d78xxxxxx02f905006d85xxxxxx02f906023d1exxxxxx02f907006d34xxxxxx02f908006e2fxxxxxx02f909006e6exxxxxx02f90a003d33xxxxxx02f90b006ecbxxxxxx02f90c006ec7xxxxxx02f90d023ed1xxxxxx02f90e006df9xxxxxx02f90f006f6exxxxxx02f910023f5exxxxxx02f911023f8exxxxxx02f912006fc6xxxxxx02f913007039xxxxxx02f91400701exxxxxx02f91500701bxxxxxx02f916003d96xxxxxx02f91700704axxxxxx02f91800707dxxxxxx02f919007077xxxxxx02f91a0070adxxxxxx02f91b020525xxxxxx02f91c007145xxxxxx02f91d024263xxxxxx02f91e00719cxxxxxx02f91f0243abxxxxxx02f920007228xxxxxx02f921007235xxxxxx02f922007250xxxxxx02f923024608xxxxxx02f924007280xxxxxx02f925007295xxxxxx02f926024735xxxxxx02f927024814xxxxxx02f92800737axxxxxx02f92900738bxxxxxx02f92a003eacxxxxxx02f92b0073a5xxxxxx02f92c003eb8xxxxxx02f92d003eb8xxxxxx02f92e007447xxxxxx02f92f00745cxxxxxx02f930007471xxxxxx02f931007485xxxxxx02f9320074caxxxxxx02f933003f1bxxxxxx02f934007524xxxxxx02f935024c36xxxxxx02f93600753exxxxxx02f937024c92xxxxxx02f938007570xxxxxx02f93902219fxxxxxx02f93a007610xxxxxx02f93b024fa1xxxxxx02f93c024fb8xxxxxx02f93d025044xxxxxx02f93e003ffcxxxxxx02f93f004008xxxxxx02f9400076f4xxxxxx02f9410250f3xxxxxx02f9420250f2xxxxxx02f943025119xxxxxx02f944025133xxxxxx02f94500771exxxxxx02f94600771fxxxxxx02f94700771fxxxxxx02f94800774axxxxxx02f949004039xxxxxx02f94a00778bxxxxxx02f94b004046xxxxxx02f94c004096xxxxxx02f94d02541dxxxxxx02f94e00784exxxxxx02f94f00788cxxxxxx02f9500078ccxxxxxx02f9510040e3xxxxxx02f952025626xxxxxx02f953007956xxxxxx02f95402569axxxxxx02f9550256c5xxxxxx02f95600798fxxxxxx02f9570079ebxxxxxx02f95800412fxxxxxx02f959007a40xxxxxx02f95a007a4axxxxxx02f95b007a4fxxxxxx02f95c02597cxxxxxx02f95d025aa7xxxxxx02f95e025aa7xxxxxx02f95f007aeexxxxxx02f960004202xxxxxx02f961025babxxxxxx02f962007bc6xxxxxx02f963007bc9xxxxxx02f964004227xxxxxx02f965025c80xxxxxx02f966007cd2xxxxxx02f9670042a0xxxxxx02f968007ce8xxxxxx02f969007ce3xxxxxx02f96a007d00xxxxxx02f96b025f86xxxxxx02f96c007d63xxxxxx02f96d004301xxxxxx02f96e007dc7xxxxxx02f96f007e02xxxxxx02f970007e45xxxxxx02f971004334xxxxxx02f972026228xxxxxx02f973026247xxxxxx02f974004359xxxxxx02f9750262d9xxxxxx02f976007f7axxxxxx02f97702633exxxxxx02f978007f95xxxxxx02f979007ffaxxxxxx02f97a008005xxxxxx02f97b0264daxxxxxx02f97c026523xxxxxx02f97d008060xxxxxx02f97e0265a8xxxxxx02f97f008070xxxxxx02f98002335fxxxxxx02f9810043d5xxxxxx02f9820080b2xxxxxx02f983008103xxxxxx02f98400440bxxxxxx02f98500813exxxxxx02f986005ab5xxxxxx02f9870267a7xxxxxx02f9880267b5xxxxxx02f989023393xxxxxx02f98a02339cxxxxxx02f98b008201xxxxxx02f98c008204xxxxxx02f98d008f9exxxxxx02f98e00446bxxxxxx02f98f008291xxxxxx02f99000828bxxxxxx02f99100829dxxxxxx02f9920052b3xxxxxx02f9930082b1xxxxxx02f9940082b3xxxxxx02f9950082bdxxxxxx02f9960082e6xxxxxx02f997026b3cxxxxxx02f9980082e5xxxxxx02f99900831dxxxxxx02f99a008363xxxxxx02f99b0083adxxxxxx02f99c008323xxxxxx02f99d0083bdxxxxxx02f99e0083e7xxxxxx02f99f008457xxxxxx02f9a0008353xxxxxx02f9a10083caxxxxxx02f9a20083ccxxxxxx02f9a30083dcxxxxxx02f9a4026c36xxxxxx02f9a5026d6bxxxxxx02f9a6026cd5xxxxxx02f9a700452bxxxxxx02f9a80084f1xxxxxx02f9a90084f3xxxxxx02f9aa008516xxxxxx02f9ab0273caxxxxxx02f9ac008564xxxxxx02f9ad026f2cxxxxxx02f9ae00455dxxxxxx02f9af004561xxxxxx02f9b0026fb1xxxxxx02f9b10270d2xxxxxx02f9b200456bxxxxxx02f9b3008650xxxxxx02f9b400865cxxxxxx02f9b5008667xxxxxx02f9b6008669xxxxxx02f9b70086a9xxxxxx02f9b8008688xxxxxx02f9b900870exxxxxx02f9ba0086e2xxxxxx02f9bb008779xxxxxx02f9bc008728xxxxxx02f9bd00876bxxxxxx02f9be008786xxxxxx02f9bf0045d7xxxxxx02f9c00087e1xxxxxx02f9c1008801xxxxxx02f9c20045f9xxxxxx02f9c3008860xxxxxx02f9c4008863xxxxxx02f9c5027667xxxxxx02f9c60088d7xxxxxx02f9c70088dexxxxxx02f9c8004635xxxxxx02f9c90088faxxxxxx02f9ca0034bbxxxxxx02f9cb0278aexxxxxx02f9cc027966xxxxxx02f9cd0046bexxxxxx02f9ce0046c7xxxxxx02f9cf008aa0xxxxxx02f9d0008aedxxxxxx02f9d1008b8axxxxxx02f9d2008c55xxxxxx02f9d3027ca8xxxxxx02f9d4008cabxxxxxx02f9d5008cc1xxxxxx02f9d6008d1bxxxxxx02f9d7008d77xxxxxx02f9d8027f2fxxxxxx02f9d9020804xxxxxx02f9da008dcbxxxxxx02f9db008dbcxxxxxx02f9dc008df0xxxxxx02f9dd0208dexxxxxx02f9de008ed4xxxxxx02f9df008f38xxxxxx02f9e00285d2xxxxxx02f9e10285edxxxxxx02f9e2009094xxxxxx02f9e30090f1xxxxxx02f9e4009111xxxxxx02f9e502872exxxxxx02f9e600911bxxxxxx02f9e7009238xxxxxx02f9e80092d7xxxxxx02f9e90092d8xxxxxx02f9ea00927cxxxxxx02f9eb0093f9xxxxxx02f9ec009415xxxxxx02f9ed028bfaxxxxxx02f9ee00958bxxxxxx02f9ef004995xxxxxx02f9f00095b7xxxxxx02f9f1028d77xxxxxx02f9f20049e6xxxxxx02f9f30096c3xxxxxx02f9f4005db2xxxxxx02f9f5009723xxxxxx02f9f6029145xxxxxx02f9f702921axxxxxx02f9f8004a6exxxxxx02f9f9004a76xxxxxx02f9fa0097e0xxxxxx02f9fb02940axxxxxx02f9fc004ab2xxxxxx02f9fd029496xxxxxx02f9fe00980bxxxxxx02f9ff00980bxxxxxx02fa00009829xxxxxx02fa010295b6xxxxxx02fa020098e2xxxxxx02fa03004b33xxxxxx02fa04009929xxxxxx02fa050099a7xxxxxx02fa060099c2xxxxxx02fa070099fexxxxxx02fa08004bcexxxxxx02fa09029b30xxxxxx02fa0a009b12xxxxxx02fa0b009c40xxxxxx02fa0c009cfdxxxxxx02fa0d004ccexxxxxx02fa0e004cedxxxxxx02fa0f009d67xxxxxx02fa1002a0cexxxxxx02fa11004cf8xxxxxx02fa1202a105xxxxxx02fa1302a20exxxxxx02fa1402a291xxxxxx02fa15009ebbxxxxxx02fa16004d56xxxxxx02fa17009ef9xxxxxx02fa18009efexxxxxx02fa19009f05xxxxxx02fa1a009f0fxxxxxx02fa1b009f16xxxxxx02fa1c009f3bxxxxxx02fa1d02a600xxxxxx
|
@@ -0,0 +1 @@
|
|
1
|
+
00034000034100034300034400037400037e00038700095800095900095a00095b00095c00095d00095e00095f0009dc0009dd0009df000a33000a36000a59000a5a000a5b000a5e000b5c000b5d000f43000f4d000f52000f57000f5c000f69000f73000f75000f76000f78000f81000f93000f9d000fa2000fa7000fac000fb9001f71001f73001f75001f77001f79001f7b001f7d001fbb001fbe001fc9001fcb001fd3001fdb001fe3001feb001fee001fef001ff9001ffb001ffd00200000200100212600212a00212b00232900232a002adc00f90000f90100f90200f90300f90400f90500f90600f90700f90800f90900f90a00f90b00f90c00f90d00f90e00f90f00f91000f91100f91200f91300f91400f91500f91600f91700f91800f91900f91a00f91b00f91c00f91d00f91e00f91f00f92000f92100f92200f92300f92400f92500f92600f92700f92800f92900f92a00f92b00f92c00f92d00f92e00f92f00f93000f93100f93200f93300f93400f93500f93600f93700f93800f93900f93a00f93b00f93c00f93d00f93e00f93f00f94000f94100f94200f94300f94400f94500f94600f94700f94800f94900f94a00f94b00f94c00f94d00f94e00f94f00f95000f95100f95200f95300f95400f95500f95600f95700f95800f95900f95a00f95b00f95c00f95d00f95e00f95f00f96000f96100f96200f96300f96400f96500f96600f96700f96800f96900f96a00f96b00f96c00f96d00f96e00f96f00f97000f97100f97200f97300f97400f97500f97600f97700f97800f97900f97a00f97b00f97c00f97d00f97e00f97f00f98000f98100f98200f98300f98400f98500f98600f98700f98800f98900f98a00f98b00f98c00f98d00f98e00f98f00f99000f99100f99200f99300f99400f99500f99600f99700f99800f99900f99a00f99b00f99c00f99d00f99e00f99f00f9a000f9a100f9a200f9a300f9a400f9a500f9a600f9a700f9a800f9a900f9aa00f9ab00f9ac00f9ad00f9ae00f9af00f9b000f9b100f9b200f9b300f9b400f9b500f9b600f9b700f9b800f9b900f9ba00f9bb00f9bc00f9bd00f9be00f9bf00f9c000f9c100f9c200f9c300f9c400f9c500f9c600f9c700f9c800f9c900f9ca00f9cb00f9cc00f9cd00f9ce00f9cf00f9d000f9d100f9d200f9d300f9d400f9d500f9d600f9d700f9d800f9d900f9da00f9db00f9dc00f9dd00f9de00f9df00f9e000f9e100f9e200f9e300f9e400f9e500f9e600f9e700f9e800f9e900f9ea00f9eb00f9ec00f9ed00f9ee00f9ef00f9f000f9f100f9f200f9f300f9f400f9f500f9f600f9f700f9f800f9f900f9fa00f9fb00f9fc00f9fd00f9fe00f9ff00fa0000fa0100fa0200fa0300fa0400fa0500fa0600fa0700fa0800fa0900fa0a00fa0b00fa0c00fa0d00fa1000fa1200fa1500fa1600fa1700fa1800fa1900fa1a00fa1b00fa1c00fa1d00fa1e00fa2000fa2200fa2500fa2600fa2a00fa2b00fa2c00fa2d00fa3000fa3100fa3200fa3300fa3400fa3500fa3600fa3700fa3800fa3900fa3a00fa3b00fa3c00fa3d00fa3e00fa3f00fa4000fa4100fa4200fa4300fa4400fa4500fa4600fa4700fa4800fa4900fa4a00fa4b00fa4c00fa4d00fa4e00fa4f00fa5000fa5100fa5200fa5300fa5400fa5500fa5600fa5700fa5800fa5900fa5a00fa5b00fa5c00fa5d00fa5e00fa5f00fa6000fa6100fa6200fa6300fa6400fa6500fa6600fa6700fa6800fa6900fa6a00fa7000fa7100fa7200fa7300fa7400fa7500fa7600fa7700fa7800fa7900fa7a00fa7b00fa7c00fa7d00fa7e00fa7f00fa8000fa8100fa8200fa8300fa8400fa8500fa8600fa8700fa8800fa8900fa8a00fa8b00fa8c00fa8d00fa8e00fa8f00fa9000fa9100fa9200fa9300fa9400fa9500fa9600fa9700fa9800fa9900fa9a00fa9b00fa9c00fa9d00fa9e00fa9f00faa000faa100faa200faa300faa400faa500faa600faa700faa800faa900faaa00faab00faac00faad00faae00faaf00fab000fab100fab200fab300fab400fab500fab600fab700fab800fab900faba00fabb00fabc00fabd00fabe00fabf00fac000fac100fac200fac300fac400fac500fac600fac700fac800fac900faca00facb00facc00facd00face00facf00fad000fad100fad200fad300fad400fad500fad600fad700fad800fad900fb1d00fb1f00fb2a00fb2b00fb2c00fb2d00fb2e00fb2f00fb3000fb3100fb3200fb3300fb3400fb3500fb3600fb3800fb3900fb3a00fb3b00fb3c00fb3e00fb4000fb4100fb4300fb4400fb4600fb4700fb4800fb4900fb4a00fb4b00fb4c00fb4d00fb4e01d15e01d15f01d16001d16101d16201d16301d16401d1bb01d1bc01d1bd01d1be01d1bf01d1c002f80002f80102f80202f80302f80402f80502f80602f80702f80802f80902f80a02f80b02f80c02f80d02f80e02f80f02f81002f81102f81202f81302f81402f81502f81602f81702f81802f81902f81a02f81b02f81c02f81d02f81e02f81f02f82002f82102f82202f82302f82402f82502f82602f82702f82802f82902f82a02f82b02f82c02f82d02f82e02f82f02f83002f83102f83202f83302f83402f83502f83602f83702f83802f83902f83a02f83b02f83c02f83d02f83e02f83f02f84002f84102f84202f84302f84402f84502f84602f84702f84802f84902f84a02f84b02f84c02f84d02f84e02f84f02f85002f85102f85202f85302f85402f85502f85602f85702f85802f85902f85a02f85b02f85c02f85d02f85e02f85f02f86002f86102f86202f86302f86402f86502f86602f86702f86802f86902f86a02f86b02f86c02f86d02f86e02f86f02f87002f87102f87202f87302f87402f87502f87602f87702f87802f87902f87a02f87b02f87c02f87d02f87e02f87f02f88002f88102f88202f88302f88402f88502f88602f88702f88802f88902f88a02f88b02f88c02f88d02f88e02f88f02f89002f89102f89202f89302f89402f89502f89602f89702f89802f89902f89a02f89b02f89c02f89d02f89e02f89f02f8a002f8a102f8a202f8a302f8a402f8a502f8a602f8a702f8a802f8a902f8aa02f8ab02f8ac02f8ad02f8ae02f8af02f8b002f8b102f8b202f8b302f8b402f8b502f8b602f8b702f8b802f8b902f8ba02f8bb02f8bc02f8bd02f8be02f8bf02f8c002f8c102f8c202f8c302f8c402f8c502f8c602f8c702f8c802f8c902f8ca02f8cb02f8cc02f8cd02f8ce02f8cf02f8d002f8d102f8d202f8d302f8d402f8d502f8d602f8d702f8d802f8d902f8da02f8db02f8dc02f8dd02f8de02f8df02f8e002f8e102f8e202f8e302f8e402f8e502f8e602f8e702f8e802f8e902f8ea02f8eb02f8ec02f8ed02f8ee02f8ef02f8f002f8f102f8f202f8f302f8f402f8f502f8f602f8f702f8f802f8f902f8fa02f8fb02f8fc02f8fd02f8fe02f8ff02f90002f90102f90202f90302f90402f90502f90602f90702f90802f90902f90a02f90b02f90c02f90d02f90e02f90f02f91002f91102f91202f91302f91402f91502f91602f91702f91802f91902f91a02f91b02f91c02f91d02f91e02f91f02f92002f92102f92202f92302f92402f92502f92602f92702f92802f92902f92a02f92b02f92c02f92d02f92e02f92f02f93002f93102f93202f93302f93402f93502f93602f93702f93802f93902f93a02f93b02f93c02f93d02f93e02f93f02f94002f94102f94202f94302f94402f94502f94602f94702f94802f94902f94a02f94b02f94c02f94d02f94e02f94f02f95002f95102f95202f95302f95402f95502f95602f95702f95802f95902f95a02f95b02f95c02f95d02f95e02f95f02f96002f96102f96202f96302f96402f96502f96602f96702f96802f96902f96a02f96b02f96c02f96d02f96e02f96f02f97002f97102f97202f97302f97402f97502f97602f97702f97802f97902f97a02f97b02f97c02f97d02f97e02f97f02f98002f98102f98202f98302f98402f98502f98602f98702f98802f98902f98a02f98b02f98c02f98d02f98e02f98f02f99002f99102f99202f99302f99402f99502f99602f99702f99802f99902f99a02f99b02f99c02f99d02f99e02f99f02f9a002f9a102f9a202f9a302f9a402f9a502f9a602f9a702f9a802f9a902f9aa02f9ab02f9ac02f9ad02f9ae02f9af02f9b002f9b102f9b202f9b302f9b402f9b502f9b602f9b702f9b802f9b902f9ba02f9bb02f9bc02f9bd02f9be02f9bf02f9c002f9c102f9c202f9c302f9c402f9c502f9c602f9c702f9c802f9c902f9ca02f9cb02f9cc02f9cd02f9ce02f9cf02f9d002f9d102f9d202f9d302f9d402f9d502f9d602f9d702f9d802f9d902f9da02f9db02f9dc02f9dd02f9de02f9df02f9e002f9e102f9e202f9e302f9e402f9e502f9e602f9e702f9e802f9e902f9ea02f9eb02f9ec02f9ed02f9ee02f9ef02f9f002f9f102f9f202f9f302f9f402f9f502f9f602f9f702f9f802f9f902f9fa02f9fb02f9fc02f9fd02f9fe02f9ff02fa0002fa0102fa0202fa0302fa0402fa0502fa0602fa0702fa0802fa0902fa0a02fa0b02fa0c02fa0d02fa0e02fa0f02fa1002fa1102fa1202fa1302fa1402fa1502fa1602fa1702fa1802fa1902fa1a02fa1b02fa1c02fa1d
|
@@ -0,0 +1,66 @@
|
|
1
|
+
001100G
|
2
|
+
001101GG
|
3
|
+
001102N
|
4
|
+
001103D
|
5
|
+
001104DD
|
6
|
+
001105R
|
7
|
+
001106M
|
8
|
+
001107B
|
9
|
+
001108BB
|
10
|
+
001109S
|
11
|
+
00110aSS
|
12
|
+
00110cJ
|
13
|
+
00110dJJ
|
14
|
+
00110eC
|
15
|
+
00110fK
|
16
|
+
001110T
|
17
|
+
001111P
|
18
|
+
001112H
|
19
|
+
001161A
|
20
|
+
001162AE
|
21
|
+
001163YA
|
22
|
+
001164YAE
|
23
|
+
001165EO
|
24
|
+
001166E
|
25
|
+
001167YEO
|
26
|
+
001168YE
|
27
|
+
001169O
|
28
|
+
00116aWA
|
29
|
+
00116bWAE
|
30
|
+
00116cOE
|
31
|
+
00116dYO
|
32
|
+
00116eU
|
33
|
+
00116fWEO
|
34
|
+
001170WE
|
35
|
+
001171WI
|
36
|
+
001172YU
|
37
|
+
001173EU
|
38
|
+
001174YI
|
39
|
+
001175I
|
40
|
+
0011a8G
|
41
|
+
0011a9GG
|
42
|
+
0011aaGS
|
43
|
+
0011abN
|
44
|
+
0011acNJ
|
45
|
+
0011adNH
|
46
|
+
0011aeD
|
47
|
+
0011afL
|
48
|
+
0011b0LG
|
49
|
+
0011b1LM
|
50
|
+
0011b2LB
|
51
|
+
0011b3LS
|
52
|
+
0011b4LT
|
53
|
+
0011b5LP
|
54
|
+
0011b6LH
|
55
|
+
0011b7M
|
56
|
+
0011b8B
|
57
|
+
0011b9BS
|
58
|
+
0011baS
|
59
|
+
0011bbSS
|
60
|
+
0011bcNG
|
61
|
+
0011bdJ
|
62
|
+
0011beC
|
63
|
+
0011bfK
|
64
|
+
0011c0T
|
65
|
+
0011c1P
|
66
|
+
0011c2H
|
data/cdata/names
CHANGED
@@ -10969,8 +10969,6 @@
|
|
10969
10969
|
0033fdIDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY
|
10970
10970
|
0033feIDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE
|
10971
10971
|
0033ffSQUARE GAL
|
10972
|
-
003400<CJK Ideograph Extension A, First>
|
10973
|
-
004db5<CJK Ideograph Extension A, Last>
|
10974
10972
|
004dc0HEXAGRAM FOR THE CREATIVE HEAVEN
|
10975
10973
|
004dc1HEXAGRAM FOR THE RECEPTIVE EARTH
|
10976
10974
|
004dc2HEXAGRAM FOR DIFFICULTY AT THE BEGINNING
|
@@ -11035,8 +11033,6 @@
|
|
11035
11033
|
004dfdHEXAGRAM FOR SMALL PREPONDERANCE
|
11036
11034
|
004dfeHEXAGRAM FOR AFTER COMPLETION
|
11037
11035
|
004dffHEXAGRAM FOR BEFORE COMPLETION
|
11038
|
-
004e00<CJK Ideograph, First>
|
11039
|
-
009fc3<CJK Ideograph, Last>
|
11040
11036
|
00a000YI SYLLABLE IT
|
11041
11037
|
00a001YI SYLLABLE IX
|
11042
11038
|
00a002YI SYLLABLE I
|
@@ -13130,16 +13126,6 @@
|
|
13130
13126
|
00aa5dCHAM PUNCTUATION DANDA
|
13131
13127
|
00aa5eCHAM PUNCTUATION DOUBLE DANDA
|
13132
13128
|
00aa5fCHAM PUNCTUATION TRIPLE DANDA
|
13133
|
-
00ac00<Hangul Syllable, First>
|
13134
|
-
00d7a3<Hangul Syllable, Last>
|
13135
|
-
00d800<Non Private Use High Surrogate, First>
|
13136
|
-
00db7f<Non Private Use High Surrogate, Last>
|
13137
|
-
00db80<Private Use High Surrogate, First>
|
13138
|
-
00dbff<Private Use High Surrogate, Last>
|
13139
|
-
00dc00<Low Surrogate, First>
|
13140
|
-
00dfff<Low Surrogate, Last>
|
13141
|
-
00e000<Private Use, First>
|
13142
|
-
00f8ff<Private Use, Last>
|
13143
13129
|
00f900CJK COMPATIBILITY IDEOGRAPH-F900
|
13144
13130
|
00f901CJK COMPATIBILITY IDEOGRAPH-F901
|
13145
13131
|
00f902CJK COMPATIBILITY IDEOGRAPH-F902
|
@@ -18449,8 +18435,6 @@
|
|
18449
18435
|
01f091DOMINO TILE VERTICAL-06-04
|
18450
18436
|
01f092DOMINO TILE VERTICAL-06-05
|
18451
18437
|
01f093DOMINO TILE VERTICAL-06-06
|
18452
|
-
020000<CJK Ideograph Extension B, First>
|
18453
|
-
02a6d6<CJK Ideograph Extension B, Last>
|
18454
18438
|
02f800CJK COMPATIBILITY IDEOGRAPH-2F800
|
18455
18439
|
02f801CJK COMPATIBILITY IDEOGRAPH-2F801
|
18456
18440
|
02f802CJK COMPATIBILITY IDEOGRAPH-2F802
|
@@ -19330,7 +19314,3 @@
|
|
19330
19314
|
0e01edVARIATION SELECTOR-254
|
19331
19315
|
0e01eeVARIATION SELECTOR-255
|
19332
19316
|
0e01efVARIATION SELECTOR-256
|
19333
|
-
0f0000<Plane 15 Private Use, First>
|
19334
|
-
0ffffd<Plane 15 Private Use, Last>
|
19335
|
-
100000<Plane 16 Private Use, First>
|
19336
|
-
10fffd<Plane 16 Private Use, Last>
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require "unicode_utils/read_multivalued_map"
|
4
|
+
require "unicode_utils/hangul_syllable_decomposition"
|
5
|
+
require "unicode_utils/combining_class"
|
6
|
+
|
7
|
+
module UnicodeUtils
|
8
|
+
|
9
|
+
CANONICAL_DECOMPOSITION_MAP =
|
10
|
+
Impl.read_multivalued_map("canonical_decomposition_map") # :nodoc:
|
11
|
+
|
12
|
+
# Get the canonical decomposition of the given string, also called
|
13
|
+
# Normalization Form D or short NFD.
|
14
|
+
#
|
15
|
+
# The Unicode standard has multiple representations for some
|
16
|
+
# characters. One representation as a single codepoint and other
|
17
|
+
# representation(s) as a combination of multiple codepoints. This
|
18
|
+
# function "decomposes" these characters in +str+ into the latter
|
19
|
+
# representation.
|
20
|
+
#
|
21
|
+
# Example:
|
22
|
+
#
|
23
|
+
# # LATIN SMALL LETTER A WITH ACUTE => LATIN SMALL LETTER A, COMBINING ACUTE ACCENT
|
24
|
+
# UnicodeUtils.canonical_decomposition("\u{E1}") => "\u{61}\u{301}"
|
25
|
+
def canonical_decomposition(str)
|
26
|
+
res = String.new.force_encoding(str.encoding)
|
27
|
+
str.each_codepoint { |cp|
|
28
|
+
if cp >= 0xAC00 && cp <= 0xD7A3 # hangul syllable
|
29
|
+
Impl.append_hangul_syllable_decomposition(res, cp)
|
30
|
+
else
|
31
|
+
Impl.append_recursive_canonical_decomposition_mapping(res, cp)
|
32
|
+
end
|
33
|
+
}
|
34
|
+
Impl.put_into_canonical_order(res)
|
35
|
+
end
|
36
|
+
module_function :canonical_decomposition
|
37
|
+
|
38
|
+
module Impl # :nodoc:
|
39
|
+
|
40
|
+
def self.append_recursive_canonical_decomposition_mapping(str, cp)
|
41
|
+
mapping = CANONICAL_DECOMPOSITION_MAP[cp]
|
42
|
+
if mapping
|
43
|
+
mapping.each { |c|
|
44
|
+
append_recursive_canonical_decomposition_mapping(str, c)
|
45
|
+
}
|
46
|
+
else
|
47
|
+
str << cp
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.put_into_canonical_order(str)
|
52
|
+
reorder_needed = false
|
53
|
+
last_cp = nil
|
54
|
+
str.each_codepoint { |cp|
|
55
|
+
if last_cp
|
56
|
+
cc = COMBINING_CLASS_MAP[cp] || 0
|
57
|
+
if cc != 0
|
58
|
+
if (COMBINING_CLASS_MAP[last_cp] || 0) > cc
|
59
|
+
reorder_needed = true
|
60
|
+
break
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
last_cp = cp
|
65
|
+
}
|
66
|
+
return str unless reorder_needed
|
67
|
+
res = String.new.force_encoding(str.encoding)
|
68
|
+
last_cp = nil
|
69
|
+
str.each_codepoint { |cp|
|
70
|
+
if last_cp
|
71
|
+
cc = COMBINING_CLASS_MAP[cp] || 0
|
72
|
+
if cc != 0 && (COMBINING_CLASS_MAP[last_cp] || 0) > cc
|
73
|
+
res << cp
|
74
|
+
cp = nil
|
75
|
+
end
|
76
|
+
res << last_cp
|
77
|
+
end
|
78
|
+
last_cp = cp
|
79
|
+
}
|
80
|
+
res << last_cp if last_cp
|
81
|
+
put_into_canonical_order(res)
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require "unicode_utils/canonical_decomposition"
|
4
|
+
|
5
|
+
module UnicodeUtils
|
6
|
+
|
7
|
+
# The strings +a+ and +b+ are canonical equivalents if their
|
8
|
+
# canonical decompositions are equal.
|
9
|
+
#
|
10
|
+
# Example:
|
11
|
+
#
|
12
|
+
# UnicodeUtils.canonical_equivalents?("Äste", "A\u{308}ste") => true
|
13
|
+
# UnicodeUtils.canonical_equivalents?("Äste", "Aste") => false
|
14
|
+
def canonical_equivalents?(a, b)
|
15
|
+
UnicodeUtils.canonical_decomposition(a) ==
|
16
|
+
UnicodeUtils.canonical_decomposition(b)
|
17
|
+
end
|
18
|
+
module_function :canonical_equivalents?
|
19
|
+
|
20
|
+
end
|
@@ -7,9 +7,9 @@ require "unicode_utils/combining_class"
|
|
7
7
|
|
8
8
|
module UnicodeUtils
|
9
9
|
|
10
|
-
module Impl # :nodoc:
|
10
|
+
module Impl # :nodoc:all
|
11
11
|
|
12
|
-
class ConditionalCasing
|
12
|
+
class ConditionalCasing
|
13
13
|
|
14
14
|
attr_reader :mapping
|
15
15
|
|
@@ -23,7 +23,7 @@ module UnicodeUtils
|
|
23
23
|
|
24
24
|
end
|
25
25
|
|
26
|
-
class BeforeDotConditionalCasing < ConditionalCasing
|
26
|
+
class BeforeDotConditionalCasing < ConditionalCasing
|
27
27
|
|
28
28
|
def context_match?(str, pos)
|
29
29
|
(pos + 1).upto(str.length - 1) { |i|
|
@@ -37,7 +37,7 @@ module UnicodeUtils
|
|
37
37
|
|
38
38
|
end
|
39
39
|
|
40
|
-
class NotBeforeDotConditionalCasing < BeforeDotConditionalCasing
|
40
|
+
class NotBeforeDotConditionalCasing < BeforeDotConditionalCasing
|
41
41
|
|
42
42
|
def context_match?(str, pos)
|
43
43
|
!super
|
@@ -45,7 +45,7 @@ module UnicodeUtils
|
|
45
45
|
|
46
46
|
end
|
47
47
|
|
48
|
-
class MoreAboveConditionalCasing < ConditionalCasing
|
48
|
+
class MoreAboveConditionalCasing < ConditionalCasing
|
49
49
|
|
50
50
|
def context_match?(str, pos)
|
51
51
|
(pos + 1).upto(str.length - 1) { |i|
|
@@ -59,7 +59,7 @@ module UnicodeUtils
|
|
59
59
|
|
60
60
|
end
|
61
61
|
|
62
|
-
class AfterIConditionalCasing < ConditionalCasing
|
62
|
+
class AfterIConditionalCasing < ConditionalCasing
|
63
63
|
|
64
64
|
def context_match?(str, pos)
|
65
65
|
(pos - 1).downto(0) { |i|
|
@@ -73,7 +73,7 @@ module UnicodeUtils
|
|
73
73
|
|
74
74
|
end
|
75
75
|
|
76
|
-
class AfterSoftDottedConditionalCasing < ConditionalCasing
|
76
|
+
class AfterSoftDottedConditionalCasing < ConditionalCasing
|
77
77
|
|
78
78
|
def context_match?(str, pos)
|
79
79
|
(pos - 1).downto(0) { |i|
|
@@ -87,7 +87,7 @@ module UnicodeUtils
|
|
87
87
|
|
88
88
|
end
|
89
89
|
|
90
|
-
class FinalSigmaConditionalCasing < ConditionalCasing
|
90
|
+
class FinalSigmaConditionalCasing < ConditionalCasing
|
91
91
|
|
92
92
|
def context_match?(str, pos)
|
93
93
|
before_match?(str, pos) && !after_match?(str, pos)
|
@@ -1,12 +1,12 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
|
3
3
|
require "unicode_utils/simple_downcase"
|
4
|
-
require "unicode_utils/
|
4
|
+
require "unicode_utils/read_multivalued_map"
|
5
5
|
require "unicode_utils/conditional_casing"
|
6
6
|
|
7
7
|
module UnicodeUtils
|
8
8
|
|
9
|
-
SPECIAL_DOWNCASE_MAP = Impl.
|
9
|
+
SPECIAL_DOWNCASE_MAP = Impl.read_multivalued_map("special_lc_map") # :nodoc:
|
10
10
|
|
11
11
|
# Perform a full case-conversion of +str+ to lowercase according to
|
12
12
|
# the Unicode standard.
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module UnicodeUtils
|
4
|
+
|
5
|
+
# Derives the canonical decomposition of the given Hangul syllable.
|
6
|
+
#
|
7
|
+
# Example:
|
8
|
+
#
|
9
|
+
# UnicodeUtils.hangul_syllable_decomposition("\u{d4db}") => "\u{1111}\u{1171}\u{11b6}"
|
10
|
+
def hangul_syllable_decomposition(char)
|
11
|
+
Impl.append_hangul_syllable_decomposition(
|
12
|
+
String.new.force_encoding(char.encoding), char.ord)
|
13
|
+
end
|
14
|
+
module_function :hangul_syllable_decomposition
|
15
|
+
|
16
|
+
module Impl # :nodoc:
|
17
|
+
|
18
|
+
def self.append_hangul_syllable_decomposition(str, s)
|
19
|
+
# constants
|
20
|
+
sbase = 0xAC00
|
21
|
+
lbase = 0x1100
|
22
|
+
vbase = 0x1161
|
23
|
+
tbase = 0x11A7
|
24
|
+
scount = 11172
|
25
|
+
lcount = 19
|
26
|
+
vcount = 21
|
27
|
+
tcount = 28
|
28
|
+
ncount = vcount * tcount
|
29
|
+
|
30
|
+
sindex = s - sbase
|
31
|
+
if 0 <= sindex && sindex < scount
|
32
|
+
l = lbase + sindex / ncount
|
33
|
+
v = vbase + (sindex % ncount) / tcount
|
34
|
+
t = tbase + sindex % tcount
|
35
|
+
str << l << v
|
36
|
+
str << t if t != tbase
|
37
|
+
else
|
38
|
+
str << s
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require "unicode_utils/read_names"
|
4
|
+
|
5
|
+
module UnicodeUtils
|
6
|
+
|
7
|
+
JAMO_SHORT_NAME_MAP = Impl.read_names("jamo_short_names") # :nodoc:
|
8
|
+
|
9
|
+
# The the Jamo Short Name property of the given character (defaults
|
10
|
+
# to nil).
|
11
|
+
#
|
12
|
+
# Example:
|
13
|
+
#
|
14
|
+
# UnicodeUtils.jamo_short_name("\u{1101}") => "GG"
|
15
|
+
def jamo_short_name(char)
|
16
|
+
JAMO_SHORT_NAME_MAP[char.ord]
|
17
|
+
end
|
18
|
+
module_function :jamo_short_name
|
19
|
+
|
20
|
+
end
|
data/lib/unicode_utils/name.rb
CHANGED
@@ -1,33 +1,38 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
require "unicode_utils/read_names"
|
4
|
+
require "unicode_utils/hangul_syllable_decomposition"
|
5
|
+
require "unicode_utils/jamo_short_name"
|
6
6
|
|
7
|
-
|
8
|
-
path = File.join(File.dirname(__FILE__), "..", "..", "cdata", "names")
|
9
|
-
Hash.new.tap { |map|
|
10
|
-
File.open(path, "r:US-ASCII:-") do |input|
|
11
|
-
buffer = "x" * 6
|
12
|
-
buffer.force_encoding(Encoding::US_ASCII)
|
13
|
-
while input.read(6, buffer)
|
14
|
-
map[buffer.to_i(16)] = input.gets.tap { |x| x.chomp! }
|
15
|
-
end
|
16
|
-
end
|
17
|
-
}
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
7
|
+
module UnicodeUtils
|
21
8
|
|
22
|
-
NAME_MAP = Impl.read_names # :nodoc:
|
9
|
+
NAME_MAP = Impl.read_names("names") # :nodoc:
|
23
10
|
|
24
|
-
# Get the Unicode name of the
|
11
|
+
# Get the normative Unicode name of the given character.
|
12
|
+
#
|
13
|
+
# Private Use codepoints have no name, this function returns nil for
|
14
|
+
# such codepoints.
|
15
|
+
#
|
16
|
+
# All control characters have the special name "<control>". All
|
17
|
+
# other characters have a unique name.
|
25
18
|
#
|
26
19
|
# Example:
|
27
20
|
#
|
28
21
|
# UnicodeUtils.name "ᾀ" => "GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI"
|
29
|
-
|
30
|
-
|
22
|
+
# UnicodeUtils.name "\t" => "<control>"
|
23
|
+
def name(char)
|
24
|
+
cp = char.ord
|
25
|
+
NAME_MAP[cp] ||
|
26
|
+
case cp
|
27
|
+
when 0x3400..0x4DB5, 0x4E00..0x9FC3, 0x20000..0x2A6D6
|
28
|
+
"CJK UNIFIED IDEOGRAPH-#{sprintf('%04x', cp).upcase}"
|
29
|
+
when 0xAC00..0xD7A3
|
30
|
+
"HANGUL SYLLABLE ".tap do |n|
|
31
|
+
hangul_syllable_decomposition(char).each_char { |c|
|
32
|
+
n << (jamo_short_name(c) || '')
|
33
|
+
}
|
34
|
+
end
|
35
|
+
end
|
31
36
|
end
|
32
37
|
module_function :name
|
33
38
|
|
@@ -0,0 +1,142 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require "unicode_utils/canonical_decomposition"
|
4
|
+
require "unicode_utils/combining_class"
|
5
|
+
require "unicode_utils/read_codepoint_set"
|
6
|
+
|
7
|
+
module UnicodeUtils
|
8
|
+
|
9
|
+
module Impl # :nodoc:all
|
10
|
+
|
11
|
+
COMPOSITION_EXCLUSION_SET =
|
12
|
+
Impl.read_codepoint_set("composition_exclusion_set")
|
13
|
+
|
14
|
+
CANONICAL_COMPOSITION_MAP = Hash.new.tap do |m|
|
15
|
+
CANONICAL_DECOMPOSITION_MAP.each_pair { |comp, decomp|
|
16
|
+
if decomp.length == 2
|
17
|
+
(m[decomp[0]] ||= {})[decomp[1]] = comp
|
18
|
+
end
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
module NFC
|
23
|
+
|
24
|
+
def self.starter?(cp)
|
25
|
+
(COMBINING_CLASS_MAP[cp] || 0) == 0
|
26
|
+
end
|
27
|
+
|
28
|
+
# does b block c?
|
29
|
+
def self.blocked?(b, c)
|
30
|
+
# From the standard:
|
31
|
+
# "If a combining character sequence is in canonical order,
|
32
|
+
# then testing whether a character is blocked requires looking
|
33
|
+
# at only the immediately preceding character."
|
34
|
+
# cpary is in canonical order (since it comes out of
|
35
|
+
# canonical_decomposition).
|
36
|
+
(COMBINING_CLASS_MAP[b] || 0) >= (COMBINING_CLASS_MAP[c] || 0)
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.primary_composite?(cp)
|
40
|
+
unless CANONICAL_DECOMPOSITION_MAP[cp] ||
|
41
|
+
# has hangul syllable decomposition?
|
42
|
+
(cp >= 0xAC00 && cp <= 0xD7A3)
|
43
|
+
return false
|
44
|
+
end
|
45
|
+
!COMPOSITION_EXCLUSION_SET.include?(cp)
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
# Get +str+ in Normalization Form C.
|
53
|
+
#
|
54
|
+
# The Unicode standard has multiple representations for some
|
55
|
+
# characters. One representation as a single codepoint and other
|
56
|
+
# representation(s) as a combination of multiple codepoints. This
|
57
|
+
# function "composes" these characters into the former
|
58
|
+
# representation.
|
59
|
+
#
|
60
|
+
# Example:
|
61
|
+
#
|
62
|
+
# UnicodeUtils.nfc("La\u{308}mpchen") => "Lämpchen"
|
63
|
+
def nfc(str)
|
64
|
+
str = UnicodeUtils.canonical_decomposition(str)
|
65
|
+
|
66
|
+
### constants for hangul composition ###
|
67
|
+
sbase = 0xAC00
|
68
|
+
lbase = 0x1100
|
69
|
+
vbase = 0x1161
|
70
|
+
tbase = 0x11A7
|
71
|
+
lcount = 19
|
72
|
+
vcount = 21
|
73
|
+
tcount = 28
|
74
|
+
ncount = vcount * tcount
|
75
|
+
scount = lcount * ncount
|
76
|
+
########################################
|
77
|
+
|
78
|
+
String.new.force_encoding(str.encoding).tap do |res|
|
79
|
+
last_starter = nil
|
80
|
+
uncomposable_non_starters = []
|
81
|
+
str.each_codepoint { |cp|
|
82
|
+
if Impl::NFC.starter?(cp)
|
83
|
+
combined = false
|
84
|
+
if last_starter && uncomposable_non_starters.empty?
|
85
|
+
### hangul ###
|
86
|
+
lindex = last_starter - lbase
|
87
|
+
if 0 <= lindex && lindex < lcount
|
88
|
+
vindex = cp - vbase
|
89
|
+
if 0 <= vindex && vindex <= vcount
|
90
|
+
last_starter =
|
91
|
+
sbase + (lindex * vcount + vindex) * tcount
|
92
|
+
combined = true
|
93
|
+
end
|
94
|
+
end
|
95
|
+
unless combined
|
96
|
+
sindex = last_starter - sbase
|
97
|
+
if 0 <= sindex && sindex < scount && (sindex % tcount) == 0
|
98
|
+
tindex = cp - tbase
|
99
|
+
if 0 <= tindex && tindex < tcount
|
100
|
+
last_starter += tindex
|
101
|
+
combined = true
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
##############
|
106
|
+
unless combined
|
107
|
+
map = Impl::CANONICAL_COMPOSITION_MAP[last_starter]
|
108
|
+
composition = map && map[cp]
|
109
|
+
if composition && Impl::NFC.primary_composite?(composition)
|
110
|
+
last_starter = composition
|
111
|
+
combined = true
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
unless combined
|
116
|
+
res << last_starter if last_starter
|
117
|
+
uncomposable_non_starters.each { |nc| res << nc }
|
118
|
+
uncomposable_non_starters.clear
|
119
|
+
last_starter = cp
|
120
|
+
end
|
121
|
+
else
|
122
|
+
last_non_starter = uncomposable_non_starters.last
|
123
|
+
if last_non_starter && Impl::NFC.blocked?(last_non_starter, cp)
|
124
|
+
uncomposable_non_starters << cp
|
125
|
+
else
|
126
|
+
map = Impl::CANONICAL_COMPOSITION_MAP[last_starter]
|
127
|
+
composition = map && map[cp]
|
128
|
+
if composition && Impl::NFC.primary_composite?(composition)
|
129
|
+
last_starter = composition
|
130
|
+
else
|
131
|
+
uncomposable_non_starters << cp
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
}
|
136
|
+
res << last_starter if last_starter
|
137
|
+
uncomposable_non_starters.each { |nc| res << nc }
|
138
|
+
end
|
139
|
+
end
|
140
|
+
module_function :nfc
|
141
|
+
|
142
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require "unicode_utils/canonical_decomposition"
|
4
|
+
|
5
|
+
module UnicodeUtils
|
6
|
+
|
7
|
+
# Get +str+ in Normalization Form D.
|
8
|
+
#
|
9
|
+
# Alias for UnicodeUtils.canonical_decomposition.
|
10
|
+
def nfd(str)
|
11
|
+
UnicodeUtils.canonical_decomposition(str)
|
12
|
+
end
|
13
|
+
module_function :nfd
|
14
|
+
|
15
|
+
end
|
@@ -4,7 +4,7 @@ module UnicodeUtils
|
|
4
4
|
|
5
5
|
module Impl # :nodoc:
|
6
6
|
|
7
|
-
def self.
|
7
|
+
def self.read_multivalued_map(filename)
|
8
8
|
path = File.join(File.dirname(__FILE__), "..", "..", "cdata", filename)
|
9
9
|
Hash.new.tap { |map|
|
10
10
|
File.open(path, "r:US-ASCII:-") do |input|
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module UnicodeUtils
|
4
|
+
|
5
|
+
module Impl # :nodoc:
|
6
|
+
|
7
|
+
def self.read_names(filename)
|
8
|
+
path = File.join(File.dirname(__FILE__), "..", "..", "cdata", filename)
|
9
|
+
Hash.new.tap { |map|
|
10
|
+
File.open(path, "r:US-ASCII:-") do |input|
|
11
|
+
buffer = "x" * 6
|
12
|
+
buffer.force_encoding(Encoding::US_ASCII)
|
13
|
+
while input.read(6, buffer)
|
14
|
+
map[buffer.to_i(16)] = input.gets.tap { |x| x.chomp! }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
data/lib/unicode_utils/upcase.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
|
3
3
|
require "unicode_utils/simple_upcase"
|
4
|
-
require "unicode_utils/
|
4
|
+
require "unicode_utils/read_multivalued_map"
|
5
5
|
require "unicode_utils/conditional_casing"
|
6
6
|
|
7
7
|
module UnicodeUtils
|
8
8
|
|
9
|
-
SPECIAL_UPCASE_MAP = Impl.
|
9
|
+
SPECIAL_UPCASE_MAP = Impl.read_multivalued_map("special_uc_map") # :nodoc:
|
10
10
|
|
11
11
|
# Perform a full case-conversion of +str+ to uppercase according to
|
12
12
|
# the Unicode standard.
|
data/lib/unicode_utils.rb
CHANGED
@@ -13,3 +13,21 @@ require "unicode_utils/cased_char_q"
|
|
13
13
|
require "unicode_utils/case_ignorable_char_q"
|
14
14
|
require "unicode_utils/soft_dotted_char_q"
|
15
15
|
require "unicode_utils/combining_class"
|
16
|
+
require "unicode_utils/hangul_syllable_decomposition"
|
17
|
+
require "unicode_utils/jamo_short_name"
|
18
|
+
require "unicode_utils/canonical_decomposition"
|
19
|
+
require "unicode_utils/nfd"
|
20
|
+
require "unicode_utils/canonical_equivalents_q"
|
21
|
+
require "unicode_utils/nfc"
|
22
|
+
|
23
|
+
# Read the README[link:files/README_txt.html] for an introduction.
|
24
|
+
#
|
25
|
+
# Highlevel functions are:
|
26
|
+
#
|
27
|
+
# UnicodeUtils.upcase:: full conversion to uppercase
|
28
|
+
# UnicodeUtils.downcase:: full conversion to lowercase
|
29
|
+
# UnicodeUtils.nfd:: Normalization Form D
|
30
|
+
# UnicodeUtils.nfc:: Normalization Form C
|
31
|
+
# UnicodeUtils.name:: character names
|
32
|
+
module UnicodeUtils
|
33
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require "test/unit"
|
4
|
+
|
5
|
+
require "unicode_utils/nfd"
|
6
|
+
require "unicode_utils/nfc"
|
7
|
+
|
8
|
+
# See data/NormalizationTest.txt
|
9
|
+
class TestNormalization < Test::Unit::TestCase
|
10
|
+
|
11
|
+
class Record
|
12
|
+
def initialize(ary)
|
13
|
+
@ary = ary
|
14
|
+
end
|
15
|
+
def c1
|
16
|
+
@ary[0]
|
17
|
+
end
|
18
|
+
def c2
|
19
|
+
@ary[1]
|
20
|
+
end
|
21
|
+
def c3
|
22
|
+
@ary[2]
|
23
|
+
end
|
24
|
+
def c4
|
25
|
+
@ary[3]
|
26
|
+
end
|
27
|
+
def c5
|
28
|
+
@ary[4]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def each_testdata_record
|
33
|
+
fn = File.join(File.dirname(__FILE__),
|
34
|
+
"..", "data", "NormalizationTest.txt")
|
35
|
+
File.open(fn, "r:utf-8:-") do |input|
|
36
|
+
input.each_line { |line|
|
37
|
+
if line =~ /^([^#]*)#/
|
38
|
+
line = $1
|
39
|
+
end
|
40
|
+
line.strip!
|
41
|
+
next if line.empty? || line =~ /^@Part/
|
42
|
+
columns = line.split(";")
|
43
|
+
ary = columns.map { |column|
|
44
|
+
String.new.force_encoding(Encoding::UTF_8).tap do |str|
|
45
|
+
column.split(" ").each { |c|
|
46
|
+
str << c.strip.to_i(16)
|
47
|
+
}
|
48
|
+
end
|
49
|
+
}
|
50
|
+
yield Record.new(ary)
|
51
|
+
}
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_nfd
|
56
|
+
each_testdata_record { |r|
|
57
|
+
assert_equal r.c3, UnicodeUtils.nfd(r.c1)
|
58
|
+
assert_equal r.c3, UnicodeUtils.nfd(r.c2)
|
59
|
+
assert_equal r.c3, UnicodeUtils.nfd(r.c3)
|
60
|
+
assert_equal r.c5, UnicodeUtils.nfd(r.c4)
|
61
|
+
assert_equal r.c5, UnicodeUtils.nfd(r.c5)
|
62
|
+
}
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_nfc
|
66
|
+
each_testdata_record { |r|
|
67
|
+
assert_equal r.c2, UnicodeUtils.nfc(r.c1)
|
68
|
+
assert_equal r.c2, UnicodeUtils.nfc(r.c2)
|
69
|
+
assert_equal r.c2, UnicodeUtils.nfc(r.c3)
|
70
|
+
assert_equal r.c4, UnicodeUtils.nfc(r.c4)
|
71
|
+
assert_equal r.c4, UnicodeUtils.nfc(r.c5)
|
72
|
+
}
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
data/test/test_unicode_utils.rb
CHANGED
@@ -9,6 +9,12 @@ class TestUnicodeUtils < Test::Unit::TestCase
|
|
9
9
|
def test_name
|
10
10
|
assert_equal "LATIN SMALL LETTER F", UnicodeUtils.name("f")
|
11
11
|
assert_equal Encoding::US_ASCII, UnicodeUtils.name("f").encoding
|
12
|
+
assert_equal nil, UnicodeUtils.name("\u{e000}") # private use
|
13
|
+
assert_equal "<control>", UnicodeUtils.name("\t")
|
14
|
+
assert_equal "CJK UNIFIED IDEOGRAPH-4E00", UnicodeUtils.name("\u{4e00}")
|
15
|
+
assert_equal "CJK UNIFIED IDEOGRAPH-2A6D6", UnicodeUtils.name("\u{2a6d6}")
|
16
|
+
assert_equal "CJK UNIFIED IDEOGRAPH-2A3D6", UnicodeUtils.name("\u{2a3d6}")
|
17
|
+
assert_equal "HANGUL SYLLABLE PWILH", UnicodeUtils.name("\u{d4db}")
|
12
18
|
end
|
13
19
|
|
14
20
|
def test_simple_upcase
|
@@ -104,4 +110,32 @@ class TestUnicodeUtils < Test::Unit::TestCase
|
|
104
110
|
assert_equal false, UnicodeUtils.soft_dotted_char?("a")
|
105
111
|
end
|
106
112
|
|
113
|
+
def test_hangul_syllable_decomposition
|
114
|
+
assert_equal "\u{1111}\u{1171}\u{11b6}", UnicodeUtils.hangul_syllable_decomposition("\u{d4db}")
|
115
|
+
end
|
116
|
+
|
117
|
+
def test_jamo_short_name
|
118
|
+
assert_equal "GG", UnicodeUtils.jamo_short_name("\u{1101}")
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_canonical_decomposition
|
122
|
+
assert_equal "\u{61}\u{301}",
|
123
|
+
UnicodeUtils.canonical_decomposition("\u{E1}")
|
124
|
+
assert_equal "\u{61}\u{301}\u{63}\u{327}\u{301}",
|
125
|
+
UnicodeUtils.canonical_decomposition("\u{e1}\u{63}\u{301}\u{327}")
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_nfd
|
129
|
+
assert_equal "\u{61}\u{301}", UnicodeUtils.nfd("\u{E1}")
|
130
|
+
end
|
131
|
+
|
132
|
+
def test_canonical_equivalents?
|
133
|
+
assert_equal true, UnicodeUtils.canonical_equivalents?("Äste", "A\u{308}ste")
|
134
|
+
assert_equal false, UnicodeUtils.canonical_equivalents?("Äste", "Aste")
|
135
|
+
end
|
136
|
+
|
137
|
+
def test_nfc
|
138
|
+
assert_equal "Häschen", UnicodeUtils.nfc("Ha\u{308}schen")
|
139
|
+
end
|
140
|
+
|
107
141
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: unicode_utils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stefan Lang
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-11-
|
12
|
+
date: 2008-11-16 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -22,20 +22,27 @@ extensions: []
|
|
22
22
|
extra_rdoc_files:
|
23
23
|
- README.txt
|
24
24
|
files:
|
25
|
-
- lib/unicode_utils/read_special_casing_map.rb
|
26
25
|
- lib/unicode_utils/conditional_casing.rb
|
26
|
+
- lib/unicode_utils/hangul_syllable_decomposition.rb
|
27
27
|
- lib/unicode_utils/simple_downcase.rb
|
28
28
|
- lib/unicode_utils/read_codepoint_map.rb
|
29
|
+
- lib/unicode_utils/read_names.rb
|
29
30
|
- lib/unicode_utils/read_codepoint_set.rb
|
30
31
|
- lib/unicode_utils/titlecase_char_q.rb
|
31
32
|
- lib/unicode_utils/cased_char_q.rb
|
32
33
|
- lib/unicode_utils/downcase.rb
|
33
34
|
- lib/unicode_utils/name.rb
|
34
35
|
- lib/unicode_utils/uppercase_char_q.rb
|
36
|
+
- lib/unicode_utils/read_multivalued_map.rb
|
37
|
+
- lib/unicode_utils/canonical_equivalents_q.rb
|
38
|
+
- lib/unicode_utils/canonical_decomposition.rb
|
35
39
|
- lib/unicode_utils/upcase.rb
|
40
|
+
- lib/unicode_utils/nfc.rb
|
41
|
+
- lib/unicode_utils/nfd.rb
|
36
42
|
- lib/unicode_utils/case_ignorable_char_q.rb
|
37
43
|
- lib/unicode_utils/simple_upcase.rb
|
38
44
|
- lib/unicode_utils/lowercase_char_q.rb
|
45
|
+
- lib/unicode_utils/jamo_short_name.rb
|
39
46
|
- lib/unicode_utils/combining_class.rb
|
40
47
|
- lib/unicode_utils/version.rb
|
41
48
|
- lib/unicode_utils/soft_dotted_char_q.rb
|
@@ -48,11 +55,15 @@ files:
|
|
48
55
|
- cdata/names
|
49
56
|
- cdata/cond_uc_map
|
50
57
|
- cdata/special_uc_map
|
58
|
+
- cdata/canonical_decomposition_map
|
51
59
|
- cdata/soft_dotted_set
|
52
60
|
- cdata/simple_lc_map
|
53
61
|
- cdata/case_ignorable_set
|
62
|
+
- cdata/composition_exclusion_set
|
54
63
|
- cdata/simple_uc_map
|
64
|
+
- cdata/jamo_short_names
|
55
65
|
- cdata/prop_set_uppercase
|
66
|
+
- test/test_normalization.rb
|
56
67
|
- test/test_unicode_utils.rb
|
57
68
|
- README.txt
|
58
69
|
- LICENSE.txt
|
@@ -78,10 +89,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
78
89
|
version:
|
79
90
|
requirements: []
|
80
91
|
|
81
|
-
rubyforge_project:
|
92
|
+
rubyforge_project: unicode-utils
|
82
93
|
rubygems_version: 1.3.1
|
83
94
|
signing_key:
|
84
95
|
specification_version: 2
|
85
96
|
summary: additional Unicode aware functions for Ruby 1.9
|
86
97
|
test_files:
|
98
|
+
- test/test_normalization.rb
|
87
99
|
- test/test_unicode_utils.rb
|