jpmobile 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (23) hide show
  1. data/VERSION.yml +1 -1
  2. data/lib/jpmobile/rack/params_filter.rb +1 -1
  3. data/test/rails/rails_root/app/models/mobile_mailer.rb +18 -0
  4. data/test/rails/rails_root/config/initializers/secret_token.rb +1 -1
  5. data/test/rails/rails_root/spec/models/mobile_mailer_spec.rb +744 -0
  6. data/test/rails/rails_root/spec/spec_helper.rb +6 -0
  7. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile.rb +2 -0
  8. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/email.rb +17 -2
  9. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/emoticon.rb +85 -23
  10. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/emoticon/au.rb +644 -0
  11. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/emoticon/softbank.rb +488 -0
  12. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/emoticon/z_combine.rb +16 -13
  13. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/hook_action_mailer.rb +22 -0
  14. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mail.rb +265 -0
  15. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/abstract_mobile.rb +35 -0
  16. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/au.rb +28 -2
  17. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/docomo.rb +24 -1
  18. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/emobile.rb +1 -1
  19. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/softbank.rb +34 -1
  20. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/vodafone.rb +1 -1
  21. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/willcom.rb +1 -1
  22. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/util.rb +214 -13
  23. metadata +11 -3
@@ -27,6 +27,12 @@ RSpec.configure do |config|
27
27
  config.include Webrat::HaveTagMatcher
28
28
  config.include Jpmobile::Util
29
29
  config.before(:each) { Webrat.configuration.mode = :rails }
30
+
31
+ config.filter_run :focus => true
32
+ config.run_all_when_everything_filtered = true
33
+ config.color_enabled = true
34
+ config.filter_run_excluding :broken => true
35
+ config.full_backtrace = true
30
36
  end
31
37
 
32
38
  require 'pp'
@@ -49,6 +49,8 @@ module Jpmobile
49
49
  autoload :Config, 'jpmobile/rack/config'
50
50
  end
51
51
  autoload :Configuration, 'jpmobile/rack'
52
+
53
+ autoload :Mailer, 'jpmobile/hook_action_mailer'
52
54
  end
53
55
 
54
56
  if defined?(Rails)
@@ -4,13 +4,28 @@
4
4
  module Jpmobile
5
5
  # email関連の処理
6
6
  module Email
7
+ module_function
8
+
7
9
  # メールアドレスよりキャリア情報を取得する
8
10
  # _param1_:: email メールアドレス
9
11
  # return :: Jpmobile::Mobileで定義されている携帯キャリアクラス
10
- def self.detect(email)
12
+ def detect(email)
11
13
  Mobile.carriers.each do |const|
12
14
  c = Mobile.const_get(const)
13
- return c if c::MAIL_ADDRESS_REGEXP && email =~ c::MAIL_ADDRESS_REGEXP
15
+ return c if c::MAIL_ADDRESS_REGEXP && email.match(/^#{c::MAIL_ADDRESS_REGEXP}$/)
16
+ end
17
+ nil
18
+ end
19
+
20
+ # 含まれているメールアドレスからキャリア情報を取得する
21
+ def detect_from_mail_header(str)
22
+ Mobile.carriers.each do |const|
23
+ c = Mobile.const_get(const)
24
+ if c::MAIL_ADDRESS_REGEXP &&
25
+ str.match(/(\S+@[A-Za-z0-9\-\.\_]+)/) &&
26
+ $1.match(/^#{c::MAIL_ADDRESS_REGEXP}$/)
27
+ return c
28
+ end
14
29
  end
15
30
  nil
16
31
  end
@@ -9,8 +9,13 @@ module Jpmobile
9
9
  %w( DOCOMO_SJIS_TO_UNICODE DOCOMO_UNICODE_TO_SJIS ).each do |const|
10
10
  autoload const, 'jpmobile/emoticon/docomo'
11
11
  end
12
- autoload :AU_SJIS_TO_UNICODE, 'jpmobile/emoticon/au'
13
- %w( SOFTBANK_UNICODE_TO_WEBCODE SOFTBANK_WEBCODE_TO_UNICODE ).each do |const|
12
+ %w( AU_SJIS_TO_UNICODE AU_UNICODE_TO_EMAILJIS AU_SJIS_TO_EMAIL_JIS ).each do |const|
13
+ autoload const, 'jpmobile/emoticon/au'
14
+ end
15
+ %w(
16
+ SOFTBANK_UNICODE_TO_WEBCODE SOFTBANK_WEBCODE_TO_UNICODE
17
+ SOFTBANK_UNICODE_TO_SJIS SOFTBANK_SJIS_TO_UNICODE
18
+ ).each do |const|
14
19
  autoload const, 'jpmobile/emoticon/softbank'
15
20
  end
16
21
  %w( CONVERSION_TABLE_TO_DOCOMO CONVERSION_TABLE_TO_AU CONVERSION_TABLE_TO_SOFTBANK ).each do |const|
@@ -20,6 +25,7 @@ module Jpmobile
20
25
  SJIS_TO_UNICODE UNICODE_TO_SJIS
21
26
  SJIS_REGEXP SOFTBANK_WEBCODE_REGEXP DOCOMO_SJIS_REGEXP AU_SJIS_REGEXP SOFTBANK_UNICODE_REGEXP
22
27
  EMOTICON_UNICODES UTF8_REGEXP
28
+ CONVERSION_TABLE_TO_PC_EMAIL SOFTBANK_SJIS_REGEXP AU_EMAILJIS_REGEXP
23
29
  ).each do |const|
24
30
  autoload const, 'jpmobile/emoticon/z_combine'
25
31
  end
@@ -33,7 +39,7 @@ module Jpmobile
33
39
  end
34
40
  end
35
41
 
36
- # +str+ のなかでDoCoMo絵文字をUnicode数値文字参照に置換した文字列を返す。
42
+ # +str+ のなかでau絵文字をUnicode数値文字参照に置換した文字列を返す。
37
43
  def self.external_to_unicodecr_au(str)
38
44
  str.gsub(AU_SJIS_REGEXP) do |match|
39
45
  sjis = match.unpack('n').first
@@ -42,6 +48,16 @@ module Jpmobile
42
48
  end
43
49
  end
44
50
 
51
+ # +str+ のなかでau絵文字をUnicode数値文字参照に置換した文字列を返す。(メール専用)
52
+ def self.external_to_unicodecr_au_mail(in_str)
53
+ str = Jpmobile::Util.ascii_8bit(in_str)
54
+ str.gsub(AU_EMAILJIS_REGEXP) do |match|
55
+ jis = match.unpack('n').first
56
+ unicode = AU_EMAILJIS_TO_UNICODE[jis]
57
+ unicode ? Jpmobile::Util.ascii_8bit("\x1b\x28\x42&#x%04x;\x1b\x24\x42"%unicode) : match
58
+ end
59
+ end
60
+
45
61
  # +str+のなかでUTF8のSoftBank絵文字を(+0x1000だけシフトして)Unicode数値文字参照に変換した文字列を返す。
46
62
  def self.external_to_unicodecr_softbank(str)
47
63
  # SoftBank Unicode
@@ -50,24 +66,17 @@ module Jpmobile
50
66
  "&#x%04x;" % (unicode+0x1000)
51
67
  end
52
68
  end
69
+ def self.external_to_unicodecr_softbank_sjis(str)
70
+ # SoftBank Shift_JIS
71
+ str.gsub(SOFTBANK_SJIS_REGEXP) do |match|
72
+ sjis = match.unpack('n').first
73
+ unicode = SOFTBANK_SJIS_TO_UNICODE[sjis]
74
+ "&#x%04x;" % (unicode+0x1000)
75
+ end
76
+ end
53
77
  def self.external_to_unicodecr_vodafone(str)
54
78
  external_to_unicodecr_softbank(str)
55
79
  end
56
- # +str+のなかでWebcodeのSoftBank絵文字を(+0x1000だけシフトして)Unicode数値文字参照に変換した文字列を返す。
57
- def self.external_to_unicodecr_jphone(str)
58
- # SoftBank Webcode
59
- s = str.clone
60
- # 連続したエスケープコードが省略されている場合は切りはなす。
61
- s.gsub!(/\x1b\x24(.)(.+?)\x0f/) do |match|
62
- a = $1
63
- $2.split(//).map{|x| "\x1b\x24#{a}#{x}\x0f"}.join('')
64
- end
65
- # Webcodeを変換
66
- s.gsub(SOFTBANK_WEBCODE_REGEXP) do |match|
67
- unicode = SOFTBANK_WEBCODE_TO_UNICODE[match[2,2]] + 0x1000
68
- unicode ? ("&#x%04x;"%unicode) : match
69
- end
70
- end
71
80
 
72
81
  # +str+ のなかでUnicode数値文字参照で表記された絵文字を携帯側エンコーディングに置換する。
73
82
  #
@@ -91,16 +100,15 @@ module Jpmobile
91
100
  # 変換先がUnicodeで指定されている。つまり対応する絵文字がある。
92
101
  if sjis = UNICODE_TO_SJIS[converted]
93
102
  if to_sjis
94
- sjis_emotion = [sjis].pack('n')
95
- if sjis_emotion.respond_to?(:force_encoding)
96
- sjis_emotion.force_encoding("Shift_JIS")
97
- end
98
- sjis_emotion
103
+ sjis_emotion = Jpmobile::Util.sjis([sjis].pack('n'))
99
104
  else
100
105
  [converted].pack("U")
101
106
  end
102
107
  elsif webcode = SOFTBANK_UNICODE_TO_WEBCODE[converted-0x1000]
103
108
  [converted-0x1000].pack('U')
109
+ elsif converted == GETA
110
+ # PCで〓を表示する場合
111
+ [GETA].pack("U")
104
112
  else
105
113
  # キャリア変換テーブルに指定されていたUnicodeに対応する
106
114
  # 携帯側エンコーディングが見つからない(変換テーブルの不備の可能性あり)。
@@ -137,5 +145,59 @@ module Jpmobile
137
145
  "&#x%04x;" % match.unpack('U').first
138
146
  end
139
147
  end
148
+
149
+ # +str+ のなかでUnicode数値文字参照で表記された絵文字をメール送信用JISコードに変換する
150
+ # au 専用
151
+ def self.unicodecr_to_au_email(in_str)
152
+ str = Jpmobile::Util.ascii_8bit(in_str)
153
+ regexp = Regexp.compile(Jpmobile::Util.ascii_8bit("&#x([0-9a-f]{4});"), Regexp::IGNORECASE)
154
+ str.gsub(regexp) do |match|
155
+ unicode = $1.scanf("%x").first
156
+ converted = CONVERSION_TABLE_TO_AU[unicode]
157
+
158
+ # メール用エンコーディングに変換する
159
+ case converted
160
+ when Integer
161
+ if sjis = UNICODE_TO_SJIS[converted]
162
+ if email_jis = SJIS_TO_EMAIL_JIS[sjis]
163
+ Jpmobile::Util.ascii_8bit("\x1b\x24\x42#{[email_jis].pack('n')}\x1b\x28\x42")
164
+ else
165
+ Jpmobile::Util.ascii_8bit([sjis].pack('n'))
166
+ end
167
+ else
168
+ match
169
+ end
170
+ when String
171
+ # FIXME: 絵文字の代替が文章でいいかどうかの検証
172
+ Jpmobile::Util.ascii_8bit(Jpmobile::Util.utf8_to_jis(converted))
173
+ else
174
+ match
175
+ end
176
+ end
177
+ end
178
+
179
+ # +str+ のなかでUnicode数値文字参照で表記された絵文字をメール送信用JISコードに変換する
180
+ # softbank 専用
181
+ def self.unicodecr_to_softbank_email(str)
182
+ str.gsub(/&#x([0-9a-f]{4});/i) do |match|
183
+ unicode = $1.scanf("%x").first
184
+ converted = CONVERSION_TABLE_TO_SOFTBANK[unicode]
185
+
186
+ # メール用エンコーディングに変換する
187
+ case converted
188
+ when Integer
189
+ if sjis = SOFTBANK_UNICODE_TO_SJIS[converted-0x1000]
190
+ Jpmobile::Util.sjis([sjis].pack('n'))
191
+ else
192
+ match
193
+ end
194
+ when String
195
+ # FIXME: 絵文字の代替が文章でいいかどうかの検証
196
+ Jpmobile::Util.utf8_to_sjis(converted)
197
+ else
198
+ match
199
+ end
200
+ end
201
+ end
140
202
  end
141
203
  end
@@ -1285,3 +1285,647 @@ Jpmobile::Emoticon::AU_EMAILJIS_TO_UNICODE = {
1285
1285
  0x7B6C=>0xEB87,
1286
1286
  0x7B6D=>0xEB88,
1287
1287
  }.freeze
1288
+ Jpmobile::Emoticon::AU_UNICODE_TO_EMAILJIS = Jpmobile::Emoticon::AU_EMAILJIS_TO_UNICODE.invert.freeze
1289
+ Jpmobile::Emoticon::AU_SJIS_TO_EMAIL_JIS = {
1290
+ 0xF659 => 0x753A,
1291
+ 0xF75E => 0x773F,
1292
+ 0xF65A => 0x753B,
1293
+ 0xF75F => 0x7740,
1294
+ 0xF65B => 0x753C,
1295
+ 0xF760 => 0x7741,
1296
+ 0xF748 => 0x7729,
1297
+ 0xF761 => 0x7742,
1298
+ 0xF749 => 0x772A,
1299
+ 0xF762 => 0x7743,
1300
+ 0xF74A => 0x772B,
1301
+ 0xF763 => 0x7744,
1302
+ 0xF74B => 0x772C,
1303
+ 0xF764 => 0x7745,
1304
+ 0xF74C => 0x772D,
1305
+ 0xF765 => 0x7746,
1306
+ 0xF74D => 0x772E,
1307
+ 0xF766 => 0x7747,
1308
+ 0xF74E => 0x772F,
1309
+ 0xF767 => 0x7748,
1310
+ 0xF74F => 0x7730,
1311
+ 0xF768 => 0x7749,
1312
+ 0xF69A => 0x757A,
1313
+ 0xF769 => 0x774A,
1314
+ 0xF6EA => 0x766C,
1315
+ 0xF660 => 0x7541,
1316
+ 0xF796 => 0x7776,
1317
+ 0xF693 => 0x7573,
1318
+ 0xF65E => 0x753F,
1319
+ 0xF7B1 => 0x7833,
1320
+ 0xF65F => 0x7540,
1321
+ 0xF661 => 0x7542,
1322
+ 0xF750 => 0x7731,
1323
+ 0xF6EB => 0x766D,
1324
+ 0xF751 => 0x7732,
1325
+ 0xF77C => 0x775D,
1326
+ 0xF752 => 0x7733,
1327
+ 0xF6D3 => 0x7655,
1328
+ 0xF753 => 0x7734,
1329
+ 0xF7B2 => 0x7834,
1330
+ 0xF754 => 0x7735,
1331
+ 0xF69B => 0x757B,
1332
+ 0xF755 => 0x7736,
1333
+ 0xF6EC => 0x766E,
1334
+ 0xF756 => 0x7737,
1335
+ 0xF76A => 0x774B,
1336
+ 0xF757 => 0x7738,
1337
+ 0xF76B => 0x774C,
1338
+ 0xF797 => 0x7777,
1339
+ 0xF77D => 0x775E,
1340
+ 0xF758 => 0x7739,
1341
+ 0xF798 => 0x7778,
1342
+ 0xF759 => 0x773A,
1343
+ 0xF654 => 0x7535,
1344
+ 0xF75A => 0x773B,
1345
+ 0xF77E => 0x775F,
1346
+ 0xF75B => 0x773C,
1347
+ 0xF662 => 0x7543,
1348
+ 0xF75C => 0x773D,
1349
+ 0xF76C => 0x774D,
1350
+ 0xF75D => 0x773E,
1351
+ 0xF76D => 0x774E,
1352
+ 0xF76E => 0x774F,
1353
+ 0xF6EE => 0x7670,
1354
+ 0xF76F => 0x7750,
1355
+ 0xF664 => 0x7545,
1356
+ 0xF69C => 0x757C,
1357
+ 0xF694 => 0x7574,
1358
+ 0xF770 => 0x7751,
1359
+ 0xF782 => 0x7762,
1360
+ 0xF780 => 0x7760,
1361
+ 0xF65C => 0x753D,
1362
+ 0xF6D4 => 0x7656,
1363
+ 0xF642 => 0x7523,
1364
+ 0xF663 => 0x7544,
1365
+ 0xF783 => 0x7763,
1366
+ 0xF771 => 0x7752,
1367
+ 0xF784 => 0x7764,
1368
+ 0xF772 => 0x7753,
1369
+ 0xF785 => 0x7765,
1370
+ 0xF6ED => 0x766F,
1371
+ 0xF786 => 0x7766,
1372
+ 0xF773 => 0x7754,
1373
+ 0xF6EF => 0x7671,
1374
+ 0xF6B8 => 0x763A,
1375
+ 0xF787 => 0x7767,
1376
+ 0xF640 => 0x7521,
1377
+ 0xF676 => 0x7557,
1378
+ 0xF644 => 0x7525,
1379
+ 0xF665 => 0x7546,
1380
+ 0xF64E => 0x752F,
1381
+ 0xF6FA => 0x767C,
1382
+ 0xF6B9 => 0x763B,
1383
+ 0xF79A => 0x777A,
1384
+ 0xF7AC => 0x782E,
1385
+ 0xF6F0 => 0x7672,
1386
+ 0xF6D5 => 0x7657,
1387
+ 0xF79B => 0x777B,
1388
+ 0xF774 => 0x7755,
1389
+ 0xF684 => 0x7564,
1390
+ 0xF775 => 0x7756,
1391
+ 0xF6BD => 0x763F,
1392
+ 0xF674 => 0x7555,
1393
+ 0xF79C => 0x777C,
1394
+ 0xF7AD => 0x782F,
1395
+ 0xF79D => 0x777D,
1396
+ 0xF7B3 => 0x7835,
1397
+ 0xF6D7 => 0x7659,
1398
+ 0xF6D6 => 0x7658,
1399
+ 0xF778 => 0x7759,
1400
+ 0xF799 => 0x7779,
1401
+ 0xF779 => 0x775A,
1402
+ 0xF776 => 0x7757,
1403
+ 0xF6F1 => 0x7673,
1404
+ 0xF777 => 0x7758,
1405
+ 0xF6F2 => 0x7674,
1406
+ 0xF790 => 0x7770,
1407
+ 0xF788 => 0x7768,
1408
+ 0xF675 => 0x7556,
1409
+ 0xF677 => 0x7558,
1410
+ 0xF781 => 0x7761,
1411
+ 0xF79E => 0x777E,
1412
+ 0xF7B4 => 0x7836,
1413
+ 0xF6F3 => 0x7675,
1414
+ 0xF68A => 0x756A,
1415
+ 0xF686 => 0x7566,
1416
+ 0xF79F => 0x7821,
1417
+ 0xF78D => 0x776D,
1418
+ 0xF791 => 0x7771,
1419
+ 0xF67A => 0x755B,
1420
+ 0xF792 => 0x7772,
1421
+ 0xF793 => 0x7773,
1422
+ 0xF6F4 => 0x7676,
1423
+ 0xF69D => 0x757D,
1424
+ 0xF7A0 => 0x7822,
1425
+ 0xF7A5 => 0x7827,
1426
+ 0xF789 => 0x7769,
1427
+ 0xF7A6 => 0x7828,
1428
+ 0xF77A => 0x775B,
1429
+ 0xF6DA => 0x765C,
1430
+ 0xF6A7 => 0x7629,
1431
+ 0xF7A7 => 0x7829,
1432
+ 0xF6BA => 0x763C,
1433
+ 0xF6F8 => 0x767A,
1434
+ 0xF7A1 => 0x7823,
1435
+ 0xF6F9 => 0x767B,
1436
+ 0xF77B => 0x775C,
1437
+ 0xF666 => 0x7547,
1438
+ 0xF78A => 0x776A,
1439
+ 0xF68C => 0x756C,
1440
+ 0xF6F5 => 0x7677,
1441
+ 0xF68D => 0x756D,
1442
+ 0xF7A2 => 0x7824,
1443
+ 0xF6A1 => 0x7623,
1444
+ 0xF6D8 => 0x765A,
1445
+ 0xF7A8 => 0x782A,
1446
+ 0xF6D9 => 0x765B,
1447
+ 0xF68E => 0x756E,
1448
+ 0xF78B => 0x776B,
1449
+ 0xF7A9 => 0x782B,
1450
+ 0xF678 => 0x7559,
1451
+ 0xF7AA => 0x782C,
1452
+ 0xF6A8 => 0x762A,
1453
+ 0xF7AB => 0x782D,
1454
+ 0xF6F6 => 0x7678,
1455
+ 0xF655 => 0x7536,
1456
+ 0xF685 => 0x7565,
1457
+ 0xF656 => 0x7537,
1458
+ 0xF78C => 0x776C,
1459
+ 0xF657 => 0x7538,
1460
+ 0xF68B => 0x756B,
1461
+ 0xF658 => 0x7539,
1462
+ 0xF679 => 0x755A,
1463
+ 0xF6FB => 0x767D,
1464
+ 0xF7A3 => 0x7825,
1465
+ 0xF6FC => 0x767E,
1466
+ 0xF7AE => 0x7830,
1467
+ 0xF740 => 0x7721,
1468
+ 0xF7A4 => 0x7826,
1469
+ 0xF741 => 0x7722,
1470
+ 0xF7AF => 0x7831,
1471
+ 0xF742 => 0x7723,
1472
+ 0xF7B0 => 0x7832,
1473
+ 0xF743 => 0x7724,
1474
+ 0xF6F7 => 0x7679,
1475
+ 0xF744 => 0x7725,
1476
+ 0xF745 => 0x7726,
1477
+ 0xF643 => 0x7524,
1478
+ 0xF746 => 0x7727,
1479
+ 0xF68F => 0x756F,
1480
+ 0xF747 => 0x7728,
1481
+ 0xF690 => 0x7570,
1482
+ 0xF641 => 0x7522,
1483
+ 0xF691 => 0x7571,
1484
+ 0xF65D => 0x753E,
1485
+ 0xF692 => 0x7572,
1486
+ 0xF667 => 0x7548,
1487
+ 0xF645 => 0x7526,
1488
+ 0xF668 => 0x7549,
1489
+ 0xF695 => 0x7575,
1490
+ 0xF669 => 0x754A,
1491
+ 0xF696 => 0x7576,
1492
+ 0xF66A => 0x754B,
1493
+ 0xF697 => 0x7577,
1494
+ 0xF66B => 0x754C,
1495
+ 0xF698 => 0x7578,
1496
+ 0xF66C => 0x754D,
1497
+ 0xF699 => 0x7579,
1498
+ 0xF66D => 0x754E,
1499
+ 0xF646 => 0x7527,
1500
+ 0xF66E => 0x754F,
1501
+ 0xF647 => 0x7528,
1502
+ 0xF66F => 0x7550,
1503
+ 0xF69E => 0x757E,
1504
+ 0xF670 => 0x7551,
1505
+ 0xF69F => 0x7621,
1506
+ 0xF671 => 0x7552,
1507
+ 0xF6A0 => 0x7622,
1508
+ 0xF672 => 0x7553,
1509
+ 0xF6A2 => 0x7624,
1510
+ 0xF673 => 0x7554,
1511
+ 0xF6A3 => 0x7625,
1512
+ 0xF67B => 0x755C,
1513
+ 0xF6A4 => 0x7626,
1514
+ 0xF67C => 0x755D,
1515
+ 0xF6A5 => 0x7627,
1516
+ 0xF67D => 0x755E,
1517
+ 0xF6A6 => 0x7628,
1518
+ 0xF67E => 0x755F,
1519
+ 0xF6A9 => 0x762B,
1520
+ 0xF680 => 0x7560,
1521
+ 0xF6AA => 0x762C,
1522
+ 0xF681 => 0x7561,
1523
+ 0xF6AB => 0x762D,
1524
+ 0xF682 => 0x7562,
1525
+ 0xF6AC => 0x762E,
1526
+ 0xF683 => 0x7563,
1527
+ 0xF6AD => 0x762F,
1528
+ 0xF78E => 0x776E,
1529
+ 0xF6AE => 0x7630,
1530
+ 0xF78F => 0x776F,
1531
+ 0xF6AF => 0x7631,
1532
+ 0xF687 => 0x7567,
1533
+ 0xF648 => 0x7529,
1534
+ 0xF688 => 0x7568,
1535
+ 0xF6B0 => 0x7632,
1536
+ 0xF689 => 0x7569,
1537
+ 0xF6B1 => 0x7633,
1538
+ 0xF6B2 => 0x7634,
1539
+ 0xF6CB => 0x764D,
1540
+ 0xF6B3 => 0x7635,
1541
+ 0xF6CC => 0x764E,
1542
+ 0xF6B4 => 0x7636,
1543
+ 0xF6CD => 0x764F,
1544
+ 0xF6B5 => 0x7637,
1545
+ 0xF6CE => 0x7650,
1546
+ 0xF6B6 => 0x7638,
1547
+ 0xF6CF => 0x7651,
1548
+ 0xF6B7 => 0x7639,
1549
+ 0xF6D0 => 0x7652,
1550
+ 0xF6BB => 0x763D,
1551
+ 0xF6D1 => 0x7653,
1552
+ 0xF6BC => 0x763E,
1553
+ 0xF6D2 => 0x7654,
1554
+ 0xF649 => 0x752A,
1555
+ 0xF6DB => 0x765D,
1556
+ 0xF64A => 0x752B,
1557
+ 0xF6DC => 0x765E,
1558
+ 0xF64B => 0x752C,
1559
+ 0xF6DD => 0x765F,
1560
+ 0xF64C => 0x752D,
1561
+ 0xF6DE => 0x7660,
1562
+ 0xF64D => 0x752E,
1563
+ 0xF6DF => 0x7661,
1564
+ 0xF6BE => 0x7640,
1565
+ 0xF6E0 => 0x7662,
1566
+ 0xF6BF => 0x7641,
1567
+ 0xF6E1 => 0x7663,
1568
+ 0xF6C0 => 0x7642,
1569
+ 0xF6E2 => 0x7664,
1570
+ 0xF64F => 0x7530,
1571
+ 0xF6E3 => 0x7665,
1572
+ 0xF650 => 0x7531,
1573
+ 0xF6E4 => 0x7666,
1574
+ 0xF651 => 0x7532,
1575
+ 0xF794 => 0x7774,
1576
+ 0xF652 => 0x7533,
1577
+ 0xF795 => 0x7775,
1578
+ 0xF653 => 0x7534,
1579
+ 0xF6E5 => 0x7667,
1580
+ 0xF6C1 => 0x7643,
1581
+ 0xF6E6 => 0x7668,
1582
+ 0xF6C2 => 0x7644,
1583
+ 0xF6E7 => 0x7669,
1584
+ 0xF6C3 => 0x7645,
1585
+ 0xF6E8 => 0x766A,
1586
+ 0xF6C4 => 0x7646,
1587
+ 0xF6E9 => 0x766B,
1588
+ 0xF6C5 => 0x7647,
1589
+ 0xF7B5 => 0x7837,
1590
+ 0xF6C6 => 0x7648,
1591
+ 0xF7B6 => 0x7838,
1592
+ 0xF6C7 => 0x7649,
1593
+ 0xF7B7 => 0x7839,
1594
+ 0xF6C8 => 0x764A,
1595
+ 0xF7B8 => 0x783A,
1596
+ 0xF6C9 => 0x764B,
1597
+ 0xF7B9 => 0x783B,
1598
+ 0xF6CA => 0x764C,
1599
+ 0xF7BA => 0x783C,
1600
+ 0xF7BB => 0x783D,
1601
+ 0xF7ED => 0x786F,
1602
+ 0xF7BC => 0x783E,
1603
+ 0xF7EE => 0x7870,
1604
+ 0xF7BD => 0x783F,
1605
+ 0xF7EF => 0x7871,
1606
+ 0xF7BE => 0x7840,
1607
+ 0xF7F0 => 0x7872,
1608
+ 0xF7BF => 0x7841,
1609
+ 0xF7F1 => 0x7873,
1610
+ 0xF7C0 => 0x7842,
1611
+ 0xF7F2 => 0x7874,
1612
+ 0xF7C1 => 0x7843,
1613
+ 0xF7F3 => 0x7875,
1614
+ 0xF7C2 => 0x7844,
1615
+ 0xF7F4 => 0x7876,
1616
+ 0xF7C3 => 0x7845,
1617
+ 0xF7F5 => 0x7877,
1618
+ 0xF7C4 => 0x7846,
1619
+ 0xF7F6 => 0x7878,
1620
+ 0xF7C5 => 0x7847,
1621
+ 0xF7F7 => 0x7879,
1622
+ 0xF7C6 => 0x7848,
1623
+ 0xF7F8 => 0x787A,
1624
+ 0xF7C7 => 0x7849,
1625
+ 0xF7F9 => 0x787B,
1626
+ 0xF7C8 => 0x784A,
1627
+ 0xF7FA => 0x787C,
1628
+ 0xF7C9 => 0x784B,
1629
+ 0xF7FB => 0x787D,
1630
+ 0xF7CA => 0x784C,
1631
+ 0xF7FC => 0x787E,
1632
+ 0xF7CB => 0x784D,
1633
+ 0xF340 => 0x7921,
1634
+ 0xF7CC => 0x784E,
1635
+ 0xF341 => 0x7922,
1636
+ 0xF7CD => 0x784F,
1637
+ 0xF342 => 0x7923,
1638
+ 0xF7CE => 0x7850,
1639
+ 0xF343 => 0x7924,
1640
+ 0xF7CF => 0x7851,
1641
+ 0xF344 => 0x7925,
1642
+ 0xF7D0 => 0x7852,
1643
+ 0xF345 => 0x7926,
1644
+ 0xF7D1 => 0x7853,
1645
+ 0xF346 => 0x7927,
1646
+ 0xF7E5 => 0x7867,
1647
+ 0xF347 => 0x7928,
1648
+ 0xF7E6 => 0x7868,
1649
+ 0xF348 => 0x7929,
1650
+ 0xF7E7 => 0x7869,
1651
+ 0xF349 => 0x792A,
1652
+ 0xF7E8 => 0x786A,
1653
+ 0xF34A => 0x792B,
1654
+ 0xF7E9 => 0x786B,
1655
+ 0xF34B => 0x792C,
1656
+ 0xF7EA => 0x786C,
1657
+ 0xF34C => 0x792D,
1658
+ 0xF7EB => 0x786D,
1659
+ 0xF34D => 0x792E,
1660
+ 0xF7EC => 0x786E,
1661
+ 0xF34E => 0x792F,
1662
+ 0xF34F => 0x7930,
1663
+ 0xF36E => 0x794F,
1664
+ 0xF350 => 0x7931,
1665
+ 0xF36F => 0x7950,
1666
+ 0xF351 => 0x7932,
1667
+ 0xF370 => 0x7951,
1668
+ 0xF352 => 0x7933,
1669
+ 0xF371 => 0x7952,
1670
+ 0xF353 => 0x7934,
1671
+ 0xF372 => 0x7953,
1672
+ 0xF354 => 0x7935,
1673
+ 0xF373 => 0x7954,
1674
+ 0xF355 => 0x7936,
1675
+ 0xF374 => 0x7955,
1676
+ 0xF356 => 0x7937,
1677
+ 0xF375 => 0x7956,
1678
+ 0xF357 => 0x7938,
1679
+ 0xF376 => 0x7957,
1680
+ 0xF358 => 0x7939,
1681
+ 0xF377 => 0x7958,
1682
+ 0xF359 => 0x793A,
1683
+ 0xF378 => 0x7959,
1684
+ 0xF35A => 0x793B,
1685
+ 0xF379 => 0x795A,
1686
+ 0xF35B => 0x793C,
1687
+ 0xF37A => 0x795B,
1688
+ 0xF35C => 0x793D,
1689
+ 0xF37B => 0x795C,
1690
+ 0xF35D => 0x793E,
1691
+ 0xF37C => 0x795D,
1692
+ 0xF35E => 0x793F,
1693
+ 0xF37D => 0x795E,
1694
+ 0xF35F => 0x7940,
1695
+ 0xF37E => 0x795F,
1696
+ 0xF360 => 0x7941,
1697
+ 0xF380 => 0x7960,
1698
+ 0xF361 => 0x7942,
1699
+ 0xF381 => 0x7961,
1700
+ 0xF362 => 0x7943,
1701
+ 0xF382 => 0x7962,
1702
+ 0xF363 => 0x7944,
1703
+ 0xF383 => 0x7963,
1704
+ 0xF364 => 0x7945,
1705
+ 0xF384 => 0x7964,
1706
+ 0xF365 => 0x7946,
1707
+ 0xF385 => 0x7965,
1708
+ 0xF366 => 0x7947,
1709
+ 0xF386 => 0x7966,
1710
+ 0xF367 => 0x7948,
1711
+ 0xF387 => 0x7967,
1712
+ 0xF368 => 0x7949,
1713
+ 0xF388 => 0x7968,
1714
+ 0xF369 => 0x794A,
1715
+ 0xF389 => 0x7969,
1716
+ 0xF36A => 0x794B,
1717
+ 0xF38A => 0x796A,
1718
+ 0xF36B => 0x794C,
1719
+ 0xF38B => 0x796B,
1720
+ 0xF36C => 0x794D,
1721
+ 0xF38C => 0x796C,
1722
+ 0xF36D => 0x794E,
1723
+ 0xF38D => 0x796D,
1724
+ 0xF38E => 0x796E,
1725
+ 0xF3AD => 0x7A2F,
1726
+ 0xF38F => 0x796F,
1727
+ 0xF3AE => 0x7A30,
1728
+ 0xF390 => 0x7970,
1729
+ 0xF3AF => 0x7A31,
1730
+ 0xF391 => 0x7971,
1731
+ 0xF3B0 => 0x7A32,
1732
+ 0xF392 => 0x7972,
1733
+ 0xF3B1 => 0x7A33,
1734
+ 0xF393 => 0x7973,
1735
+ 0xF3B2 => 0x7A34,
1736
+ 0xF394 => 0x7974,
1737
+ 0xF3B3 => 0x7A35,
1738
+ 0xF395 => 0x7975,
1739
+ 0xF3B4 => 0x7A36,
1740
+ 0xF396 => 0x7976,
1741
+ 0xF3B5 => 0x7A37,
1742
+ 0xF397 => 0x7977,
1743
+ 0xF3B6 => 0x7A38,
1744
+ 0xF398 => 0x7978,
1745
+ 0xF3B7 => 0x7A39,
1746
+ 0xF399 => 0x7979,
1747
+ 0xF3B8 => 0x7A3A,
1748
+ 0xF39A => 0x797A,
1749
+ 0xF3B9 => 0x7A3B,
1750
+ 0xF39B => 0x797B,
1751
+ 0xF3BA => 0x7A3C,
1752
+ 0xF39C => 0x797C,
1753
+ 0xF3BB => 0x7A3D,
1754
+ 0xF39D => 0x797D,
1755
+ 0xF3BC => 0x7A3E,
1756
+ 0xF39E => 0x797E,
1757
+ 0xF3BD => 0x7A3F,
1758
+ 0xF39F => 0x7A21,
1759
+ 0xF3BE => 0x7A40,
1760
+ 0xF3A0 => 0x7A22,
1761
+ 0xF3BF => 0x7A41,
1762
+ 0xF3A1 => 0x7A23,
1763
+ 0xF3C0 => 0x7A42,
1764
+ 0xF3A2 => 0x7A24,
1765
+ 0xF3C1 => 0x7A43,
1766
+ 0xF3A3 => 0x7A25,
1767
+ 0xF3C2 => 0x7A44,
1768
+ 0xF3A4 => 0x7A26,
1769
+ 0xF3C3 => 0x7A45,
1770
+ 0xF3A5 => 0x7A27,
1771
+ 0xF3C4 => 0x7A46,
1772
+ 0xF3A6 => 0x7A28,
1773
+ 0xF3C5 => 0x7A47,
1774
+ 0xF3A7 => 0x7A29,
1775
+ 0xF3C6 => 0x7A48,
1776
+ 0xF3A8 => 0x7A2A,
1777
+ 0xF3C7 => 0x7A49,
1778
+ 0xF3A9 => 0x7A2B,
1779
+ 0xF3C8 => 0x7A4A,
1780
+ 0xF3AA => 0x7A2C,
1781
+ 0xF3C9 => 0x7A4B,
1782
+ 0xF3AB => 0x7A2D,
1783
+ 0xF3CA => 0x7A4C,
1784
+ 0xF3AC => 0x7A2E,
1785
+ 0xF3CB => 0x7A4D,
1786
+ 0xF3CC => 0x7A4E,
1787
+ 0xF3D8 => 0x7A5A,
1788
+ 0xF3CD => 0x7A4F,
1789
+ 0xF3D9 => 0x7A5B,
1790
+ 0xF3CE => 0x7A50,
1791
+ 0xF3DA => 0x7A5C,
1792
+ 0xF7D2 => 0x7854,
1793
+ 0xF3DB => 0x7A5D,
1794
+ 0xF7D3 => 0x7855,
1795
+ 0xF3DC => 0x7A5E,
1796
+ 0xF7D4 => 0x7856,
1797
+ 0xF3DD => 0x7A5F,
1798
+ 0xF7D5 => 0x7857,
1799
+ 0xF3DE => 0x7A60,
1800
+ 0xF7D6 => 0x7858,
1801
+ 0xF3DF => 0x7A61,
1802
+ 0xF7D7 => 0x7859,
1803
+ 0xF3E0 => 0x7A62,
1804
+ 0xF7D8 => 0x785A,
1805
+ 0xF3E1 => 0x7A63,
1806
+ 0xF7D9 => 0x785B,
1807
+ 0xF3E2 => 0x7A64,
1808
+ 0xF7DA => 0x785C,
1809
+ 0xF3E3 => 0x7A65,
1810
+ 0xF7DB => 0x785D,
1811
+ 0xF3E4 => 0x7A66,
1812
+ 0xF7DC => 0x785E,
1813
+ 0xF3E5 => 0x7A67,
1814
+ 0xF7DD => 0x785F,
1815
+ 0xF3E6 => 0x7A68,
1816
+ 0xF7DE => 0x7860,
1817
+ 0xF3E7 => 0x7A69,
1818
+ 0xF7DF => 0x7861,
1819
+ 0xF3E8 => 0x7A6A,
1820
+ 0xF7E0 => 0x7862,
1821
+ 0xF3E9 => 0x7A6B,
1822
+ 0xF7E1 => 0x7863,
1823
+ 0xF3EA => 0x7A6C,
1824
+ 0xF7E2 => 0x7864,
1825
+ 0xF3EB => 0x7A6D,
1826
+ 0xF7E3 => 0x7865,
1827
+ 0xF3EC => 0x7A6E,
1828
+ 0xF7E4 => 0x7866,
1829
+ 0xF3ED => 0x7A6F,
1830
+ 0xF3CF => 0x7A51,
1831
+ 0xF3EE => 0x7A70,
1832
+ 0xF3D0 => 0x7A52,
1833
+ 0xF3EF => 0x7A71,
1834
+ 0xF3D1 => 0x7A53,
1835
+ 0xF3F0 => 0x7A72,
1836
+ 0xF3D2 => 0x7A54,
1837
+ 0xF3F1 => 0x7A73,
1838
+ 0xF3D3 => 0x7A55,
1839
+ 0xF3F2 => 0x7A74,
1840
+ 0xF3D4 => 0x7A56,
1841
+ 0xF3F3 => 0x7A75,
1842
+ 0xF3D5 => 0x7A57,
1843
+ 0xF3F4 => 0x7A76,
1844
+ 0xF3D6 => 0x7A58,
1845
+ 0xF3F5 => 0x7A77,
1846
+ 0xF3D7 => 0x7A59,
1847
+ 0xF3F6 => 0x7A78,
1848
+ 0xF3F7 => 0x7A79,
1849
+ 0xF459 => 0x7B3A,
1850
+ 0xF3F8 => 0x7A7A,
1851
+ 0xF45A => 0x7B3B,
1852
+ 0xF3F9 => 0x7A7B,
1853
+ 0xF45B => 0x7B3C,
1854
+ 0xF3FA => 0x7A7C,
1855
+ 0xF45C => 0x7B3D,
1856
+ 0xF3FB => 0x7A7D,
1857
+ 0xF45D => 0x7B3E,
1858
+ 0xF3FC => 0x7A7E,
1859
+ 0xF45E => 0x7B3F,
1860
+ 0xF440 => 0x7B21,
1861
+ 0xF45F => 0x7B40,
1862
+ 0xF441 => 0x7B22,
1863
+ 0xF460 => 0x7B41,
1864
+ 0xF442 => 0x7B23,
1865
+ 0xF461 => 0x7B42,
1866
+ 0xF443 => 0x7B24,
1867
+ 0xF462 => 0x7B43,
1868
+ 0xF444 => 0x7B25,
1869
+ 0xF463 => 0x7B44,
1870
+ 0xF445 => 0x7B26,
1871
+ 0xF464 => 0x7B45,
1872
+ 0xF446 => 0x7B27,
1873
+ 0xF465 => 0x7B46,
1874
+ 0xF447 => 0x7B28,
1875
+ 0xF466 => 0x7B47,
1876
+ 0xF448 => 0x7B29,
1877
+ 0xF467 => 0x7B48,
1878
+ 0xF449 => 0x7B2A,
1879
+ 0xF468 => 0x7B49,
1880
+ 0xF44A => 0x7B2B,
1881
+ 0xF469 => 0x7B4A,
1882
+ 0xF44B => 0x7B2C,
1883
+ 0xF46A => 0x7B4B,
1884
+ 0xF44C => 0x7B2D,
1885
+ 0xF46B => 0x7B4C,
1886
+ 0xF44D => 0x7B2E,
1887
+ 0xF46C => 0x7B4D,
1888
+ 0xF44E => 0x7B2F,
1889
+ 0xF46D => 0x7B4E,
1890
+ 0xF44F => 0x7B30,
1891
+ 0xF46E => 0x7B4F,
1892
+ 0xF450 => 0x7B31,
1893
+ 0xF46F => 0x7B50,
1894
+ 0xF451 => 0x7B32,
1895
+ 0xF470 => 0x7B51,
1896
+ 0xF452 => 0x7B33,
1897
+ 0xF471 => 0x7B52,
1898
+ 0xF453 => 0x7B34,
1899
+ 0xF472 => 0x7B53,
1900
+ 0xF454 => 0x7B35,
1901
+ 0xF473 => 0x7B54,
1902
+ 0xF455 => 0x7B36,
1903
+ 0xF474 => 0x7B55,
1904
+ 0xF456 => 0x7B37,
1905
+ 0xF475 => 0x7B56,
1906
+ 0xF457 => 0x7B38,
1907
+ 0xF476 => 0x7B57,
1908
+ 0xF458 => 0x7B39,
1909
+ 0xF477 => 0x7B58,
1910
+ 0xF478 => 0x7B59,
1911
+ 0xF479 => 0x7B5A,
1912
+ 0xF47A => 0x7B5B,
1913
+ 0xF47B => 0x7B5C,
1914
+ 0xF47C => 0x7B5D,
1915
+ 0xF47D => 0x7B5E,
1916
+ 0xF47E => 0x7B5F,
1917
+ 0xF480 => 0x7B60,
1918
+ 0xF481 => 0x7B61,
1919
+ 0xF482 => 0x7B62,
1920
+ 0xF483 => 0x7B63,
1921
+ 0xF484 => 0x7B64,
1922
+ 0xF485 => 0x7B65,
1923
+ 0xF486 => 0x7B66,
1924
+ 0xF487 => 0x7B67,
1925
+ 0xF488 => 0x7B68,
1926
+ 0xF489 => 0x7B69,
1927
+ 0xF48A => 0x7B6A,
1928
+ 0xF48B => 0x7B6B,
1929
+ 0xF48C => 0x7B6C,
1930
+ 0xF48D => 0x7B6D
1931
+ }