Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/apps.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarius Blüm <marius@lineone.io>2018-08-01 12:25:59 +0300
committerMarius Blüm <marius@lineone.io>2018-08-01 12:25:59 +0300
commitba6f6ee79cde11575f71171930a14f4df3ba64e8 (patch)
tree47b2d95a37fcb82860c0065de4f0b932f1ce3f72
parentd7273a72c0e2680871e6ac6ec0218b1e7bec7550 (diff)
Remove old apps
* emoji (removed due native support in Nextcloud) * files_videoviewer (moved over to files_videoplayer) * imprint (moved to external & theming-app) * ownpad_lite (moved to ownpad community app & replaced by other notes-apps) * pushnotifications (is now integrated with other code) * reader (replaced by collabora, onlyoffice & documents - no development here) * tattoo (theming, unsplash, theming_customcss) * user_persona (persona was shut down by Mozilla in 2016) * user_saml (new app in separate repository) Signed-off-by: Marius Blüm <marius@lineone.io>
-rw-r--r--emoji/app.php2096
-rw-r--r--emoji/appinfo/app.php26
-rw-r--r--emoji/appinfo/info.xml10
-rw-r--r--emoji/css/emoji.css729
-rw-r--r--emoji/hooks.php38
-rw-r--r--emoji/img/emoji.pngbin562053 -> 0 bytes
-rw-r--r--files_videoviewer/appinfo/app.php5
-rw-r--r--files_videoviewer/appinfo/info.xml14
-rw-r--r--files_videoviewer/appinfo/version1
-rw-r--r--files_videoviewer/css/mediaelementplayer.css870
-rw-r--r--files_videoviewer/css/style.css31
-rw-r--r--files_videoviewer/img/app.pngbin322 -> 0 bytes
-rw-r--r--files_videoviewer/img/app.svg5
-rw-r--r--files_videoviewer/img/close.pngbin1097 -> 0 bytes
-rw-r--r--files_videoviewer/img/skin/background.pngbin135 -> 0 bytes
-rw-r--r--files_videoviewer/img/skin/bigplay.pngbin2912 -> 0 bytes
-rw-r--r--files_videoviewer/img/skin/bigplay.svg36
-rw-r--r--files_videoviewer/img/skin/controls-ted.pngbin1559 -> 0 bytes
-rw-r--r--files_videoviewer/img/skin/controls-wmp-bg.pngbin1960 -> 0 bytes
-rw-r--r--files_videoviewer/img/skin/controls-wmp.pngbin5511 -> 0 bytes
-rw-r--r--files_videoviewer/img/skin/controls.pngbin1873 -> 0 bytes
-rw-r--r--files_videoviewer/img/skin/controls.svg98
-rw-r--r--files_videoviewer/img/skin/loading.gifbin6224 -> 0 bytes
-rwxr-xr-xfiles_videoviewer/js/flashmediaelement.swfbin98731 -> 0 bytes
-rwxr-xr-xfiles_videoviewer/js/mediaelement-and-player.js5800
-rwxr-xr-xfiles_videoviewer/js/mediaelement-and-player.min.js28
-rw-r--r--files_videoviewer/js/mep-extra.js9
-rwxr-xr-xfiles_videoviewer/js/silverlightmediaelement.xapbin12459 -> 0 bytes
-rw-r--r--files_videoviewer/js/viewer.js117
-rw-r--r--files_videoviewer/src/flash/FlashMediaElement.as1087
-rw-r--r--files_videoviewer/src/flash/FlashMediaElement.flabin26223 -> 0 bytes
-rw-r--r--files_videoviewer/src/flash/HtmlMediaEvent.as29
-rw-r--r--files_videoviewer/src/flash/htmlelements/AudioElement.as332
-rw-r--r--files_videoviewer/src/flash/htmlelements/IMediaElement.as35
-rw-r--r--files_videoviewer/src/flash/htmlelements/VideoElement.as1
-rw-r--r--files_videoviewer/src/flash/htmlelements/YouTubeElement.as403
-rw-r--r--files_videoviewer/src/silverlight/App.xaml8
-rw-r--r--files_videoviewer/src/silverlight/App.xaml.cs68
-rw-r--r--files_videoviewer/src/silverlight/MainPage.xaml276
-rw-r--r--files_videoviewer/src/silverlight/MainPage.xaml.cs636
-rw-r--r--files_videoviewer/src/silverlight/Properties/AppManifest.xml6
-rw-r--r--files_videoviewer/src/silverlight/Properties/AssemblyInfo.cs35
-rw-r--r--files_videoviewer/src/silverlight/SilverlightMediaElement.csproj112
-rw-r--r--files_videoviewer/src/silverlight/SilverlightMediaElement.csproj.user32
-rw-r--r--files_videoviewer/src/silverlight/SilverlightMediaElement.sln20
-rw-r--r--imprint/appinfo/app.php52
-rw-r--r--imprint/appinfo/info.xml64
-rw-r--r--imprint/appinfo/routes.php36
-rw-r--r--imprint/appinfo/version1
-rw-r--r--imprint/content.php60
-rw-r--r--imprint/css/content.css40
-rw-r--r--imprint/css/reference.css101
-rw-r--r--imprint/css/settings.css90
-rw-r--r--imprint/doc/CHANGELOG76
-rw-r--r--imprint/doc/CONFIGURATION37
-rw-r--r--imprint/doc/COPYRIGHT21
-rw-r--r--imprint/doc/CREDITS30
-rw-r--r--imprint/doc/INSTALLATION46
-rw-r--r--imprint/doc/ISSUES25
-rw-r--r--imprint/doc/LICENSE661
-rw-r--r--imprint/doc/README30
-rw-r--r--imprint/doc/ROADMAP24
-rw-r--r--imprint/doc/STATUS35
-rw-r--r--imprint/img/imprint-dusky.pngbin649 -> 0 bytes
-rw-r--r--imprint/img/imprint-dusky.svg10
-rw-r--r--imprint/img/imprint-light.pngbin1447 -> 0 bytes
-rw-r--r--imprint/img/imprint-light.svg16
-rw-r--r--imprint/index.php45
-rw-r--r--imprint/js/content.js32
-rw-r--r--imprint/js/reference.js78
-rw-r--r--imprint/js/settings.js69
-rw-r--r--imprint/l10n/af_ZA.js6
-rw-r--r--imprint/l10n/af_ZA.json4
-rw-r--r--imprint/l10n/ar.js13
-rw-r--r--imprint/l10n/ar.json11
-rw-r--r--imprint/l10n/ast.js20
-rw-r--r--imprint/l10n/ast.json18
-rw-r--r--imprint/l10n/az.js20
-rw-r--r--imprint/l10n/az.json18
-rw-r--r--imprint/l10n/bg_BG.js20
-rw-r--r--imprint/l10n/bg_BG.json18
-rw-r--r--imprint/l10n/bn_BD.js10
-rw-r--r--imprint/l10n/bn_BD.json8
-rw-r--r--imprint/l10n/bn_IN.js13
-rw-r--r--imprint/l10n/bn_IN.json11
-rw-r--r--imprint/l10n/ca.js20
-rw-r--r--imprint/l10n/ca.json18
-rw-r--r--imprint/l10n/cs_CZ.js20
-rw-r--r--imprint/l10n/cs_CZ.json18
-rw-r--r--imprint/l10n/cy_GB.js13
-rw-r--r--imprint/l10n/cy_GB.json11
-rw-r--r--imprint/l10n/da.js20
-rw-r--r--imprint/l10n/da.json18
-rw-r--r--imprint/l10n/de.js20
-rw-r--r--imprint/l10n/de.json18
-rw-r--r--imprint/l10n/de_DE.js20
-rw-r--r--imprint/l10n/de_DE.json18
-rw-r--r--imprint/l10n/el.js20
-rw-r--r--imprint/l10n/el.json18
-rw-r--r--imprint/l10n/en_GB.js20
-rw-r--r--imprint/l10n/en_GB.json18
-rw-r--r--imprint/l10n/eo.js15
-rw-r--r--imprint/l10n/eo.json13
-rw-r--r--imprint/l10n/es.js20
-rw-r--r--imprint/l10n/es.json18
-rw-r--r--imprint/l10n/es_AR.js13
-rw-r--r--imprint/l10n/es_AR.json11
-rw-r--r--imprint/l10n/es_MX.js13
-rw-r--r--imprint/l10n/es_MX.json11
-rw-r--r--imprint/l10n/et_EE.js20
-rw-r--r--imprint/l10n/et_EE.json18
-rw-r--r--imprint/l10n/eu.js18
-rw-r--r--imprint/l10n/eu.json16
-rw-r--r--imprint/l10n/fa.js17
-rw-r--r--imprint/l10n/fa.json15
-rw-r--r--imprint/l10n/fi_FI.js19
-rw-r--r--imprint/l10n/fi_FI.json17
-rw-r--r--imprint/l10n/fr.js20
-rw-r--r--imprint/l10n/fr.json18
-rw-r--r--imprint/l10n/gl.js20
-rw-r--r--imprint/l10n/gl.json18
-rw-r--r--imprint/l10n/he.js20
-rw-r--r--imprint/l10n/he.json18
-rw-r--r--imprint/l10n/hr.js7
-rw-r--r--imprint/l10n/hr.json5
-rw-r--r--imprint/l10n/hu_HU.js19
-rw-r--r--imprint/l10n/hu_HU.json17
-rw-r--r--imprint/l10n/ia.php3
-rw-r--r--imprint/l10n/id.js20
-rw-r--r--imprint/l10n/id.json18
-rw-r--r--imprint/l10n/is.js20
-rw-r--r--imprint/l10n/is.json18
-rw-r--r--imprint/l10n/it.js20
-rw-r--r--imprint/l10n/it.json18
-rw-r--r--imprint/l10n/ja.js20
-rw-r--r--imprint/l10n/ja.json18
-rw-r--r--imprint/l10n/ka_GE.js13
-rw-r--r--imprint/l10n/ka_GE.json11
-rw-r--r--imprint/l10n/km.js7
-rw-r--r--imprint/l10n/km.json5
-rw-r--r--imprint/l10n/kn.js20
-rw-r--r--imprint/l10n/kn.json18
-rw-r--r--imprint/l10n/ko.js20
-rw-r--r--imprint/l10n/ko.json18
-rw-r--r--imprint/l10n/ku_IQ.php3
-rw-r--r--imprint/l10n/lb.js9
-rw-r--r--imprint/l10n/lb.json7
-rw-r--r--imprint/l10n/lt_LT.js20
-rw-r--r--imprint/l10n/lt_LT.json18
-rw-r--r--imprint/l10n/lv.js7
-rw-r--r--imprint/l10n/lv.json5
-rw-r--r--imprint/l10n/mk.js11
-rw-r--r--imprint/l10n/mk.json9
-rw-r--r--imprint/l10n/ms_MY.php3
-rw-r--r--imprint/l10n/my_MM.php3
-rw-r--r--imprint/l10n/nb_NO.js20
-rw-r--r--imprint/l10n/nb_NO.json18
-rw-r--r--imprint/l10n/nds.js20
-rw-r--r--imprint/l10n/nds.json18
-rw-r--r--imprint/l10n/nl.js20
-rw-r--r--imprint/l10n/nl.json18
-rw-r--r--imprint/l10n/nn_NO.js13
-rw-r--r--imprint/l10n/nn_NO.json11
-rw-r--r--imprint/l10n/oc.js20
-rw-r--r--imprint/l10n/oc.json18
-rw-r--r--imprint/l10n/pl.js20
-rw-r--r--imprint/l10n/pl.json18
-rw-r--r--imprint/l10n/pt_BR.js20
-rw-r--r--imprint/l10n/pt_BR.json18
-rw-r--r--imprint/l10n/pt_PT.js20
-rw-r--r--imprint/l10n/pt_PT.json18
-rw-r--r--imprint/l10n/ro.js20
-rw-r--r--imprint/l10n/ro.json18
-rw-r--r--imprint/l10n/ru.js20
-rw-r--r--imprint/l10n/ru.json18
-rw-r--r--imprint/l10n/si_LK.php3
-rw-r--r--imprint/l10n/sk_SK.js20
-rw-r--r--imprint/l10n/sk_SK.json18
-rw-r--r--imprint/l10n/sl.js20
-rw-r--r--imprint/l10n/sl.json18
-rw-r--r--imprint/l10n/sq.js20
-rw-r--r--imprint/l10n/sq.json18
-rw-r--r--imprint/l10n/sr.js20
-rw-r--r--imprint/l10n/sr.json18
-rw-r--r--imprint/l10n/sr@latin.js20
-rw-r--r--imprint/l10n/sr@latin.json18
-rw-r--r--imprint/l10n/sv.js20
-rw-r--r--imprint/l10n/sv.json18
-rw-r--r--imprint/l10n/ta_LK.php3
-rw-r--r--imprint/l10n/th_TH.js20
-rw-r--r--imprint/l10n/th_TH.json18
-rw-r--r--imprint/l10n/tr.js20
-rw-r--r--imprint/l10n/tr.json18
-rw-r--r--imprint/l10n/ug.js9
-rw-r--r--imprint/l10n/ug.json7
-rw-r--r--imprint/l10n/uk.js20
-rw-r--r--imprint/l10n/uk.json18
-rw-r--r--imprint/l10n/ur_PK.php3
-rw-r--r--imprint/l10n/vi.js10
-rw-r--r--imprint/l10n/vi.json8
-rw-r--r--imprint/l10n/zh_CN.js14
-rw-r--r--imprint/l10n/zh_CN.json12
-rw-r--r--imprint/l10n/zh_HK.js6
-rw-r--r--imprint/l10n/zh_HK.json4
-rw-r--r--imprint/l10n/zh_TW.js20
-rw-r--r--imprint/l10n/zh_TW.json18
-rw-r--r--imprint/settings.php47
-rw-r--r--imprint/templates/tmpl_content.php44
-rw-r--r--imprint/templates/tmpl_dummy.php41
-rw-r--r--imprint/templates/tmpl_index.php35
-rw-r--r--imprint/templates/tmpl_settings.php79
-rw-r--r--imprint/vendor/chosen.jquery.README.md55
-rw-r--r--imprint/vendor/chosen.jquery.VERSION1
-rw-r--r--imprint/vendor/chosen.jquery.min.css3
-rw-r--r--imprint/vendor/chosen.jquery.min.js2
-rw-r--r--imprint/vendor/slimdown.README.md104
-rw-r--r--imprint/vendor/slimdown.php92
-rw-r--r--ownpad_lite/ajax/search.php22
-rw-r--r--ownpad_lite/ajax/settings.php39
-rw-r--r--ownpad_lite/ajax/share.php67
-rw-r--r--ownpad_lite/appinfo/app.php102
-rw-r--r--ownpad_lite/appinfo/info.xml9
-rw-r--r--ownpad_lite/appinfo/routes.php12
-rw-r--r--ownpad_lite/appinfo/version1
-rw-r--r--ownpad_lite/css/style.css8
-rw-r--r--ownpad_lite/index.php30
-rw-r--r--ownpad_lite/js/LICENSE.TXT4
-rw-r--r--ownpad_lite/js/etherpad.js97
-rw-r--r--ownpad_lite/js/ownpad_lite.php94
-rw-r--r--ownpad_lite/js/settings.js36
-rw-r--r--ownpad_lite/l10n/.gitkeep0
-rw-r--r--ownpad_lite/l10n/af_ZA.js8
-rw-r--r--ownpad_lite/l10n/af_ZA.json6
-rw-r--r--ownpad_lite/l10n/ar.js16
-rw-r--r--ownpad_lite/l10n/ar.json14
-rw-r--r--ownpad_lite/l10n/ast.js16
-rw-r--r--ownpad_lite/l10n/ast.json14
-rw-r--r--ownpad_lite/l10n/az.js16
-rw-r--r--ownpad_lite/l10n/az.json14
-rw-r--r--ownpad_lite/l10n/be.js6
-rw-r--r--ownpad_lite/l10n/be.json4
-rw-r--r--ownpad_lite/l10n/bg_BG.js16
-rw-r--r--ownpad_lite/l10n/bg_BG.json14
-rw-r--r--ownpad_lite/l10n/bn_BD.js16
-rw-r--r--ownpad_lite/l10n/bn_BD.json14
-rw-r--r--ownpad_lite/l10n/bn_IN.js16
-rw-r--r--ownpad_lite/l10n/bn_IN.json14
-rw-r--r--ownpad_lite/l10n/bs.js10
-rw-r--r--ownpad_lite/l10n/bs.json8
-rw-r--r--ownpad_lite/l10n/ca.js16
-rw-r--r--ownpad_lite/l10n/ca.json14
-rw-r--r--ownpad_lite/l10n/cs_CZ.js16
-rw-r--r--ownpad_lite/l10n/cs_CZ.json14
-rw-r--r--ownpad_lite/l10n/cy_GB.js16
-rw-r--r--ownpad_lite/l10n/cy_GB.json14
-rw-r--r--ownpad_lite/l10n/da.js16
-rw-r--r--ownpad_lite/l10n/da.json14
-rw-r--r--ownpad_lite/l10n/de.js16
-rw-r--r--ownpad_lite/l10n/de.json14
-rw-r--r--ownpad_lite/l10n/de_AT.js9
-rw-r--r--ownpad_lite/l10n/de_AT.json7
-rw-r--r--ownpad_lite/l10n/de_DE.js16
-rw-r--r--ownpad_lite/l10n/de_DE.json14
-rw-r--r--ownpad_lite/l10n/el.js16
-rw-r--r--ownpad_lite/l10n/el.json14
-rw-r--r--ownpad_lite/l10n/en_GB.js16
-rw-r--r--ownpad_lite/l10n/en_GB.json14
-rw-r--r--ownpad_lite/l10n/eo.js16
-rw-r--r--ownpad_lite/l10n/eo.json14
-rw-r--r--ownpad_lite/l10n/es.js16
-rw-r--r--ownpad_lite/l10n/es.json14
-rw-r--r--ownpad_lite/l10n/es_AR.js16
-rw-r--r--ownpad_lite/l10n/es_AR.json14
-rw-r--r--ownpad_lite/l10n/es_CL.js8
-rw-r--r--ownpad_lite/l10n/es_CL.json6
-rw-r--r--ownpad_lite/l10n/es_MX.js16
-rw-r--r--ownpad_lite/l10n/es_MX.json14
-rw-r--r--ownpad_lite/l10n/et_EE.js16
-rw-r--r--ownpad_lite/l10n/et_EE.json14
-rw-r--r--ownpad_lite/l10n/eu.js16
-rw-r--r--ownpad_lite/l10n/eu.json14
-rw-r--r--ownpad_lite/l10n/eu_ES.js6
-rw-r--r--ownpad_lite/l10n/eu_ES.json4
-rw-r--r--ownpad_lite/l10n/fa.js16
-rw-r--r--ownpad_lite/l10n/fa.json14
-rw-r--r--ownpad_lite/l10n/fi.js8
-rw-r--r--ownpad_lite/l10n/fi.json6
-rw-r--r--ownpad_lite/l10n/fi_FI.js16
-rw-r--r--ownpad_lite/l10n/fi_FI.json14
-rw-r--r--ownpad_lite/l10n/fil.js8
-rw-r--r--ownpad_lite/l10n/fil.json6
-rw-r--r--ownpad_lite/l10n/fr.js16
-rw-r--r--ownpad_lite/l10n/fr.json14
-rw-r--r--ownpad_lite/l10n/gl.js16
-rw-r--r--ownpad_lite/l10n/gl.json14
-rw-r--r--ownpad_lite/l10n/he.js16
-rw-r--r--ownpad_lite/l10n/he.json14
-rw-r--r--ownpad_lite/l10n/hi.js16
-rw-r--r--ownpad_lite/l10n/hi.json14
-rw-r--r--ownpad_lite/l10n/hr.js12
-rw-r--r--ownpad_lite/l10n/hr.json10
-rw-r--r--ownpad_lite/l10n/hu_HU.js16
-rw-r--r--ownpad_lite/l10n/hu_HU.json14
-rw-r--r--ownpad_lite/l10n/hy.js10
-rw-r--r--ownpad_lite/l10n/hy.json8
-rw-r--r--ownpad_lite/l10n/ia.js16
-rw-r--r--ownpad_lite/l10n/ia.json14
-rw-r--r--ownpad_lite/l10n/id.js16
-rw-r--r--ownpad_lite/l10n/id.json14
-rw-r--r--ownpad_lite/l10n/is.js16
-rw-r--r--ownpad_lite/l10n/is.json14
-rw-r--r--ownpad_lite/l10n/it.js16
-rw-r--r--ownpad_lite/l10n/it.json14
-rw-r--r--ownpad_lite/l10n/ja.js16
-rw-r--r--ownpad_lite/l10n/ja.json14
-rw-r--r--ownpad_lite/l10n/ka_GE.js16
-rw-r--r--ownpad_lite/l10n/ka_GE.json14
-rw-r--r--ownpad_lite/l10n/km.js13
-rw-r--r--ownpad_lite/l10n/km.json11
-rw-r--r--ownpad_lite/l10n/kn.js16
-rw-r--r--ownpad_lite/l10n/kn.json14
-rw-r--r--ownpad_lite/l10n/ko.js16
-rw-r--r--ownpad_lite/l10n/ko.json14
-rw-r--r--ownpad_lite/l10n/ku_IQ.js16
-rw-r--r--ownpad_lite/l10n/ku_IQ.json14
-rw-r--r--ownpad_lite/l10n/lb.js16
-rw-r--r--ownpad_lite/l10n/lb.json14
-rw-r--r--ownpad_lite/l10n/lt_LT.js16
-rw-r--r--ownpad_lite/l10n/lt_LT.json14
-rw-r--r--ownpad_lite/l10n/lv.js16
-rw-r--r--ownpad_lite/l10n/lv.json14
-rw-r--r--ownpad_lite/l10n/mk.js15
-rw-r--r--ownpad_lite/l10n/mk.json13
-rw-r--r--ownpad_lite/l10n/mn.js10
-rw-r--r--ownpad_lite/l10n/mn.json8
-rw-r--r--ownpad_lite/l10n/ms_MY.js16
-rw-r--r--ownpad_lite/l10n/ms_MY.json14
-rw-r--r--ownpad_lite/l10n/my_MM.js6
-rw-r--r--ownpad_lite/l10n/my_MM.json4
-rw-r--r--ownpad_lite/l10n/nb_NO.js16
-rw-r--r--ownpad_lite/l10n/nb_NO.json14
-rw-r--r--ownpad_lite/l10n/nds.js8
-rw-r--r--ownpad_lite/l10n/nds.json6
-rw-r--r--ownpad_lite/l10n/nl.js16
-rw-r--r--ownpad_lite/l10n/nl.json14
-rw-r--r--ownpad_lite/l10n/nn_NO.js16
-rw-r--r--ownpad_lite/l10n/nn_NO.json14
-rw-r--r--ownpad_lite/l10n/oc.js16
-rw-r--r--ownpad_lite/l10n/oc.json14
-rw-r--r--ownpad_lite/l10n/pa.js8
-rw-r--r--ownpad_lite/l10n/pa.json6
-rw-r--r--ownpad_lite/l10n/pl.js16
-rw-r--r--ownpad_lite/l10n/pl.json14
-rw-r--r--ownpad_lite/l10n/pt_BR.js16
-rw-r--r--ownpad_lite/l10n/pt_BR.json14
-rw-r--r--ownpad_lite/l10n/pt_PT.js16
-rw-r--r--ownpad_lite/l10n/pt_PT.json14
-rw-r--r--ownpad_lite/l10n/ro.js16
-rw-r--r--ownpad_lite/l10n/ro.json14
-rw-r--r--ownpad_lite/l10n/ru.js16
-rw-r--r--ownpad_lite/l10n/ru.json14
-rw-r--r--ownpad_lite/l10n/si_LK.js14
-rw-r--r--ownpad_lite/l10n/si_LK.json12
-rw-r--r--ownpad_lite/l10n/sk_SK.js16
-rw-r--r--ownpad_lite/l10n/sk_SK.json14
-rw-r--r--ownpad_lite/l10n/sl.js16
-rw-r--r--ownpad_lite/l10n/sl.json14
-rw-r--r--ownpad_lite/l10n/sq.js16
-rw-r--r--ownpad_lite/l10n/sq.json14
-rw-r--r--ownpad_lite/l10n/sr.js16
-rw-r--r--ownpad_lite/l10n/sr.json14
-rw-r--r--ownpad_lite/l10n/sr@latin.js16
-rw-r--r--ownpad_lite/l10n/sr@latin.json14
-rw-r--r--ownpad_lite/l10n/sv.js16
-rw-r--r--ownpad_lite/l10n/sv.json14
-rw-r--r--ownpad_lite/l10n/ta_IN.js6
-rw-r--r--ownpad_lite/l10n/ta_IN.json4
-rw-r--r--ownpad_lite/l10n/ta_LK.js14
-rw-r--r--ownpad_lite/l10n/ta_LK.json12
-rw-r--r--ownpad_lite/l10n/te.js8
-rw-r--r--ownpad_lite/l10n/te.json6
-rw-r--r--ownpad_lite/l10n/th_TH.js16
-rw-r--r--ownpad_lite/l10n/th_TH.json14
-rw-r--r--ownpad_lite/l10n/tr.js16
-rw-r--r--ownpad_lite/l10n/tr.json14
-rw-r--r--ownpad_lite/l10n/ug.js11
-rw-r--r--ownpad_lite/l10n/ug.json9
-rw-r--r--ownpad_lite/l10n/uk.js16
-rw-r--r--ownpad_lite/l10n/uk.json14
-rw-r--r--ownpad_lite/l10n/ur_PK.js16
-rw-r--r--ownpad_lite/l10n/ur_PK.json14
-rw-r--r--ownpad_lite/l10n/vi.js16
-rw-r--r--ownpad_lite/l10n/vi.json14
-rw-r--r--ownpad_lite/l10n/zh_CN.js16
-rw-r--r--ownpad_lite/l10n/zh_CN.json14
-rw-r--r--ownpad_lite/l10n/zh_HK.js11
-rw-r--r--ownpad_lite/l10n/zh_HK.json9
-rw-r--r--ownpad_lite/l10n/zh_TW.js16
-rw-r--r--ownpad_lite/l10n/zh_TW.json14
-rw-r--r--ownpad_lite/lib/contacts.php43
-rw-r--r--ownpad_lite/settings.php20
-rw-r--r--ownpad_lite/templates/index.php26
-rw-r--r--ownpad_lite/templates/settings.php30
-rwxr-xr-xpushnotifications/TODO5
-rwxr-xr-xpushnotifications/ajax/changepushid.php29
-rwxr-xr-xpushnotifications/appinfo/app.php31
-rwxr-xr-xpushnotifications/appinfo/info.xml12
-rwxr-xr-xpushnotifications/appinfo/routes.php15
-rwxr-xr-xpushnotifications/appinfo/version1
-rwxr-xr-xpushnotifications/css/personal.css11
-rwxr-xr-xpushnotifications/js/personal.js18
-rwxr-xr-xpushnotifications/l10n/.gitkeep0
-rwxr-xr-xpushnotifications/lib/Pushover.php494
-rwxr-xr-xpushnotifications/lib/push.php73
-rwxr-xr-xpushnotifications/personal.php26
-rwxr-xr-xpushnotifications/templates/personal.php12
-rwxr-xr-xreader/ajax/canvas_saver.php23
-rw-r--r--reader/ajax/remove_tags.php16
-rwxr-xr-xreader/ajax/tags.php15
-rwxr-xr-xreader/ajax/thumbnail.php14
-rwxr-xr-xreader/appinfo/app.php19
-rwxr-xr-xreader/appinfo/database.xml37
-rwxr-xr-xreader/appinfo/info.xml18
-rwxr-xr-xreader/css/reader.css33
-rwxr-xr-xreader/fetch_tags.php17
-rwxr-xr-xreader/img/directory.jpgbin3214 -> 0 bytes
-rwxr-xr-xreader/img/download.jpgbin3214 -> 0 bytes
-rwxr-xr-xreader/img/images.jpgbin2405 -> 0 bytes
-rw-r--r--reader/img/reader.pngbin262 -> 0 bytes
-rwxr-xr-xreader/index.php26
-rwxr-xr-xreader/js/.goutputstream-7F73MW218
-rwxr-xr-xreader/js/.goutputstream-CZ9VOW157
-rwxr-xr-xreader/js/.goutputstream-GYESPW161
-rwxr-xr-xreader/js/.goutputstream-H39LNW189
-rwxr-xr-xreader/js/.goutputstream-PFE3KW0
-rwxr-xr-xreader/js/integrate.js166
-rwxr-xr-xreader/js/pdf.js36074
-rwxr-xr-xreader/lib/dir.php19
-rwxr-xr-xreader/lib/library_display.php95
-rwxr-xr-xreader/lib/search.php16
-rwxr-xr-xreader/lib/tag_utils.php56
-rwxr-xr-xreader/lib/thumbnail.php35
-rwxr-xr-xreader/results.php18
-rwxr-xr-xreader/templates/index.php99
-rwxr-xr-xreader/templates/results.php44
-rwxr-xr-xreader/templates/tagged.php26
-rw-r--r--search/appinfo/app.php9
-rw-r--r--search/appinfo/info.xml14
-rw-r--r--search/appinfo/version1
-rw-r--r--search/css/search.css6
-rw-r--r--search/index.php76
-rw-r--r--search/templates/index.php43
-rw-r--r--tattoo/ajax/bg.php6
-rw-r--r--tattoo/appinfo/app.php30
-rw-r--r--tattoo/appinfo/info.xml9
-rw-r--r--tattoo/appinfo/version1
-rw-r--r--tattoo/css/settings.css3
-rw-r--r--tattoo/css/tattoo.css1
-rw-r--r--tattoo/img/tattoo-cat.pngbin7746 -> 0 bytes
-rw-r--r--tattoo/img/tattoo-clouds.pngbin5515 -> 0 bytes
-rw-r--r--tattoo/img/tattoo-sun.pngbin27273 -> 0 bytes
-rw-r--r--tattoo/img/tattoo-tattoo.pngbin74180 -> 0 bytes
-rw-r--r--tattoo/js/tattoo.js8
-rw-r--r--tattoo/settings.php15
-rw-r--r--tattoo/templates/settings.php28
-rw-r--r--user_persona/COPYING-AGPL661
-rw-r--r--user_persona/README42
-rw-r--r--user_persona/ajax/save.php17
-rw-r--r--user_persona/appinfo/app.php41
-rw-r--r--user_persona/appinfo/info.xml15
-rw-r--r--user_persona/changelog11
-rw-r--r--user_persona/img/sign_in_blue.pngbin1798 -> 0 bytes
-rw-r--r--user_persona/js/settings.js8
-rw-r--r--user_persona/js/utils.js83
-rw-r--r--user_persona/lib/cacert.pem3331
-rw-r--r--user_persona/lib/policy.php123
-rw-r--r--user_persona/lib/validator.php107
-rw-r--r--user_persona/settings.php23
-rw-r--r--user_persona/templates/settings.php23
-rw-r--r--user_persona/user_persona.php61
-rw-r--r--user_saml/CHANGELOG.txt35
-rw-r--r--user_saml/README.md57
-rw-r--r--user_saml/appinfo/app.php101
-rw-r--r--user_saml/appinfo/info.xml13
-rw-r--r--user_saml/appinfo/version1
-rw-r--r--user_saml/auth.php34
-rw-r--r--user_saml/css/saml.css26
-rw-r--r--user_saml/img/logo.jpgbin4096 -> 0 bytes
-rw-r--r--user_saml/js/settings.js3
-rw-r--r--user_saml/js/utils.js66
-rw-r--r--user_saml/lib/hooks.php196
-rw-r--r--user_saml/settings.php73
-rw-r--r--user_saml/templates/settings.php32
-rw-r--r--user_saml/user_saml.php110
494 files changed, 0 insertions, 63993 deletions
diff --git a/emoji/app.php b/emoji/app.php
deleted file mode 100644
index 066e037e6..000000000
--- a/emoji/app.php
+++ /dev/null
@@ -1,2096 +0,0 @@
-<?php
-
-/**
- * FROM https://github.com/iamcal/php-emoji
- */
-
-namespace OCA\Emoji;
-
-
-class App {
- private $maps;
-
- public function __construct() {
- $this->maps = array(
- 'names' => array(
- "\xe2\x98\x80" => 'BLACK SUN WITH RAYS',
- "\xe2\x98\x81" => 'CLOUD',
- "\xe2\x98\x94" => 'UMBRELLA WITH RAIN DROPS',
- "\xe2\x9b\x84" => 'SNOWMAN WITHOUT SNOW',
- "\xe2\x9a\xa1" => 'HIGH VOLTAGE SIGN',
- "\xf0\x9f\x8c\x80" => 'CYCLONE',
- "\xf0\x9f\x8c\x81" => 'FOGGY',
- "\xf0\x9f\x8c\x82" => 'CLOSED UMBRELLA',
- "\xf0\x9f\x8c\x83" => 'NIGHT WITH STARS',
- "\xf0\x9f\x8c\x84" => 'SUNRISE OVER MOUNTAINS',
- "\xf0\x9f\x8c\x85" => 'SUNRISE',
- "\xf0\x9f\x8c\x86" => 'CITYSCAPE AT DUSK',
- "\xf0\x9f\x8c\x87" => 'SUNSET OVER BUILDINGS',
- "\xf0\x9f\x8c\x88" => 'RAINBOW',
- "\xe2\x9d\x84" => 'SNOWFLAKE',
- "\xe2\x9b\x85" => 'SUN BEHIND CLOUD',
- "\xf0\x9f\x8c\x89" => 'BRIDGE AT NIGHT',
- "\xf0\x9f\x8c\x8a" => 'WATER WAVE',
- "\xf0\x9f\x8c\x8b" => 'VOLCANO',
- "\xf0\x9f\x8c\x8c" => 'MILKY WAY',
- "\xf0\x9f\x8c\x8f" => 'EARTH GLOBE ASIA-AUSTRALIA',
- "\xf0\x9f\x8c\x91" => 'NEW MOON SYMBOL',
- "\xf0\x9f\x8c\x94" => 'WAXING GIBBOUS MOON SYMBOL',
- "\xf0\x9f\x8c\x93" => 'FIRST QUARTER MOON SYMBOL',
- "\xf0\x9f\x8c\x99" => 'CRESCENT MOON',
- "\xf0\x9f\x8c\x95" => 'FULL MOON SYMBOL',
- "\xf0\x9f\x8c\x9b" => 'FIRST QUARTER MOON WITH FACE',
- "\xf0\x9f\x8c\x9f" => 'GLOWING STAR',
- "\xf0\x9f\x8c\xa0" => 'SHOOTING STAR',
- "\xf0\x9f\x95\x90" => 'CLOCK FACE ONE OCLOCK',
- "\xf0\x9f\x95\x91" => 'CLOCK FACE TWO OCLOCK',
- "\xf0\x9f\x95\x92" => 'CLOCK FACE THREE OCLOCK',
- "\xf0\x9f\x95\x93" => 'CLOCK FACE FOUR OCLOCK',
- "\xf0\x9f\x95\x94" => 'CLOCK FACE FIVE OCLOCK',
- "\xf0\x9f\x95\x95" => 'CLOCK FACE SIX OCLOCK',
- "\xf0\x9f\x95\x96" => 'CLOCK FACE SEVEN OCLOCK',
- "\xf0\x9f\x95\x97" => 'CLOCK FACE EIGHT OCLOCK',
- "\xf0\x9f\x95\x98" => 'CLOCK FACE NINE OCLOCK',
- "\xf0\x9f\x95\x99" => 'CLOCK FACE TEN OCLOCK',
- "\xf0\x9f\x95\x9a" => 'CLOCK FACE ELEVEN OCLOCK',
- "\xf0\x9f\x95\x9b" => 'CLOCK FACE TWELVE OCLOCK',
- "\xe2\x8c\x9a" => 'WATCH',
- "\xe2\x8c\x9b" => 'HOURGLASS',
- "\xe2\x8f\xb0" => 'ALARM CLOCK',
- "\xe2\x8f\xb3" => 'HOURGLASS WITH FLOWING SAND',
- "\xe2\x99\x88" => 'ARIES',
- "\xe2\x99\x89" => 'TAURUS',
- "\xe2\x99\x8a" => 'GEMINI',
- "\xe2\x99\x8b" => 'CANCER',
- "\xe2\x99\x8c" => 'LEO',
- "\xe2\x99\x8d" => 'VIRGO',
- "\xe2\x99\x8e" => 'LIBRA',
- "\xe2\x99\x8f" => 'SCORPIUS',
- "\xe2\x99\x90" => 'SAGITTARIUS',
- "\xe2\x99\x91" => 'CAPRICORN',
- "\xe2\x99\x92" => 'AQUARIUS',
- "\xe2\x99\x93" => 'PISCES',
- "\xe2\x9b\x8e" => 'OPHIUCHUS',
- "\xf0\x9f\x8d\x80" => 'FOUR LEAF CLOVER',
- "\xf0\x9f\x8c\xb7" => 'TULIP',
- "\xf0\x9f\x8c\xb1" => 'SEEDLING',
- "\xf0\x9f\x8d\x81" => 'MAPLE LEAF',
- "\xf0\x9f\x8c\xb8" => 'CHERRY BLOSSOM',
- "\xf0\x9f\x8c\xb9" => 'ROSE',
- "\xf0\x9f\x8d\x82" => 'FALLEN LEAF',
- "\xf0\x9f\x8d\x83" => 'LEAF FLUTTERING IN WIND',
- "\xf0\x9f\x8c\xba" => 'HIBISCUS',
- "\xf0\x9f\x8c\xbb" => 'SUNFLOWER',
- "\xf0\x9f\x8c\xb4" => 'PALM TREE',
- "\xf0\x9f\x8c\xb5" => 'CACTUS',
- "\xf0\x9f\x8c\xbe" => 'EAR OF RICE',
- "\xf0\x9f\x8c\xbd" => 'EAR OF MAIZE',
- "\xf0\x9f\x8d\x84" => 'MUSHROOM',
- "\xf0\x9f\x8c\xb0" => 'CHESTNUT',
- "\xf0\x9f\x8c\xbc" => 'BLOSSOM',
- "\xf0\x9f\x8c\xbf" => 'HERB',
- "\xf0\x9f\x8d\x92" => 'CHERRIES',
- "\xf0\x9f\x8d\x8c" => 'BANANA',
- "\xf0\x9f\x8d\x8e" => 'RED APPLE',
- "\xf0\x9f\x8d\x8a" => 'TANGERINE',
- "\xf0\x9f\x8d\x93" => 'STRAWBERRY',
- "\xf0\x9f\x8d\x89" => 'WATERMELON',
- "\xf0\x9f\x8d\x85" => 'TOMATO',
- "\xf0\x9f\x8d\x86" => 'AUBERGINE',
- "\xf0\x9f\x8d\x88" => 'MELON',
- "\xf0\x9f\x8d\x8d" => 'PINEAPPLE',
- "\xf0\x9f\x8d\x87" => 'GRAPES',
- "\xf0\x9f\x8d\x91" => 'PEACH',
- "\xf0\x9f\x8d\x8f" => 'GREEN APPLE',
- "\xf0\x9f\x91\x80" => 'EYES',
- "\xf0\x9f\x91\x82" => 'EAR',
- "\xf0\x9f\x91\x83" => 'NOSE',
- "\xf0\x9f\x91\x84" => 'MOUTH',
- "\xf0\x9f\x91\x85" => 'TONGUE',
- "\xf0\x9f\x92\x84" => 'LIPSTICK',
- "\xf0\x9f\x92\x85" => 'NAIL POLISH',
- "\xf0\x9f\x92\x86" => 'FACE MASSAGE',
- "\xf0\x9f\x92\x87" => 'HAIRCUT',
- "\xf0\x9f\x92\x88" => 'BARBER POLE',
- "\xf0\x9f\x91\xa4" => 'BUST IN SILHOUETTE',
- "\xf0\x9f\x91\xa6" => 'BOY',
- "\xf0\x9f\x91\xa7" => 'GIRL',
- "\xf0\x9f\x91\xa8" => 'MAN',
- "\xf0\x9f\x91\xa9" => 'WOMAN',
- "\xf0\x9f\x91\xaa" => 'FAMILY',
- "\xf0\x9f\x91\xab" => 'MAN AND WOMAN HOLDING HANDS',
- "\xf0\x9f\x91\xae" => 'POLICE OFFICER',
- "\xf0\x9f\x91\xaf" => 'WOMAN WITH BUNNY EARS',
- "\xf0\x9f\x91\xb0" => 'BRIDE WITH VEIL',
- "\xf0\x9f\x91\xb1" => 'PERSON WITH BLOND HAIR',
- "\xf0\x9f\x91\xb2" => 'MAN WITH GUA PI MAO',
- "\xf0\x9f\x91\xb3" => 'MAN WITH TURBAN',
- "\xf0\x9f\x91\xb4" => 'OLDER MAN',
- "\xf0\x9f\x91\xb5" => 'OLDER WOMAN',
- "\xf0\x9f\x91\xb6" => 'BABY',
- "\xf0\x9f\x91\xb7" => 'CONSTRUCTION WORKER',
- "\xf0\x9f\x91\xb8" => 'PRINCESS',
- "\xf0\x9f\x91\xb9" => 'JAPANESE OGRE',
- "\xf0\x9f\x91\xba" => 'JAPANESE GOBLIN',
- "\xf0\x9f\x91\xbb" => 'GHOST',
- "\xf0\x9f\x91\xbc" => 'BABY ANGEL',
- "\xf0\x9f\x91\xbd" => 'EXTRATERRESTRIAL ALIEN',
- "\xf0\x9f\x91\xbe" => 'ALIEN MONSTER',
- "\xf0\x9f\x91\xbf" => 'IMP',
- "\xf0\x9f\x92\x80" => 'SKULL',
- "\xf0\x9f\x92\x81" => 'INFORMATION DESK PERSON',
- "\xf0\x9f\x92\x82" => 'GUARDSMAN',
- "\xf0\x9f\x92\x83" => 'DANCER',
- "\xf0\x9f\x90\x8c" => 'SNAIL',
- "\xf0\x9f\x90\x8d" => 'SNAKE',
- "\xf0\x9f\x90\x8e" => 'HORSE',
- "\xf0\x9f\x90\x94" => 'CHICKEN',
- "\xf0\x9f\x90\x97" => 'BOAR',
- "\xf0\x9f\x90\xab" => 'BACTRIAN CAMEL',
- "\xf0\x9f\x90\x98" => 'ELEPHANT',
- "\xf0\x9f\x90\xa8" => 'KOALA',
- "\xf0\x9f\x90\x92" => 'MONKEY',
- "\xf0\x9f\x90\x91" => 'SHEEP',
- "\xf0\x9f\x90\x99" => 'OCTOPUS',
- "\xf0\x9f\x90\x9a" => 'SPIRAL SHELL',
- "\xf0\x9f\x90\x9b" => 'BUG',
- "\xf0\x9f\x90\x9c" => 'ANT',
- "\xf0\x9f\x90\x9d" => 'HONEYBEE',
- "\xf0\x9f\x90\x9e" => 'LADY BEETLE',
- "\xf0\x9f\x90\xa0" => 'TROPICAL FISH',
- "\xf0\x9f\x90\xa1" => 'BLOWFISH',
- "\xf0\x9f\x90\xa2" => 'TURTLE',
- "\xf0\x9f\x90\xa4" => 'BABY CHICK',
- "\xf0\x9f\x90\xa5" => 'FRONT-FACING BABY CHICK',
- "\xf0\x9f\x90\xa6" => 'BIRD',
- "\xf0\x9f\x90\xa3" => 'HATCHING CHICK',
- "\xf0\x9f\x90\xa7" => 'PENGUIN',
- "\xf0\x9f\x90\xa9" => 'POODLE',
- "\xf0\x9f\x90\x9f" => 'FISH',
- "\xf0\x9f\x90\xac" => 'DOLPHIN',
- "\xf0\x9f\x90\xad" => 'MOUSE FACE',
- "\xf0\x9f\x90\xaf" => 'TIGER FACE',
- "\xf0\x9f\x90\xb1" => 'CAT FACE',
- "\xf0\x9f\x90\xb3" => 'SPOUTING WHALE',
- "\xf0\x9f\x90\xb4" => 'HORSE FACE',
- "\xf0\x9f\x90\xb5" => 'MONKEY FACE',
- "\xf0\x9f\x90\xb6" => 'DOG FACE',
- "\xf0\x9f\x90\xb7" => 'PIG FACE',
- "\xf0\x9f\x90\xbb" => 'BEAR FACE',
- "\xf0\x9f\x90\xb9" => 'HAMSTER FACE',
- "\xf0\x9f\x90\xba" => 'WOLF FACE',
- "\xf0\x9f\x90\xae" => 'COW FACE',
- "\xf0\x9f\x90\xb0" => 'RABBIT FACE',
- "\xf0\x9f\x90\xb8" => 'FROG FACE',
- "\xf0\x9f\x90\xbe" => 'PAW PRINTS',
- "\xf0\x9f\x90\xb2" => 'DRAGON FACE',
- "\xf0\x9f\x90\xbc" => 'PANDA FACE',
- "\xf0\x9f\x90\xbd" => 'PIG NOSE',
- "\xf0\x9f\x98\xa0" => 'ANGRY FACE',
- "\xf0\x9f\x98\xa9" => 'WEARY FACE',
- "\xf0\x9f\x98\xb2" => 'ASTONISHED FACE',
- "\xf0\x9f\x98\x9e" => 'DISAPPOINTED FACE',
- "\xf0\x9f\x98\xb5" => 'DIZZY FACE',
- "\xf0\x9f\x98\xb0" => 'FACE WITH OPEN MOUTH AND COLD SWEAT',
- "\xf0\x9f\x98\x92" => 'UNAMUSED FACE',
- "\xf0\x9f\x98\x8d" => 'SMILING FACE WITH HEART-SHAPED EYES',
- "\xf0\x9f\x98\xa4" => 'FACE WITH LOOK OF TRIUMPH',
- "\xf0\x9f\x98\x9c" => 'FACE WITH STUCK-OUT TONGUE AND WINKING EYE',
- "\xf0\x9f\x98\x9d" => 'FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES',
- "\xf0\x9f\x98\x8b" => 'FACE SAVOURING DELICIOUS FOOD',
- "\xf0\x9f\x98\x98" => 'FACE THROWING A KISS',
- "\xf0\x9f\x98\x9a" => 'KISSING FACE WITH CLOSED EYES',
- "\xf0\x9f\x98\xb7" => 'FACE WITH MEDICAL MASK',
- "\xf0\x9f\x98\xb3" => 'FLUSHED FACE',
- "\xf0\x9f\x98\x83" => 'SMILING FACE WITH OPEN MOUTH',
- "\xf0\x9f\x98\x85" => 'SMILING FACE WITH OPEN MOUTH AND COLD SWEAT',
- "\xf0\x9f\x98\x86" => 'SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES',
- "\xf0\x9f\x98\x81" => 'GRINNING FACE WITH SMILING EYES',
- "\xf0\x9f\x98\x82" => 'FACE WITH TEARS OF JOY',
- "\xf0\x9f\x98\x8a" => 'SMILING FACE WITH SMILING EYES',
- "\xe2\x98\xba" => 'WHITE SMILING FACE',
- "\xf0\x9f\x98\x84" => 'SMILING FACE WITH OPEN MOUTH AND SMILING EYES',
- "\xf0\x9f\x98\xa2" => 'CRYING FACE',
- "\xf0\x9f\x98\xad" => 'LOUDLY CRYING FACE',
- "\xf0\x9f\x98\xa8" => 'FEARFUL FACE',
- "\xf0\x9f\x98\xa3" => 'PERSEVERING FACE',
- "\xf0\x9f\x98\xa1" => 'POUTING FACE',
- "\xf0\x9f\x98\x8c" => 'RELIEVED FACE',
- "\xf0\x9f\x98\x96" => 'CONFOUNDED FACE',
- "\xf0\x9f\x98\x94" => 'PENSIVE FACE',
- "\xf0\x9f\x98\xb1" => 'FACE SCREAMING IN FEAR',
- "\xf0\x9f\x98\xaa" => 'SLEEPY FACE',
- "\xf0\x9f\x98\x8f" => 'SMIRKING FACE',
- "\xf0\x9f\x98\x93" => 'FACE WITH COLD SWEAT',
- "\xf0\x9f\x98\xa5" => 'DISAPPOINTED BUT RELIEVED FACE',
- "\xf0\x9f\x98\xab" => 'TIRED FACE',
- "\xf0\x9f\x98\x89" => 'WINKING FACE',
- "\xf0\x9f\x98\xba" => 'SMILING CAT FACE WITH OPEN MOUTH',
- "\xf0\x9f\x98\xb8" => 'GRINNING CAT FACE WITH SMILING EYES',
- "\xf0\x9f\x98\xb9" => 'CAT FACE WITH TEARS OF JOY',
- "\xf0\x9f\x98\xbd" => 'KISSING CAT FACE WITH CLOSED EYES',
- "\xf0\x9f\x98\xbb" => 'SMILING CAT FACE WITH HEART-SHAPED EYES',
- "\xf0\x9f\x98\xbf" => 'CRYING CAT FACE',
- "\xf0\x9f\x98\xbe" => 'POUTING CAT FACE',
- "\xf0\x9f\x98\xbc" => 'CAT FACE WITH WRY SMILE',
- "\xf0\x9f\x99\x80" => 'WEARY CAT FACE',
- "\xf0\x9f\x99\x85" => 'FACE WITH NO GOOD GESTURE',
- "\xf0\x9f\x99\x86" => 'FACE WITH OK GESTURE',
- "\xf0\x9f\x99\x87" => 'PERSON BOWING DEEPLY',
- "\xf0\x9f\x99\x88" => 'SEE-NO-EVIL MONKEY',
- "\xf0\x9f\x99\x8a" => 'SPEAK-NO-EVIL MONKEY',
- "\xf0\x9f\x99\x89" => 'HEAR-NO-EVIL MONKEY',
- "\xf0\x9f\x99\x8b" => 'HAPPY PERSON RAISING ONE HAND',
- "\xf0\x9f\x99\x8c" => 'PERSON RAISING BOTH HANDS IN CELEBRATION',
- "\xf0\x9f\x99\x8d" => 'PERSON FROWNING',
- "\xf0\x9f\x99\x8e" => 'PERSON WITH POUTING FACE',
- "\xf0\x9f\x99\x8f" => 'PERSON WITH FOLDED HANDS',
- "\xf0\x9f\x8f\xa0" => 'HOUSE BUILDING',
- "\xf0\x9f\x8f\xa1" => 'HOUSE WITH GARDEN',
- "\xf0\x9f\x8f\xa2" => 'OFFICE BUILDING',
- "\xf0\x9f\x8f\xa3" => 'JAPANESE POST OFFICE',
- "\xf0\x9f\x8f\xa5" => 'HOSPITAL',
- "\xf0\x9f\x8f\xa6" => 'BANK',
- "\xf0\x9f\x8f\xa7" => 'AUTOMATED TELLER MACHINE',
- "\xf0\x9f\x8f\xa8" => 'HOTEL',
- "\xf0\x9f\x8f\xa9" => 'LOVE HOTEL',
- "\xf0\x9f\x8f\xaa" => 'CONVENIENCE STORE',
- "\xf0\x9f\x8f\xab" => 'SCHOOL',
- "\xe2\x9b\xaa" => 'CHURCH',
- "\xe2\x9b\xb2" => 'FOUNTAIN',
- "\xf0\x9f\x8f\xac" => 'DEPARTMENT STORE',
- "\xf0\x9f\x8f\xaf" => 'JAPANESE CASTLE',
- "\xf0\x9f\x8f\xb0" => 'EUROPEAN CASTLE',
- "\xf0\x9f\x8f\xad" => 'FACTORY',
- "\xe2\x9a\x93" => 'ANCHOR',
- "\xf0\x9f\x8f\xae" => 'IZAKAYA LANTERN',
- "\xf0\x9f\x97\xbb" => 'MOUNT FUJI',
- "\xf0\x9f\x97\xbc" => 'TOKYO TOWER',
- "\xf0\x9f\x97\xbd" => 'STATUE OF LIBERTY',
- "\xf0\x9f\x97\xbe" => 'SILHOUETTE OF JAPAN',
- "\xf0\x9f\x97\xbf" => 'MOYAI',
- "\xf0\x9f\x91\x9e" => 'MANS SHOE',
- "\xf0\x9f\x91\x9f" => 'ATHLETIC SHOE',
- "\xf0\x9f\x91\xa0" => 'HIGH-HEELED SHOE',
- "\xf0\x9f\x91\xa1" => 'WOMANS SANDAL',
- "\xf0\x9f\x91\xa2" => 'WOMANS BOOTS',
- "\xf0\x9f\x91\xa3" => 'FOOTPRINTS',
- "\xf0\x9f\x91\x93" => 'EYEGLASSES',
- "\xf0\x9f\x91\x95" => 'T-SHIRT',
- "\xf0\x9f\x91\x96" => 'JEANS',
- "\xf0\x9f\x91\x91" => 'CROWN',
- "\xf0\x9f\x91\x94" => 'NECKTIE',
- "\xf0\x9f\x91\x92" => 'WOMANS HAT',
- "\xf0\x9f\x91\x97" => 'DRESS',
- "\xf0\x9f\x91\x98" => 'KIMONO',
- "\xf0\x9f\x91\x99" => 'BIKINI',
- "\xf0\x9f\x91\x9a" => 'WOMANS CLOTHES',
- "\xf0\x9f\x91\x9b" => 'PURSE',
- "\xf0\x9f\x91\x9c" => 'HANDBAG',
- "\xf0\x9f\x91\x9d" => 'POUCH',
- "\xf0\x9f\x92\xb0" => 'MONEY BAG',
- "\xf0\x9f\x92\xb1" => 'CURRENCY EXCHANGE',
- "\xf0\x9f\x92\xb9" => 'CHART WITH UPWARDS TREND AND YEN SIGN',
- "\xf0\x9f\x92\xb2" => 'HEAVY DOLLAR SIGN',
- "\xf0\x9f\x92\xb3" => 'CREDIT CARD',
- "\xf0\x9f\x92\xb4" => 'BANKNOTE WITH YEN SIGN',
- "\xf0\x9f\x92\xb5" => 'BANKNOTE WITH DOLLAR SIGN',
- "\xf0\x9f\x92\xb8" => 'MONEY WITH WINGS',
- "\xf0\x9f\x87\xa8\xf0\x9f\x87\xb3" => 'REGIONAL INDICATOR SYMBOL LETTERS CN',
- "\xf0\x9f\x87\xa9\xf0\x9f\x87\xaa" => 'REGIONAL INDICATOR SYMBOL LETTERS DE',
- "\xf0\x9f\x87\xaa\xf0\x9f\x87\xb8" => 'REGIONAL INDICATOR SYMBOL LETTERS ES',
- "\xf0\x9f\x87\xab\xf0\x9f\x87\xb7" => 'REGIONAL INDICATOR SYMBOL LETTERS FR',
- "\xf0\x9f\x87\xac\xf0\x9f\x87\xa7" => 'REGIONAL INDICATOR SYMBOL LETTERS GB',
- "\xf0\x9f\x87\xae\xf0\x9f\x87\xb9" => 'REGIONAL INDICATOR SYMBOL LETTERS IT',
- "\xf0\x9f\x87\xaf\xf0\x9f\x87\xb5" => 'REGIONAL INDICATOR SYMBOL LETTERS JP',
- "\xf0\x9f\x87\xb0\xf0\x9f\x87\xb7" => 'REGIONAL INDICATOR SYMBOL LETTERS KR',
- "\xf0\x9f\x87\xb7\xf0\x9f\x87\xba" => 'REGIONAL INDICATOR SYMBOL LETTERS RU',
- "\xf0\x9f\x87\xba\xf0\x9f\x87\xb8" => 'REGIONAL INDICATOR SYMBOL LETTERS US',
- "\xf0\x9f\x94\xa5" => 'FIRE',
- "\xf0\x9f\x94\xa6" => 'ELECTRIC TORCH',
- "\xf0\x9f\x94\xa7" => 'WRENCH',
- "\xf0\x9f\x94\xa8" => 'HAMMER',
- "\xf0\x9f\x94\xa9" => 'NUT AND BOLT',
- "\xf0\x9f\x94\xaa" => 'HOCHO',
- "\xf0\x9f\x94\xab" => 'PISTOL',
- "\xf0\x9f\x94\xae" => 'CRYSTAL BALL',
- "\xf0\x9f\x94\xaf" => 'SIX POINTED STAR WITH MIDDLE DOT',
- "\xf0\x9f\x94\xb0" => 'JAPANESE SYMBOL FOR BEGINNER',
- "\xf0\x9f\x94\xb1" => 'TRIDENT EMBLEM',
- "\xf0\x9f\x92\x89" => 'SYRINGE',
- "\xf0\x9f\x92\x8a" => 'PILL',
- "\xf0\x9f\x85\xb0" => 'NEGATIVE SQUARED LATIN CAPITAL LETTER A',
- "\xf0\x9f\x85\xb1" => 'NEGATIVE SQUARED LATIN CAPITAL LETTER B',
- "\xf0\x9f\x86\x8e" => 'NEGATIVE SQUARED AB',
- "\xf0\x9f\x85\xbe" => 'NEGATIVE SQUARED LATIN CAPITAL LETTER O',
- "\xf0\x9f\x8e\x80" => 'RIBBON',
- "\xf0\x9f\x8e\x81" => 'WRAPPED PRESENT',
- "\xf0\x9f\x8e\x82" => 'BIRTHDAY CAKE',
- "\xf0\x9f\x8e\x84" => 'CHRISTMAS TREE',
- "\xf0\x9f\x8e\x85" => 'FATHER CHRISTMAS',
- "\xf0\x9f\x8e\x8c" => 'CROSSED FLAGS',
- "\xf0\x9f\x8e\x86" => 'FIREWORKS',
- "\xf0\x9f\x8e\x88" => 'BALLOON',
- "\xf0\x9f\x8e\x89" => 'PARTY POPPER',
- "\xf0\x9f\x8e\x8d" => 'PINE DECORATION',
- "\xf0\x9f\x8e\x8e" => 'JAPANESE DOLLS',
- "\xf0\x9f\x8e\x93" => 'GRADUATION CAP',
- "\xf0\x9f\x8e\x92" => 'SCHOOL SATCHEL',
- "\xf0\x9f\x8e\x8f" => 'CARP STREAMER',
- "\xf0\x9f\x8e\x87" => 'FIREWORK SPARKLER',
- "\xf0\x9f\x8e\x90" => 'WIND CHIME',
- "\xf0\x9f\x8e\x83" => 'JACK-O-LANTERN',
- "\xf0\x9f\x8e\x8a" => 'CONFETTI BALL',
- "\xf0\x9f\x8e\x8b" => 'TANABATA TREE',
- "\xf0\x9f\x8e\x91" => 'MOON VIEWING CEREMONY',
- "\xf0\x9f\x93\x9f" => 'PAGER',
- "\xe2\x98\x8e" => 'BLACK TELEPHONE',
- "\xf0\x9f\x93\x9e" => 'TELEPHONE RECEIVER',
- "\xf0\x9f\x93\xb1" => 'MOBILE PHONE',
- "\xf0\x9f\x93\xb2" => 'MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT',
- "\xf0\x9f\x93\x9d" => 'MEMO',
- "\xf0\x9f\x93\xa0" => 'FAX MACHINE',
- "\xe2\x9c\x89" => 'ENVELOPE',
- "\xf0\x9f\x93\xa8" => 'INCOMING ENVELOPE',
- "\xf0\x9f\x93\xa9" => 'ENVELOPE WITH DOWNWARDS ARROW ABOVE',
- "\xf0\x9f\x93\xaa" => 'CLOSED MAILBOX WITH LOWERED FLAG',
- "\xf0\x9f\x93\xab" => 'CLOSED MAILBOX WITH RAISED FLAG',
- "\xf0\x9f\x93\xae" => 'POSTBOX',
- "\xf0\x9f\x93\xb0" => 'NEWSPAPER',
- "\xf0\x9f\x93\xa2" => 'PUBLIC ADDRESS LOUDSPEAKER',
- "\xf0\x9f\x93\xa3" => 'CHEERING MEGAPHONE',
- "\xf0\x9f\x93\xa1" => 'SATELLITE ANTENNA',
- "\xf0\x9f\x93\xa4" => 'OUTBOX TRAY',
- "\xf0\x9f\x93\xa5" => 'INBOX TRAY',
- "\xf0\x9f\x93\xa6" => 'PACKAGE',
- "\xf0\x9f\x93\xa7" => 'E-MAIL SYMBOL',
- "\xf0\x9f\x94\xa0" => 'INPUT SYMBOL FOR LATIN CAPITAL LETTERS',
- "\xf0\x9f\x94\xa1" => 'INPUT SYMBOL FOR LATIN SMALL LETTERS',
- "\xf0\x9f\x94\xa2" => 'INPUT SYMBOL FOR NUMBERS',
- "\xf0\x9f\x94\xa3" => 'INPUT SYMBOL FOR SYMBOLS',
- "\xf0\x9f\x94\xa4" => 'INPUT SYMBOL FOR LATIN LETTERS',
- "\xe2\x9c\x92" => 'BLACK NIB',
- "\xf0\x9f\x92\xba" => 'SEAT',
- "\xf0\x9f\x92\xbb" => 'PERSONAL COMPUTER',
- "\xe2\x9c\x8f" => 'PENCIL',
- "\xf0\x9f\x93\x8e" => 'PAPERCLIP',
- "\xf0\x9f\x92\xbc" => 'BRIEFCASE',
- "\xf0\x9f\x92\xbd" => 'MINIDISC',
- "\xf0\x9f\x92\xbe" => 'FLOPPY DISK',
- "\xf0\x9f\x92\xbf" => 'OPTICAL DISC',
- "\xf0\x9f\x93\x80" => 'DVD',
- "\xe2\x9c\x82" => 'BLACK SCISSORS',
- "\xf0\x9f\x93\x8d" => 'ROUND PUSHPIN',
- "\xf0\x9f\x93\x83" => 'PAGE WITH CURL',
- "\xf0\x9f\x93\x84" => 'PAGE FACING UP',
- "\xf0\x9f\x93\x85" => 'CALENDAR',
- "\xf0\x9f\x93\x81" => 'FILE FOLDER',
- "\xf0\x9f\x93\x82" => 'OPEN FILE FOLDER',
- "\xf0\x9f\x93\x93" => 'NOTEBOOK',
- "\xf0\x9f\x93\x96" => 'OPEN BOOK',
- "\xf0\x9f\x93\x94" => 'NOTEBOOK WITH DECORATIVE COVER',
- "\xf0\x9f\x93\x95" => 'CLOSED BOOK',
- "\xf0\x9f\x93\x97" => 'GREEN BOOK',
- "\xf0\x9f\x93\x98" => 'BLUE BOOK',
- "\xf0\x9f\x93\x99" => 'ORANGE BOOK',
- "\xf0\x9f\x93\x9a" => 'BOOKS',
- "\xf0\x9f\x93\x9b" => 'NAME BADGE',
- "\xf0\x9f\x93\x9c" => 'SCROLL',
- "\xf0\x9f\x93\x8b" => 'CLIPBOARD',
- "\xf0\x9f\x93\x86" => 'TEAR-OFF CALENDAR',
- "\xf0\x9f\x93\x8a" => 'BAR CHART',
- "\xf0\x9f\x93\x88" => 'CHART WITH UPWARDS TREND',
- "\xf0\x9f\x93\x89" => 'CHART WITH DOWNWARDS TREND',
- "\xf0\x9f\x93\x87" => 'CARD INDEX',
- "\xf0\x9f\x93\x8c" => 'PUSHPIN',
- "\xf0\x9f\x93\x92" => 'LEDGER',
- "\xf0\x9f\x93\x8f" => 'STRAIGHT RULER',
- "\xf0\x9f\x93\x90" => 'TRIANGULAR RULER',
- "\xf0\x9f\x93\x91" => 'BOOKMARK TABS',
- "\xf0\x9f\x8e\xbd" => 'RUNNING SHIRT WITH SASH',
- "\xe2\x9a\xbe" => 'BASEBALL',
- "\xe2\x9b\xb3" => 'FLAG IN HOLE',
- "\xf0\x9f\x8e\xbe" => 'TENNIS RACQUET AND BALL',
- "\xe2\x9a\xbd" => 'SOCCER BALL',
- "\xf0\x9f\x8e\xbf" => 'SKI AND SKI BOOT',
- "\xf0\x9f\x8f\x80" => 'BASKETBALL AND HOOP',
- "\xf0\x9f\x8f\x81" => 'CHEQUERED FLAG',
- "\xf0\x9f\x8f\x82" => 'SNOWBOARDER',
- "\xf0\x9f\x8f\x83" => 'RUNNER',
- "\xf0\x9f\x8f\x84" => 'SURFER',
- "\xf0\x9f\x8f\x86" => 'TROPHY',
- "\xf0\x9f\x8f\x88" => 'AMERICAN FOOTBALL',
- "\xf0\x9f\x8f\x8a" => 'SWIMMER',
- "\xf0\x9f\x9a\x83" => 'RAILWAY CAR',
- "\xf0\x9f\x9a\x87" => 'METRO',
- "\xe2\x93\x82" => 'CIRCLED LATIN CAPITAL LETTER M',
- "\xf0\x9f\x9a\x84" => 'HIGH-SPEED TRAIN',
- "\xf0\x9f\x9a\x85" => 'HIGH-SPEED TRAIN WITH BULLET NOSE',
- "\xf0\x9f\x9a\x97" => 'AUTOMOBILE',
- "\xf0\x9f\x9a\x99" => 'RECREATIONAL VEHICLE',
- "\xf0\x9f\x9a\x8c" => 'BUS',
- "\xf0\x9f\x9a\x8f" => 'BUS STOP',
- "\xf0\x9f\x9a\xa2" => 'SHIP',
- "\xe2\x9c\x88" => 'AIRPLANE',
- "\xe2\x9b\xb5" => 'SAILBOAT',
- "\xf0\x9f\x9a\x89" => 'STATION',
- "\xf0\x9f\x9a\x80" => 'ROCKET',
- "\xf0\x9f\x9a\xa4" => 'SPEEDBOAT',
- "\xf0\x9f\x9a\x95" => 'TAXI',
- "\xf0\x9f\x9a\x9a" => 'DELIVERY TRUCK',
- "\xf0\x9f\x9a\x92" => 'FIRE ENGINE',
- "\xf0\x9f\x9a\x91" => 'AMBULANCE',
- "\xf0\x9f\x9a\x93" => 'POLICE CAR',
- "\xe2\x9b\xbd" => 'FUEL PUMP',
- "\xf0\x9f\x85\xbf" => 'NEGATIVE SQUARED LATIN CAPITAL LETTER P',
- "\xf0\x9f\x9a\xa5" => 'HORIZONTAL TRAFFIC LIGHT',
- "\xf0\x9f\x9a\xa7" => 'CONSTRUCTION SIGN',
- "\xf0\x9f\x9a\xa8" => 'POLICE CARS REVOLVING LIGHT',
- "\xe2\x99\xa8" => 'HOT SPRINGS',
- "\xe2\x9b\xba" => 'TENT',
- "\xf0\x9f\x8e\xa0" => 'CAROUSEL HORSE',
- "\xf0\x9f\x8e\xa1" => 'FERRIS WHEEL',
- "\xf0\x9f\x8e\xa2" => 'ROLLER COASTER',
- "\xf0\x9f\x8e\xa3" => 'FISHING POLE AND FISH',
- "\xf0\x9f\x8e\xa4" => 'MICROPHONE',
- "\xf0\x9f\x8e\xa5" => 'MOVIE CAMERA',
- "\xf0\x9f\x8e\xa6" => 'CINEMA',
- "\xf0\x9f\x8e\xa7" => 'HEADPHONE',
- "\xf0\x9f\x8e\xa8" => 'ARTIST PALETTE',
- "\xf0\x9f\x8e\xa9" => 'TOP HAT',
- "\xf0\x9f\x8e\xaa" => 'CIRCUS TENT',
- "\xf0\x9f\x8e\xab" => 'TICKET',
- "\xf0\x9f\x8e\xac" => 'CLAPPER BOARD',
- "\xf0\x9f\x8e\xad" => 'PERFORMING ARTS',
- "\xf0\x9f\x8e\xae" => 'VIDEO GAME',
- "\xf0\x9f\x80\x84" => 'MAHJONG TILE RED DRAGON',
- "\xf0\x9f\x8e\xaf" => 'DIRECT HIT',
- "\xf0\x9f\x8e\xb0" => 'SLOT MACHINE',
- "\xf0\x9f\x8e\xb1" => 'BILLIARDS',
- "\xf0\x9f\x8e\xb2" => 'GAME DIE',
- "\xf0\x9f\x8e\xb3" => 'BOWLING',
- "\xf0\x9f\x8e\xb4" => 'FLOWER PLAYING CARDS',
- "\xf0\x9f\x83\x8f" => 'PLAYING CARD BLACK JOKER',
- "\xf0\x9f\x8e\xb5" => 'MUSICAL NOTE',
- "\xf0\x9f\x8e\xb6" => 'MULTIPLE MUSICAL NOTES',
- "\xf0\x9f\x8e\xb7" => 'SAXOPHONE',
- "\xf0\x9f\x8e\xb8" => 'GUITAR',
- "\xf0\x9f\x8e\xb9" => 'MUSICAL KEYBOARD',
- "\xf0\x9f\x8e\xba" => 'TRUMPET',
- "\xf0\x9f\x8e\xbb" => 'VIOLIN',
- "\xf0\x9f\x8e\xbc" => 'MUSICAL SCORE',
- "\xe3\x80\xbd" => 'PART ALTERNATION MARK',
- "\xf0\x9f\x93\xb7" => 'CAMERA',
- "\xf0\x9f\x93\xb9" => 'VIDEO CAMERA',
- "\xf0\x9f\x93\xba" => 'TELEVISION',
- "\xf0\x9f\x93\xbb" => 'RADIO',
- "\xf0\x9f\x93\xbc" => 'VIDEOCASSETTE',
- "\xf0\x9f\x92\x8b" => 'KISS MARK',
- "\xf0\x9f\x92\x8c" => 'LOVE LETTER',
- "\xf0\x9f\x92\x8d" => 'RING',
- "\xf0\x9f\x92\x8e" => 'GEM STONE',
- "\xf0\x9f\x92\x8f" => 'KISS',
- "\xf0\x9f\x92\x90" => 'BOUQUET',
- "\xf0\x9f\x92\x91" => 'COUPLE WITH HEART',
- "\xf0\x9f\x92\x92" => 'WEDDING',
- "\xf0\x9f\x94\x9e" => 'NO ONE UNDER EIGHTEEN SYMBOL',
- "\xc2\xa9" => 'COPYRIGHT SIGN',
- "\xc2\xae" => 'REGISTERED SIGN',
- "\xe2\x84\xa2" => 'TRADE MARK SIGN',
- "\xe2\x84\xb9" => 'INFORMATION SOURCE',
- "#\xe2\x83\xa3" => 'HASH KEY',
- "1\xe2\x83\xa3" => 'KEYCAP 1',
- "2\xe2\x83\xa3" => 'KEYCAP 2',
- "3\xe2\x83\xa3" => 'KEYCAP 3',
- "4\xe2\x83\xa3" => 'KEYCAP 4',
- "5\xe2\x83\xa3" => 'KEYCAP 5',
- "6\xe2\x83\xa3" => 'KEYCAP 6',
- "7\xe2\x83\xa3" => 'KEYCAP 7',
- "8\xe2\x83\xa3" => 'KEYCAP 8',
- "9\xe2\x83\xa3" => 'KEYCAP 9',
- "0\xe2\x83\xa3" => 'KEYCAP 0',
- "\xf0\x9f\x94\x9f" => 'KEYCAP TEN',
- "\xf0\x9f\x93\xb6" => 'ANTENNA WITH BARS',
- "\xf0\x9f\x93\xb3" => 'VIBRATION MODE',
- "\xf0\x9f\x93\xb4" => 'MOBILE PHONE OFF',
- "\xf0\x9f\x8d\x94" => 'HAMBURGER',
- "\xf0\x9f\x8d\x99" => 'RICE BALL',
- "\xf0\x9f\x8d\xb0" => 'SHORTCAKE',
- "\xf0\x9f\x8d\x9c" => 'STEAMING BOWL',
- "\xf0\x9f\x8d\x9e" => 'BREAD',
- "\xf0\x9f\x8d\xb3" => 'COOKING',
- "\xf0\x9f\x8d\xa6" => 'SOFT ICE CREAM',
- "\xf0\x9f\x8d\x9f" => 'FRENCH FRIES',
- "\xf0\x9f\x8d\xa1" => 'DANGO',
- "\xf0\x9f\x8d\x98" => 'RICE CRACKER',
- "\xf0\x9f\x8d\x9a" => 'COOKED RICE',
- "\xf0\x9f\x8d\x9d" => 'SPAGHETTI',
- "\xf0\x9f\x8d\x9b" => 'CURRY AND RICE',
- "\xf0\x9f\x8d\xa2" => 'ODEN',
- "\xf0\x9f\x8d\xa3" => 'SUSHI',
- "\xf0\x9f\x8d\xb1" => 'BENTO BOX',
- "\xf0\x9f\x8d\xb2" => 'POT OF FOOD',
- "\xf0\x9f\x8d\xa7" => 'SHAVED ICE',
- "\xf0\x9f\x8d\x96" => 'MEAT ON BONE',
- "\xf0\x9f\x8d\xa5" => 'FISH CAKE WITH SWIRL DESIGN',
- "\xf0\x9f\x8d\xa0" => 'ROASTED SWEET POTATO',
- "\xf0\x9f\x8d\x95" => 'SLICE OF PIZZA',
- "\xf0\x9f\x8d\x97" => 'POULTRY LEG',
- "\xf0\x9f\x8d\xa8" => 'ICE CREAM',
- "\xf0\x9f\x8d\xa9" => 'DOUGHNUT',
- "\xf0\x9f\x8d\xaa" => 'COOKIE',
- "\xf0\x9f\x8d\xab" => 'CHOCOLATE BAR',
- "\xf0\x9f\x8d\xac" => 'CANDY',
- "\xf0\x9f\x8d\xad" => 'LOLLIPOP',
- "\xf0\x9f\x8d\xae" => 'CUSTARD',
- "\xf0\x9f\x8d\xaf" => 'HONEY POT',
- "\xf0\x9f\x8d\xa4" => 'FRIED SHRIMP',
- "\xf0\x9f\x8d\xb4" => 'FORK AND KNIFE',
- "\xe2\x98\x95" => 'HOT BEVERAGE',
- "\xf0\x9f\x8d\xb8" => 'COCKTAIL GLASS',
- "\xf0\x9f\x8d\xba" => 'BEER MUG',
- "\xf0\x9f\x8d\xb5" => 'TEACUP WITHOUT HANDLE',
- "\xf0\x9f\x8d\xb6" => 'SAKE BOTTLE AND CUP',
- "\xf0\x9f\x8d\xb7" => 'WINE GLASS',
- "\xf0\x9f\x8d\xbb" => 'CLINKING BEER MUGS',
- "\xf0\x9f\x8d\xb9" => 'TROPICAL DRINK',
- "\xe2\x86\x97" => 'NORTH EAST ARROW',
- "\xe2\x86\x98" => 'SOUTH EAST ARROW',
- "\xe2\x86\x96" => 'NORTH WEST ARROW',
- "\xe2\x86\x99" => 'SOUTH WEST ARROW',
- "\xe2\xa4\xb4" => 'ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS',
- "\xe2\xa4\xb5" => 'ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS',
- "\xe2\x86\x94" => 'LEFT RIGHT ARROW',
- "\xe2\x86\x95" => 'UP DOWN ARROW',
- "\xe2\xac\x86" => 'UPWARDS BLACK ARROW',
- "\xe2\xac\x87" => 'DOWNWARDS BLACK ARROW',
- "\xe2\x9e\xa1" => 'BLACK RIGHTWARDS ARROW',
- "\xe2\xac\x85" => 'LEFTWARDS BLACK ARROW',
- "\xe2\x96\xb6" => 'BLACK RIGHT-POINTING TRIANGLE',
- "\xe2\x97\x80" => 'BLACK LEFT-POINTING TRIANGLE',
- "\xe2\x8f\xa9" => 'BLACK RIGHT-POINTING DOUBLE TRIANGLE',
- "\xe2\x8f\xaa" => 'BLACK LEFT-POINTING DOUBLE TRIANGLE',
- "\xe2\x8f\xab" => 'BLACK UP-POINTING DOUBLE TRIANGLE',
- "\xe2\x8f\xac" => 'BLACK DOWN-POINTING DOUBLE TRIANGLE',
- "\xf0\x9f\x94\xba" => 'UP-POINTING RED TRIANGLE',
- "\xf0\x9f\x94\xbb" => 'DOWN-POINTING RED TRIANGLE',
- "\xf0\x9f\x94\xbc" => 'UP-POINTING SMALL RED TRIANGLE',
- "\xf0\x9f\x94\xbd" => 'DOWN-POINTING SMALL RED TRIANGLE',
- "\xe2\xad\x95" => 'HEAVY LARGE CIRCLE',
- "\xe2\x9d\x8c" => 'CROSS MARK',
- "\xe2\x9d\x8e" => 'NEGATIVE SQUARED CROSS MARK',
- "\xe2\x9d\x97" => 'HEAVY EXCLAMATION MARK SYMBOL',
- "\xe2\x81\x89" => 'EXCLAMATION QUESTION MARK',
- "\xe2\x80\xbc" => 'DOUBLE EXCLAMATION MARK',
- "\xe2\x9d\x93" => 'BLACK QUESTION MARK ORNAMENT',
- "\xe2\x9d\x94" => 'WHITE QUESTION MARK ORNAMENT',
- "\xe2\x9d\x95" => 'WHITE EXCLAMATION MARK ORNAMENT',
- "\xe3\x80\xb0" => 'WAVY DASH',
- "\xe2\x9e\xb0" => 'CURLY LOOP',
- "\xe2\x9e\xbf" => 'DOUBLE CURLY LOOP',
- "\xe2\x9d\xa4" => 'HEAVY BLACK HEART',
- "\xf0\x9f\x92\x93" => 'BEATING HEART',
- "\xf0\x9f\x92\x94" => 'BROKEN HEART',
- "\xf0\x9f\x92\x95" => 'TWO HEARTS',
- "\xf0\x9f\x92\x96" => 'SPARKLING HEART',
- "\xf0\x9f\x92\x97" => 'GROWING HEART',
- "\xf0\x9f\x92\x98" => 'HEART WITH ARROW',
- "\xf0\x9f\x92\x99" => 'BLUE HEART',
- "\xf0\x9f\x92\x9a" => 'GREEN HEART',
- "\xf0\x9f\x92\x9b" => 'YELLOW HEART',
- "\xf0\x9f\x92\x9c" => 'PURPLE HEART',
- "\xf0\x9f\x92\x9d" => 'HEART WITH RIBBON',
- "\xf0\x9f\x92\x9e" => 'REVOLVING HEARTS',
- "\xf0\x9f\x92\x9f" => 'HEART DECORATION',
- "\xe2\x99\xa5" => 'BLACK HEART SUIT',
- "\xe2\x99\xa0" => 'BLACK SPADE SUIT',
- "\xe2\x99\xa6" => 'BLACK DIAMOND SUIT',
- "\xe2\x99\xa3" => 'BLACK CLUB SUIT',
- "\xf0\x9f\x9a\xac" => 'SMOKING SYMBOL',
- "\xf0\x9f\x9a\xad" => 'NO SMOKING SYMBOL',
- "\xe2\x99\xbf" => 'WHEELCHAIR SYMBOL',
- "\xf0\x9f\x9a\xa9" => 'TRIANGULAR FLAG ON POST',
- "\xe2\x9a\xa0" => 'WARNING SIGN',
- "\xe2\x9b\x94" => 'NO ENTRY',
- "\xe2\x99\xbb" => 'BLACK UNIVERSAL RECYCLING SYMBOL',
- "\xf0\x9f\x9a\xb2" => 'BICYCLE',
- "\xf0\x9f\x9a\xb6" => 'PEDESTRIAN',
- "\xf0\x9f\x9a\xb9" => 'MENS SYMBOL',
- "\xf0\x9f\x9a\xba" => 'WOMENS SYMBOL',
- "\xf0\x9f\x9b\x80" => 'BATH',
- "\xf0\x9f\x9a\xbb" => 'RESTROOM',
- "\xf0\x9f\x9a\xbd" => 'TOILET',
- "\xf0\x9f\x9a\xbe" => 'WATER CLOSET',
- "\xf0\x9f\x9a\xbc" => 'BABY SYMBOL',
- "\xf0\x9f\x9a\xaa" => 'DOOR',
- "\xf0\x9f\x9a\xab" => 'NO ENTRY SIGN',
- "\xe2\x9c\x94" => 'HEAVY CHECK MARK',
- "\xf0\x9f\x86\x91" => 'SQUARED CL',
- "\xf0\x9f\x86\x92" => 'SQUARED COOL',
- "\xf0\x9f\x86\x93" => 'SQUARED FREE',
- "\xf0\x9f\x86\x94" => 'SQUARED ID',
- "\xf0\x9f\x86\x95" => 'SQUARED NEW',
- "\xf0\x9f\x86\x96" => 'SQUARED NG',
- "\xf0\x9f\x86\x97" => 'SQUARED OK',
- "\xf0\x9f\x86\x98" => 'SQUARED SOS',
- "\xf0\x9f\x86\x99" => 'SQUARED UP WITH EXCLAMATION MARK',
- "\xf0\x9f\x86\x9a" => 'SQUARED VS',
- "\xf0\x9f\x88\x81" => 'SQUARED KATAKANA KOKO',
- "\xf0\x9f\x88\x82" => 'SQUARED KATAKANA SA',
- "\xf0\x9f\x88\xb2" => 'SQUARED CJK UNIFIED IDEOGRAPH-7981',
- "\xf0\x9f\x88\xb3" => 'SQUARED CJK UNIFIED IDEOGRAPH-7A7A',
- "\xf0\x9f\x88\xb4" => 'SQUARED CJK UNIFIED IDEOGRAPH-5408',
- "\xf0\x9f\x88\xb5" => 'SQUARED CJK UNIFIED IDEOGRAPH-6E80',
- "\xf0\x9f\x88\xb6" => 'SQUARED CJK UNIFIED IDEOGRAPH-6709',
- "\xf0\x9f\x88\x9a" => 'SQUARED CJK UNIFIED IDEOGRAPH-7121',
- "\xf0\x9f\x88\xb7" => 'SQUARED CJK UNIFIED IDEOGRAPH-6708',
- "\xf0\x9f\x88\xb8" => 'SQUARED CJK UNIFIED IDEOGRAPH-7533',
- "\xf0\x9f\x88\xb9" => 'SQUARED CJK UNIFIED IDEOGRAPH-5272',
- "\xf0\x9f\x88\xaf" => 'SQUARED CJK UNIFIED IDEOGRAPH-6307',
- "\xf0\x9f\x88\xba" => 'SQUARED CJK UNIFIED IDEOGRAPH-55B6',
- "\xe3\x8a\x99" => 'CIRCLED IDEOGRAPH SECRET',
- "\xe3\x8a\x97" => 'CIRCLED IDEOGRAPH CONGRATULATION',
- "\xf0\x9f\x89\x90" => 'CIRCLED IDEOGRAPH ADVANTAGE',
- "\xf0\x9f\x89\x91" => 'CIRCLED IDEOGRAPH ACCEPT',
- "\xe2\x9e\x95" => 'HEAVY PLUS SIGN',
- "\xe2\x9e\x96" => 'HEAVY MINUS SIGN',
- "\xe2\x9c\x96" => 'HEAVY MULTIPLICATION X',
- "\xe2\x9e\x97" => 'HEAVY DIVISION SIGN',
- "\xf0\x9f\x92\xa0" => 'DIAMOND SHAPE WITH A DOT INSIDE',
- "\xf0\x9f\x92\xa1" => 'ELECTRIC LIGHT BULB',
- "\xf0\x9f\x92\xa2" => 'ANGER SYMBOL',
- "\xf0\x9f\x92\xa3" => 'BOMB',
- "\xf0\x9f\x92\xa4" => 'SLEEPING SYMBOL',
- "\xf0\x9f\x92\xa5" => 'COLLISION SYMBOL',
- "\xf0\x9f\x92\xa6" => 'SPLASHING SWEAT SYMBOL',
- "\xf0\x9f\x92\xa7" => 'DROPLET',
- "\xf0\x9f\x92\xa8" => 'DASH SYMBOL',
- "\xf0\x9f\x92\xa9" => 'PILE OF POO',
- "\xf0\x9f\x92\xaa" => 'FLEXED BICEPS',
- "\xf0\x9f\x92\xab" => 'DIZZY SYMBOL',
- "\xf0\x9f\x92\xac" => 'SPEECH BALLOON',
- "\xe2\x9c\xa8" => 'SPARKLES',
- "\xe2\x9c\xb4" => 'EIGHT POINTED BLACK STAR',
- "\xe2\x9c\xb3" => 'EIGHT SPOKED ASTERISK',
- "\xe2\x9a\xaa" => 'MEDIUM WHITE CIRCLE',
- "\xe2\x9a\xab" => 'MEDIUM BLACK CIRCLE',
- "\xf0\x9f\x94\xb4" => 'LARGE RED CIRCLE',
- "\xf0\x9f\x94\xb5" => 'LARGE BLUE CIRCLE',
- "\xf0\x9f\x94\xb2" => 'BLACK SQUARE BUTTON',
- "\xf0\x9f\x94\xb3" => 'WHITE SQUARE BUTTON',
- "\xe2\xad\x90" => 'WHITE MEDIUM STAR',
- "\xe2\xac\x9c" => 'WHITE LARGE SQUARE',
- "\xe2\xac\x9b" => 'BLACK LARGE SQUARE',
- "\xe2\x96\xab" => 'WHITE SMALL SQUARE',
- "\xe2\x96\xaa" => 'BLACK SMALL SQUARE',
- "\xe2\x97\xbd" => 'WHITE MEDIUM SMALL SQUARE',
- "\xe2\x97\xbe" => 'BLACK MEDIUM SMALL SQUARE',
- "\xe2\x97\xbb" => 'WHITE MEDIUM SQUARE',
- "\xe2\x97\xbc" => 'BLACK MEDIUM SQUARE',
- "\xf0\x9f\x94\xb6" => 'LARGE ORANGE DIAMOND',
- "\xf0\x9f\x94\xb7" => 'LARGE BLUE DIAMOND',
- "\xf0\x9f\x94\xb8" => 'SMALL ORANGE DIAMOND',
- "\xf0\x9f\x94\xb9" => 'SMALL BLUE DIAMOND',
- "\xe2\x9d\x87" => 'SPARKLE',
- "\xf0\x9f\x92\xae" => 'WHITE FLOWER',
- "\xf0\x9f\x92\xaf" => 'HUNDRED POINTS SYMBOL',
- "\xe2\x86\xa9" => 'LEFTWARDS ARROW WITH HOOK',
- "\xe2\x86\xaa" => 'RIGHTWARDS ARROW WITH HOOK',
- "\xf0\x9f\x94\x83" => 'CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS',
- "\xf0\x9f\x94\x8a" => 'SPEAKER WITH THREE SOUND WAVES',
- "\xf0\x9f\x94\x8b" => 'BATTERY',
- "\xf0\x9f\x94\x8c" => 'ELECTRIC PLUG',
- "\xf0\x9f\x94\x8d" => 'LEFT-POINTING MAGNIFYING GLASS',
- "\xf0\x9f\x94\x8e" => 'RIGHT-POINTING MAGNIFYING GLASS',
- "\xf0\x9f\x94\x92" => 'LOCK',
- "\xf0\x9f\x94\x93" => 'OPEN LOCK',
- "\xf0\x9f\x94\x8f" => 'LOCK WITH INK PEN',
- "\xf0\x9f\x94\x90" => 'CLOSED LOCK WITH KEY',
- "\xf0\x9f\x94\x91" => 'KEY',
- "\xf0\x9f\x94\x94" => 'BELL',
- "\xe2\x98\x91" => 'BALLOT BOX WITH CHECK',
- "\xf0\x9f\x94\x98" => 'RADIO BUTTON',
- "\xf0\x9f\x94\x96" => 'BOOKMARK',
- "\xf0\x9f\x94\x97" => 'LINK SYMBOL',
- "\xf0\x9f\x94\x99" => 'BACK WITH LEFTWARDS ARROW ABOVE',
- "\xf0\x9f\x94\x9a" => 'END WITH LEFTWARDS ARROW ABOVE',
- "\xf0\x9f\x94\x9b" => 'ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE',
- "\xf0\x9f\x94\x9c" => 'SOON WITH RIGHTWARDS ARROW ABOVE',
- "\xf0\x9f\x94\x9d" => 'TOP WITH UPWARDS ARROW ABOVE',
- "\xe2\x9c\x85" => 'WHITE HEAVY CHECK MARK',
- "\xe2\x9c\x8a" => 'RAISED FIST',
- "\xe2\x9c\x8b" => 'RAISED HAND',
- "\xe2\x9c\x8c" => 'VICTORY HAND',
- "\xf0\x9f\x91\x8a" => 'FISTED HAND SIGN',
- "\xf0\x9f\x91\x8d" => 'THUMBS UP SIGN',
- "\xe2\x98\x9d" => 'WHITE UP POINTING INDEX',
- "\xf0\x9f\x91\x86" => 'WHITE UP POINTING BACKHAND INDEX',
- "\xf0\x9f\x91\x87" => 'WHITE DOWN POINTING BACKHAND INDEX',
- "\xf0\x9f\x91\x88" => 'WHITE LEFT POINTING BACKHAND INDEX',
- "\xf0\x9f\x91\x89" => 'WHITE RIGHT POINTING BACKHAND INDEX',
- "\xf0\x9f\x91\x8b" => 'WAVING HAND SIGN',
- "\xf0\x9f\x91\x8f" => 'CLAPPING HANDS SIGN',
- "\xf0\x9f\x91\x8c" => 'OK HAND SIGN',
- "\xf0\x9f\x91\x8e" => 'THUMBS DOWN SIGN',
- "\xf0\x9f\x91\x90" => 'OPEN HANDS SIGN',
- ),
- 'kaomoji' => array(
- "0"=>"[\xe9\x9c\xa7]", "1"=>"[\xe5\xa4\x95\xe7\x84\xbc\xe3\x81\x91]", "2"=>"[\xe8\x99\xb9]", "3"=>"[\xe9\x9b\xaa\xe7\xb5\x90\xe6\x99\xb6]",
- "4"=>"[\xe7\x81\xab\xe5\xb1\xb1]", "5"=>"[\xe5\x9c\xb0\xe7\x90\x83]", "6"=>"\xe2\x97\x8f", "7"=>"\xe2\x97\x8b", "8"=>"[\xe2\x98\x86]",
- "9"=>"\xe2\x98\x86\xe5\xbd\xa1", "10"=>"[\xe8\x85\x95\xe6\x99\x82\xe8\xa8\x88]", "11"=>"[\xe7\xa0\x82\xe6\x99\x82\xe8\xa8\x88]", "12"=>"[\xe8\x9b\x87\xe4\xbd\xbf\xe5\xba\xa7]", "13"=>"[\xe3\x83\x90\xe3\x83\xa9]",
- "14"=>"[\xe9\xa2\xa8\xe3\x81\xab\xe8\x88\x9e\xe3\x81\x86\xe8\x91\x89]", "15"=>"[\xe3\x83\x8f\xe3\x82\xa4\xe3\x83\x93\xe3\x82\xb9\xe3\x82\xab\xe3\x82\xb9]", "16"=>"[\xe3\x81\xb2\xe3\x81\xbe\xe3\x82\x8f\xe3\x82\x8a]", "17"=>"[\xe3\x83\xa4\xe3\x82\xb7]", "18"=>"[\xe3\x82\xb5\xe3\x83\x9c\xe3\x83\x86\xe3\x83\xb3]",
- "19"=>"[\xe7\xa8\xb2\xe7\xa9\x82]", "20"=>"[\xe3\x81\xa8\xe3\x81\x86\xe3\x82\x82\xe3\x82\x8d\xe3\x81\x93\xe3\x81\x97]", "21"=>"[\xe3\x82\xad\xe3\x83\x8e\xe3\x82\xb3]", "22"=>"[\xe6\xa0\x97]", "23"=>"[\xe8\x8a\xb1]",
- "24"=>"[\xe3\x81\x95\xe3\x81\x8f\xe3\x82\x89\xe3\x82\x93\xe3\x81\xbc]", "25"=>"[\xe3\x83\x90\xe3\x83\x8a\xe3\x83\x8a]", "26"=>"[\xe3\x81\xbf\xe3\x81\x8b\xe3\x82\x93]", "27"=>"[\xe3\x82\xa4\xe3\x83\x81\xe3\x82\xb4]", "28"=>"[\xe3\x82\xb9\xe3\x82\xa4\xe3\x82\xab]",
- "29"=>"[\xe3\x83\x88\xe3\x83\x9e\xe3\x83\x88]", "30"=>"[\xe3\x83\x8a\xe3\x82\xb9]", "31"=>"[\xe3\x83\xa1\xe3\x83\xad\xe3\x83\xb3]", "32"=>"[\xe3\x83\x91\xe3\x82\xa4\xe3\x83\x8a\xe3\x83\x83\xe3\x83\x97\xe3\x83\xab]", "33"=>"[\xe3\x83\x96\xe3\x83\x89\xe3\x82\xa6]",
- "34"=>"[\xe3\x83\xa2\xe3\x83\xa2]", "35"=>"[\xe9\xbc\xbb]", "36"=>"[\xe3\x83\x9e\xe3\x83\x8b\xe3\x82\xad\xe3\x83\xa5\xe3\x82\xa2]", "37"=>"[\xe3\x82\xa8\xe3\x82\xb9\xe3\x83\x86]", "38"=>"[\xe5\xba\x8a\xe5\xb1\x8b]",
- "39"=>"\xe3\x80\x93", "40"=>"[\xe5\xae\xb6\xe6\x97\x8f]", "41"=>"[\xe3\x82\xab\xe3\x83\x83\xe3\x83\x97\xe3\x83\xab]", "42"=>"[\xe8\xad\xa6\xe5\xae\x98]", "43"=>"[\xe3\x83\x90\xe3\x83\x8b\xe3\x83\xbc]",
- "44"=>"[\xe8\x8a\xb1\xe5\xab\x81]", "45"=>"[\xe7\x99\xbd\xe4\xba\xba]", "46"=>"[\xe4\xb8\xad\xe5\x9b\xbd\xe4\xba\xba]", "47"=>"[\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x89\xe4\xba\xba]", "48"=>"[\xe3\x81\x8a\xe3\x81\x98\xe3\x81\x84\xe3\x81\x95\xe3\x82\x93]",
- "49"=>"[\xe3\x81\x8a\xe3\x81\xb0\xe3\x81\x82\xe3\x81\x95\xe3\x82\x93]", "50"=>"[\xe8\xb5\xa4\xe3\x81\xa1\xe3\x82\x83\xe3\x82\x93]", "51"=>"[\xe5\xb7\xa5\xe4\xba\x8b\xe7\x8f\xbe\xe5\xa0\xb4\xe3\x81\xae\xe4\xba\xba]", "52"=>"[\xe3\x81\x8a\xe5\xa7\xab\xe6\xa7\x98]", "53"=>"[\xe3\x81\xaa\xe3\x81\xbe\xe3\x81\xaf\xe3\x81\x92]",
- "54"=>"[\xe5\xa4\xa9\xe7\x8b\x97]", "55"=>"[\xe3\x81\x8a\xe5\x8c\x96\xe3\x81\x91]", "56"=>"[\xe5\xa4\xa9\xe4\xbd\xbf]", "57"=>"[UFO]", "58"=>"[\xe5\xae\x87\xe5\xae\x99\xe4\xba\xba]",
- "59"=>"[\xe3\x82\xa2\xe3\x82\xaf\xe3\x83\x9e]", "60"=>"[\xe3\x83\x89\xe3\x82\xaf\xe3\x83\xad]", "61"=>"[\xe6\xa1\x88\xe5\x86\x85]", "62"=>"[\xe8\xa1\x9b\xe5\x85\xb5]", "63"=>"[\xe3\x83\x80\xe3\x83\xb3\xe3\x82\xb9]",
- "64"=>"[\xe3\x82\xab\xe3\x82\xbf\xe3\x83\x84\xe3\x83\xa0\xe3\x83\xaa]", "65"=>"[\xe3\x83\x98\xe3\x83\x93]", "66"=>"[\xe3\x83\x8b\xe3\x83\xaf\xe3\x83\x88\xe3\x83\xaa]", "67"=>"[\xe3\x82\xa4\xe3\x83\x8e\xe3\x82\xb7\xe3\x82\xb7]", "68"=>"[\xe3\x83\xa9\xe3\x82\xaf\xe3\x83\x80]",
- "69"=>"[\xe3\x82\xbe\xe3\x82\xa6]", "70"=>"[\xe3\x82\xb3\xe3\x82\xa2\xe3\x83\xa9]", "71"=>"[\xe3\x82\xb5\xe3\x83\xab]", "72"=>"[\xe3\x83\x92\xe3\x83\x84\xe3\x82\xb8]", "73"=>"[\xe3\x82\xbf\xe3\x82\xb3]",
- "74"=>"[\xe5\xb7\xbb\xe8\xb2\x9d]", "75"=>"[\xe3\x82\xb2\xe3\x82\xb8\xe3\x82\xb2\xe3\x82\xb8]", "76"=>"[\xe3\x82\xa2\xe3\x83\xaa]", "77"=>"[\xe3\x83\x9f\xe3\x83\x84\xe3\x83\x90\xe3\x83\x81]", "78"=>"[\xe3\x81\xa6\xe3\x82\x93\xe3\x81\xa8\xe3\x81\x86\xe8\x99\xab]",
- "79"=>"[\xe3\x82\xab\xe3\x83\xa1]", "80"=>"[\xe3\x82\xa4\xe3\x83\xab\xe3\x82\xab]", "81"=>"[\xe3\x83\x8d\xe3\x82\xba\xe3\x83\x9f]", "82"=>"[\xe3\x83\x88\xe3\x83\xa9]", "83"=>"[\xe3\x82\xaf\xe3\x82\xb8\xe3\x83\xa9]",
- "84"=>"[\xe3\x82\xaf\xe3\x83\x9e]", "85"=>"[\xe3\x83\x8f\xe3\x83\xa0\xe3\x82\xb9\xe3\x82\xbf\xe3\x83\xbc]", "86"=>"[\xe7\x89\x9b]", "87"=>"[\xe3\x82\xa6\xe3\x82\xb5\xe3\x82\xae]", "88"=>"[\xe3\x82\xab\xe3\x82\xa8\xe3\x83\xab]",
- "89"=>"[\xe8\xbe\xb0]", "90"=>"[\xe3\x83\x91\xe3\x83\xb3\xe3\x83\x80]", "91"=>"[\xe9\xa2\xa8\xe9\x82\xaa\xe3\x81\xb2\xe3\x81\x8d]", "92"=>"m(_ _)m", "93"=>"(/_\xef\xbc\xbc)",
- "94"=>"(\xe3\x83\xbb\xc3\x97\xe3\x83\xbb)", "95"=>"|(\xe3\x83\xbb\xc3\x97\xe3\x83\xbb)|", "96"=>"(^-^)/", "97"=>"\xef\xbc\xbc(^o^)\xef\xbc\x8f", "98"=>"(>\xe4\xba\xba<)",
- "99"=>"[\xe6\x95\x99\xe4\xbc\x9a]", "100"=>"[\xe5\x99\xb4\xe6\xb0\xb4]", "101"=>"[\xe3\x83\x87\xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88]", "102"=>"[\xe5\x9f\x8e]", "103"=>"[\xe5\xb7\xa5\xe5\xa0\xb4]",
- "104"=>"[\xe6\x9d\xb1\xe4\xba\xac\xe3\x82\xbf\xe3\x83\xaf\xe3\x83\xbc]", "105"=>"[\xe8\x87\xaa\xe7\x94\xb1\xe3\x81\xae\xe5\xa5\xb3\xe7\xa5\x9e]", "106"=>"[\xe6\x97\xa5\xe6\x9c\xac\xe5\x9c\xb0\xe5\x9b\xb3]", "107"=>"[\xe3\x83\xa2\xe3\x82\xa2\xe3\x82\xa4]", "108"=>"[\xe3\x83\x96\xe3\x83\xbc\xe3\x83\x84]",
- "109"=>"[\xe3\x83\xa1\xe3\x82\xac\xe3\x83\x8d]", "110"=>"[\xe3\x82\xb8\xe3\x83\xbc\xe3\x83\xb3\xe3\x82\xba]", "111"=>"[\xe3\x83\x8d\xe3\x82\xaf\xe3\x82\xbf\xe3\x82\xa4]", "112"=>"[\xe5\xb8\xbd\xe5\xad\x90]", "113"=>"[\xe3\x83\x89\xe3\x83\xac\xe3\x82\xb9]",
- "114"=>"[\xe7\x9d\x80\xe7\x89\xa9]", "115"=>"[\xe3\x83\x93\xe3\x82\xad\xe3\x83\x8b]", "116"=>"[\xe8\xb2\xa1\xe5\xb8\x83]", "117"=>"[\xe3\x81\xb5\xe3\x81\x8f\xe3\x82\x8d]", "118"=>"[$\xef\xbf\xa5]",
- "119"=>"[\xe6\xa0\xaa\xe4\xbe\xa1]", "120"=>"[\xe3\x82\xab\xe3\x83\xbc\xe3\x83\x89]", "121"=>"\xef\xbf\xa5", "122"=>"[\xe9\xa3\x9b\xe3\x82\x93\xe3\x81\xa7\xe3\x81\x84\xe3\x81\x8f\xe3\x81\x8a\xe9\x87\x91]", "123"=>"[\xe4\xb8\xad\xe5\x9b\xbd]",
- "124"=>"[\xe3\x83\x89\xe3\x82\xa4\xe3\x83\x84]", "125"=>"[\xe3\x82\xb9\xe3\x83\x9a\xe3\x82\xa4\xe3\x83\xb3]", "126"=>"[\xe3\x83\x95\xe3\x83\xa9\xe3\x83\xb3\xe3\x82\xb9]", "127"=>"[\xe3\x82\xa4\xe3\x82\xae\xe3\x83\xaa\xe3\x82\xb9]", "128"=>"[\xe3\x82\xa4\xe3\x82\xbf\xe3\x83\xaa\xe3\x82\xa2]",
- "129"=>"[\xe6\x97\xa5\xe3\x81\xae\xe4\xb8\xb8]", "130"=>"[\xe9\x9f\x93\xe5\x9b\xbd]", "131"=>"[\xe3\x83\xad\xe3\x82\xb7\xe3\x82\xa2]", "132"=>"[USA]", "133"=>"[\xe7\x82\x8e]",
- "134"=>"[\xe6\x87\x90\xe4\xb8\xad\xe9\x9b\xbb\xe7\x81\xaf]", "135"=>"[\xe3\x83\xac\xe3\x83\xb3\xe3\x83\x81]", "136"=>"[\xe3\x83\x8f\xe3\x83\xb3\xe3\x83\x9e\xe3\x83\xbc]", "137"=>"[\xe3\x83\x8d\xe3\x82\xb8]", "138"=>"[\xe5\x8c\x85\xe4\xb8\x81]",
- "139"=>"[\xe3\x83\x94\xe3\x82\xb9\xe3\x83\x88\xe3\x83\xab]", "140"=>"[\xe5\x8d\xa0\xe3\x81\x84]", "141"=>"[\xe8\x8b\xa5\xe8\x91\x89\xe3\x83\x9e\xe3\x83\xbc\xe3\x82\xaf]", "142"=>"[\xe6\xb3\xa8\xe5\xb0\x84]", "143"=>"[\xe8\x96\xac]",
- "144"=>"[A]", "145"=>"[B]", "146"=>"[AB]", "147"=>"[O]", "148"=>"[\xe3\x82\xb5\xe3\x83\xb3\xe3\x82\xbf]",
- "149"=>"[\xe7\xa5\x9d\xe6\x97\xa5]", "150"=>"[\xe8\x8a\xb1\xe7\x81\xab]", "151"=>"[\xe9\xa2\xa8\xe8\x88\xb9]", "152"=>"[\xe3\x82\xaf\xe3\x83\xa9\xe3\x83\x83\xe3\x82\xab\xe3\x83\xbc]", "153"=>"[\xe9\x96\x80\xe6\x9d\xbe]",
- "154"=>"[\xe3\x81\xb2\xe3\x81\xaa\xe7\xa5\xad\xe3\x82\x8a]", "155"=>"[\xe5\x8d\x92\xe6\xa5\xad\xe5\xbc\x8f]", "156"=>"[\xe3\x83\xa9\xe3\x83\xb3\xe3\x83\x89\xe3\x82\xbb\xe3\x83\xab]", "157"=>"[\xe3\x81\x93\xe3\x81\x84\xe3\x81\xae\xe3\x81\xbc\xe3\x82\x8a]", "158"=>"[\xe7\xb7\x9a\xe9\xa6\x99\xe8\x8a\xb1\xe7\x81\xab]",
- "159"=>"[\xe9\xa2\xa8\xe9\x88\xb4]", "160"=>"[\xe3\x83\x8f\xe3\x83\xad\xe3\x82\xa6\xe3\x82\xa3\xe3\x83\xb3]", "161"=>"[\xe3\x82\xaa\xe3\x83\xa1\xe3\x83\x87\xe3\x83\x88\xe3\x82\xa6]", "162"=>"[\xe4\xb8\x83\xe5\xa4\x95]", "163"=>"[\xe3\x81\x8a\xe6\x9c\x88\xe8\xa6\x8b]",
- "164"=>"[\xe3\x83\x9d\xe3\x82\xb1\xe3\x83\x99\xe3\x83\xab]", "165"=>"[\xe6\x96\xb0\xe8\x81\x9e]", "166"=>"[\xe3\x82\xb9\xe3\x83\x94\xe3\x83\xbc\xe3\x82\xab]", "167"=>"[\xe3\x83\xa1\xe3\x82\xac\xe3\x83\x9b\xe3\x83\xb3]", "168"=>"[\xe3\x82\xa2\xe3\x83\xb3\xe3\x83\x86\xe3\x83\x8a]",
- "169"=>"[\xe9\x80\x81\xe4\xbf\xa1BOX]", "170"=>"[\xe5\x8f\x97\xe4\xbf\xa1BOX]", "171"=>"[ABCD]", "172"=>"[abcd]", "173"=>"[1234]",
- "174"=>"[\xe8\xa8\x98\xe5\x8f\xb7]", "175"=>"[ABC]", "176"=>"[\xe3\x83\x9a\xe3\x83\xb3]", "177"=>"[\xe3\x81\x84\xe3\x81\x99]", "178"=>"[\xe3\x82\xaf\xe3\x83\xaa\xe3\x83\x83\xe3\x83\x97]",
- "179"=>"[MD]", "180"=>"[\xe3\x83\x95\xe3\x83\xad\xe3\x83\x83\xe3\x83\x94\xe3\x83\xbc]", "181"=>"[\xe7\x94\xbb\xe3\x81\xb3\xe3\x82\x87\xe3\x81\x86]", "182"=>"[\xe3\x82\xab\xe3\x83\xac\xe3\x83\xb3\xe3\x83\x80\xe3\x83\xbc]", "183"=>"[\xe3\x83\x95\xe3\x82\xa9\xe3\x83\xab\xe3\x83\x80]",
- "184"=>"[\xe5\x90\x8d\xe6\x9c\xad]", "185"=>"[\xe3\x82\xb9\xe3\x82\xaf\xe3\x83\xad\xe3\x83\xbc\xe3\x83\xab]", "186"=>"[\xe3\x82\xb0\xe3\x83\xa9\xe3\x83\x95]", "187"=>"[\xe5\xae\x9a\xe8\xa6\x8f]", "188"=>"[\xe4\xb8\x89\xe8\xa7\x92\xe5\xae\x9a\xe8\xa6\x8f]",
- "189"=>"[\xe3\x82\xb9\xe3\x83\x8e\xe3\x83\x9c]", "190"=>"[\xe3\x83\x88\xe3\x83\xad\xe3\x83\x95\xe3\x82\xa3\xe3\x83\xbc]", "191"=>"[\xe3\x83\x95\xe3\x83\x83\xe3\x83\x88\xe3\x83\x9c\xe3\x83\xbc\xe3\x83\xab]", "192"=>"[\xe6\xb0\xb4\xe6\xb3\xb3]", "193"=>"[\xe3\x83\x90\xe3\x82\xb9\xe5\x81\x9c]",
- "194"=>"[\xe9\xa7\x85]", "195"=>"[\xe3\x83\xad\xe3\x82\xb1\xe3\x83\x83\xe3\x83\x88]", "196"=>"[\xe3\x83\x88\xe3\x83\xa9\xe3\x83\x83\xe3\x82\xaf]", "197"=>"[\xe6\xb6\x88\xe9\x98\xb2\xe8\xbb\x8a]", "198"=>"[\xe6\x95\x91\xe6\x80\xa5\xe8\xbb\x8a]",
- "199"=>"[\xe3\x83\x91\xe3\x83\x88\xe3\x82\xab\xe3\x83\xbc]", "200"=>"[\xe5\xb7\xa5\xe4\xba\x8b\xe4\xb8\xad]", "201"=>"[\xe3\x82\xad\xe3\x83\xa3\xe3\x83\xb3\xe3\x83\x97]", "202"=>"[\xe8\xa6\xb3\xe8\xa6\xa7\xe8\xbb\x8a]", "203"=>"[\xe3\x82\xb8\xe3\x82\xa7\xe3\x83\x83\xe3\x83\x88\xe3\x82\xb3\xe3\x83\xbc\xe3\x82\xb9\xe3\x82\xbf\xe3\x83\xbc]",
- "204"=>"[\xe3\x82\xa4\xe3\x83\x99\xe3\x83\xb3\xe3\x83\x88]", "205"=>"[\xe6\xbc\x94\xe5\x8a\x87]", "206"=>"[\xe3\x82\xb2\xe3\x83\xbc\xe3\x83\xa0]", "207"=>"[\xe9\xba\xbb\xe9\x9b\x80]", "208"=>"[\xe7\x9a\x84\xe4\xb8\xad]",
- "209"=>"[777]", "210"=>"[\xe3\x83\x93\xe3\x83\xaa\xe3\x83\xa4\xe3\x83\xbc\xe3\x83\x89]", "211"=>"[\xe3\x82\xb5\xe3\x82\xa4\xe3\x82\xb3\xe3\x83\xad]", "212"=>"[\xe3\x83\x9c\xe3\x83\xbc\xe3\x83\xaa\xe3\x83\xb3\xe3\x82\xb0]", "213"=>"[\xe8\x8a\xb1\xe6\x9c\xad]",
- "214"=>"[\xe3\x82\xb8\xe3\x83\xa7\xe3\x83\xbc\xe3\x82\xab\xe3\x83\xbc]", "215"=>"[\xe3\x82\xb5\xe3\x83\x83\xe3\x82\xaf\xe3\x82\xb9]", "216"=>"[\xe3\x82\xae\xe3\x82\xbf\xe3\x83\xbc]", "217"=>"[\xe3\x83\x94\xe3\x82\xa2\xe3\x83\x8e]", "218"=>"[\xe3\x83\x88\xe3\x83\xa9\xe3\x83\xb3\xe3\x83\x9a\xe3\x83\x83\xe3\x83\x88]",
- "219"=>"[\xe3\x83\x90\xe3\x82\xa4\xe3\x82\xaa\xe3\x83\xaa\xe3\x83\xb3]", "220"=>"[\xe6\xad\x8c\xe8\xa8\x98\xe5\x8f\xb7]", "221"=>"[\xe3\x83\xa9\xe3\x82\xb8\xe3\x82\xaa]", "222"=>"[\xe3\x83\x93\xe3\x83\x87\xe3\x82\xaa]", "223"=>"[\xe8\x8a\xb1\xe6\x9d\x9f]",
- "224"=>"[\xe7\xb5\x90\xe5\xa9\x9a\xe5\xbc\x8f]", "225"=>"[18\xe7\xa6\x81]", "226"=>"[\xef\xbd\x89]", "227"=>"[10]", "228"=>"[\xe3\x83\x90\xe3\x83\xaa3]",
- "229"=>"[\xe3\x83\x9e\xe3\x83\x8a\xe3\x83\xbc\xe3\x83\xa2\xe3\x83\xbc\xe3\x83\x89]", "230"=>"[\xe3\x82\xb1\xe3\x83\xbc\xe3\x82\xbf\xe3\x82\xa4OFF]", "231"=>"[\xe3\x83\x95\xe3\x83\xa9\xe3\x82\xa4\xe3\x83\x91\xe3\x83\xb3]", "232"=>"[\xe3\x82\xbd\xe3\x83\x95\xe3\x83\x88\xe3\x82\xaf\xe3\x83\xaa\xe3\x83\xbc\xe3\x83\xa0]", "233"=>"[\xe3\x83\x9d\xe3\x83\x86\xe3\x83\x88]",
- "234"=>"[\xe3\x81\xa0\xe3\x82\x93\xe3\x81\x94]", "235"=>"[\xe3\x81\x9b\xe3\x82\x93\xe3\x81\xb9\xe3\x81\x84]", "236"=>"[\xe3\x83\x91\xe3\x82\xb9\xe3\x82\xbf]", "237"=>"[\xe3\x82\xab\xe3\x83\xac\xe3\x83\xbc]", "238"=>"[\xe3\x81\x8a\xe3\x81\xa7\xe3\x82\x93]",
- "239"=>"[\xe3\x81\x99\xe3\x81\x97]", "240"=>"[\xe5\xbc\x81\xe5\xbd\x93]", "241"=>"[\xe9\x8d\x8b]", "242"=>"[\xe3\x82\xab\xe3\x82\xad\xe6\xb0\xb7]", "243"=>"[\xe8\x82\x89]",
- "244"=>"[\xe3\x81\xaa\xe3\x82\x8b\xe3\x81\xa8]", "245"=>"[\xe3\x82\x84\xe3\x81\x8d\xe3\x81\x84\xe3\x82\x82]", "246"=>"[\xe3\x83\x94\xe3\x82\xb6]", "247"=>"[\xe3\x83\x81\xe3\x82\xad\xe3\x83\xb3]", "248"=>"[\xe3\x82\xa2\xe3\x82\xa4\xe3\x82\xb9\xe3\x82\xaf\xe3\x83\xaa\xe3\x83\xbc\xe3\x83\xa0]",
- "249"=>"[\xe3\x83\x89\xe3\x83\xbc\xe3\x83\x8a\xe3\x83\x84]", "250"=>"[\xe3\x82\xaf\xe3\x83\x83\xe3\x82\xad\xe3\x83\xbc]", "251"=>"[\xe3\x83\x81\xe3\x83\xa7\xe3\x82\xb3]", "252"=>"[\xe3\x82\xad\xe3\x83\xa3\xe3\x83\xb3\xe3\x83\x87\xe3\x82\xa3]", "253"=>"[\xe3\x83\x97\xe3\x83\xaa\xe3\x83\xb3]",
- "254"=>"[\xe3\x83\x8f\xe3\x83\x81\xe3\x83\x9f\xe3\x83\x84]", "255"=>"[\xe3\x82\xa8\xe3\x83\x93\xe3\x83\x95\xe3\x83\xa9\xe3\x82\xa4]", "256"=>"\xe2\x87\x94", "257"=>"\xe2\x86\x91\xe2\x86\x93", "258"=>"[\xe2\x86\x91]",
- "259"=>"[\xe2\x86\x93]", "260"=>"[\xe2\x86\x92]", "261"=>"[\xe2\x86\x90]", "262"=>"[>]", "263"=>"[<]",
- "264"=>"[>>]", "265"=>"[<<]", "266"=>"\xe2\x96\xb2", "267"=>"\xe2\x96\xbc", "268"=>"[\xc3\x97]",
- "269"=>"\xef\xbc\x81\xef\xbc\x9f", "270"=>"\xef\xbc\x81\xef\xbc\x81", "271"=>"[\xef\xbc\x9f]", "272"=>"\xef\xbd\x9e", "273"=>"[\xe3\x83\x95\xe3\x83\xaa\xe3\x83\xbc\xe3\x83\x80\xe3\x82\xa4\xe3\x83\xa4\xe3\x83\xab]",
- "274"=>"[\xe6\x97\x97]", "275"=>"[\xe2\x99\x82]", "276"=>"[\xe2\x99\x80]", "277"=>"[\xe3\x83\x89\xe3\x82\xa2]", "278"=>"[\xe7\xa6\x81\xe6\xad\xa2]",
- "279"=>"[\xe3\x83\x81\xe3\x82\xa7\xe3\x83\x83\xe3\x82\xaf\xe3\x83\x9e\xe3\x83\xbc\xe3\x82\xaf]", "280"=>"[CL]", "281"=>"[COOL]", "282"=>"[FREE]", "283"=>"[NG]",
- "284"=>"[SOS]", "285"=>"[UP!]", "286"=>"[VS]", "287"=>"[\xe3\x82\xb3\xe3\x82\xb3]", "288"=>"[\xe3\x82\xb5\xe3\x83\xbc\xe3\x83\x93\xe3\x82\xb9]",
- "289"=>"[\xe7\xa6\x81]", "290"=>"[\xe5\x90\x88]", "291"=>"[\xe6\x9c\x89]", "292"=>"[\xe7\x84\xa1]", "293"=>"[\xe6\x9c\x88]",
- "294"=>"[\xe7\x94\xb3]", "295"=>"[\xe5\x89\xb2]", "296"=>"[\xe6\x8c\x87]", "297"=>"[\xe5\x96\xb6]", "298"=>"[\xe7\xa5\x9d]",
- "299"=>"[\xe5\xbe\x97]", "300"=>"[\xe5\x8f\xaf]", "301"=>"[\xef\xbc\x8b]", "302"=>"[\xef\xbc\x8d]", "303"=>"[\xc3\xb7]",
- "304"=>"[\xe3\x83\x89\xe3\x83\xb3\xe3\x83\x83]", "305"=>"[\xe3\x82\xa6\xe3\x83\xb3\xe3\x83\x81]", "306"=>"[\xe5\x8a\x9b\xe3\x81\x93\xe3\x81\xb6]", "307"=>"[\xe3\x82\xaf\xe3\x83\xa9\xe3\x82\xaf\xe3\x83\xa9]", "308"=>"[\xe3\x83\x95\xe3\x82\xad\xe3\x83\x80\xe3\x82\xb7]",
- "309"=>"\xe2\x96\xa0", "310"=>"\xe2\x97\x86", "311"=>"[\xe8\x8a\xb1\xe4\xb8\xb8]", "312"=>"[100\xe7\x82\xb9]", "313"=>"\xe2\x86\x90\xe2\x94\x98",
- "314"=>"\xe2\x94\x94\xe2\x86\x92", "315"=>"[\xe9\x9b\xbb\xe6\xb1\xa0]", "316"=>"[\xe3\x82\xb3\xe3\x83\xb3\xe3\x82\xbb\xe3\x83\xb3\xe3\x83\x88]", "317"=>"[\xe3\x83\xa9\xe3\x82\xb8\xe3\x82\xaa\xe3\x83\x9c\xe3\x82\xbf\xe3\x83\xb3]", "318"=>"[\xe3\x83\x96\xe3\x83\x83\xe3\x82\xaf\xe3\x83\x9e\xe3\x83\xbc\xe3\x82\xaf]",
- "319"=>"[\xe3\x83\xaa\xe3\x83\xb3\xe3\x82\xaf]", "320"=>"[\xe2\x86\x90BACK]", "321"=>"[end]", "322"=>"[ON]", "323"=>"[SOON]",
- "324"=>"[TOP]", "325"=>"[\xe4\xba\xba\xe5\xb7\xae\xe3\x81\x97\xe6\x8c\x87]", "326"=>"[\xe6\x8b\x8d\xe6\x89\x8b]",
- ),
- 'unified_to_docomo' => array(
- "\xe2\x98\x80"=>"\xee\x98\xbe", "\xe2\x98\x81"=>"\xee\x98\xbf", "\xe2\x98\x94"=>"\xee\x99\x80", "\xe2\x9b\x84"=>"\xee\x99\x81",
- "\xe2\x9a\xa1"=>"\xee\x99\x82", "\xf0\x9f\x8c\x80"=>"\xee\x99\x83", "\xf0\x9f\x8c\x81"=>"\xee\x99\x84", "\xf0\x9f\x8c\x82"=>"\xee\x99\x85", "\xf0\x9f\x8c\x83"=>"\xee\x9a\xb3",
- "\xf0\x9f\x8c\x84"=>"\xee\x98\xbe", "\xf0\x9f\x8c\x85"=>"\xee\x98\xbe", "\xf0\x9f\x8c\x86"=>"[\xe5\xa4\x95\xe7\x84\xbc\xe3\x81\x91]", "\xf0\x9f\x8c\x87"=>"\xee\x98\xbe", "\xf0\x9f\x8c\x88"=>"[\xe8\x99\xb9]",
- "\xe2\x9d\x84"=>"[\xe9\x9b\xaa\xe7\xb5\x90\xe6\x99\xb6]", "\xe2\x9b\x85"=>"\xee\x98\xbe\xee\x98\xbf", "\xf0\x9f\x8c\x89"=>"\xee\x9a\xb3", "\xf0\x9f\x8c\x8a"=>"\xee\x9c\xbf", "\xf0\x9f\x8c\x8b"=>"[\xe7\x81\xab\xe5\xb1\xb1]",
- "\xf0\x9f\x8c\x8c"=>"\xee\x9a\xb3", "\xf0\x9f\x8c\x8f"=>"[\xe5\x9c\xb0\xe7\x90\x83]", "\xf0\x9f\x8c\x91"=>"\xee\x9a\x9c", "\xf0\x9f\x8c\x94"=>"\xee\x9a\x9d", "\xf0\x9f\x8c\x93"=>"\xee\x9a\x9e",
- "\xf0\x9f\x8c\x99"=>"\xee\x9a\x9f", "\xf0\x9f\x8c\x95"=>"\xee\x9a\xa0", "\xf0\x9f\x8c\x9b"=>"\xee\x9a\x9e", "\xf0\x9f\x8c\x9f"=>"[\xe2\x98\x86]", "\xf0\x9f\x8c\xa0"=>"\xe2\x98\x86\xe5\xbd\xa1",
- "\xf0\x9f\x95\x90"=>"\xee\x9a\xba", "\xf0\x9f\x95\x91"=>"\xee\x9a\xba", "\xf0\x9f\x95\x92"=>"\xee\x9a\xba", "\xf0\x9f\x95\x93"=>"\xee\x9a\xba", "\xf0\x9f\x95\x94"=>"\xee\x9a\xba",
- "\xf0\x9f\x95\x95"=>"\xee\x9a\xba", "\xf0\x9f\x95\x96"=>"\xee\x9a\xba", "\xf0\x9f\x95\x97"=>"\xee\x9a\xba", "\xf0\x9f\x95\x98"=>"\xee\x9a\xba", "\xf0\x9f\x95\x99"=>"\xee\x9a\xba",
- "\xf0\x9f\x95\x9a"=>"\xee\x9a\xba", "\xf0\x9f\x95\x9b"=>"\xee\x9a\xba", "\xe2\x8c\x9a"=>"\xee\x9c\x9f", "\xe2\x8c\x9b"=>"\xee\x9c\x9c", "\xe2\x8f\xb0"=>"\xee\x9a\xba",
- "\xe2\x8f\xb3"=>"\xee\x9c\x9c", "\xe2\x99\x88"=>"\xee\x99\x86", "\xe2\x99\x89"=>"\xee\x99\x87", "\xe2\x99\x8a"=>"\xee\x99\x88", "\xe2\x99\x8b"=>"\xee\x99\x89",
- "\xe2\x99\x8c"=>"\xee\x99\x8a", "\xe2\x99\x8d"=>"\xee\x99\x8b", "\xe2\x99\x8e"=>"\xee\x99\x8c", "\xe2\x99\x8f"=>"\xee\x99\x8d", "\xe2\x99\x90"=>"\xee\x99\x8e",
- "\xe2\x99\x91"=>"\xee\x99\x8f", "\xe2\x99\x92"=>"\xee\x99\x90", "\xe2\x99\x93"=>"\xee\x99\x91", "\xe2\x9b\x8e"=>"[\xe8\x9b\x87\xe4\xbd\xbf\xe5\xba\xa7]", "\xf0\x9f\x8d\x80"=>"\xee\x9d\x81",
- "\xf0\x9f\x8c\xb7"=>"\xee\x9d\x83", "\xf0\x9f\x8c\xb1"=>"\xee\x9d\x86", "\xf0\x9f\x8d\x81"=>"\xee\x9d\x87", "\xf0\x9f\x8c\xb8"=>"\xee\x9d\x88", "\xf0\x9f\x8c\xb9"=>"[\xe3\x83\x90\xe3\x83\xa9]",
- "\xf0\x9f\x8d\x82"=>"\xee\x9d\x87", "\xf0\x9f\x8d\x83"=>"[\xe9\xa2\xa8\xe3\x81\xab\xe8\x88\x9e\xe3\x81\x86\xe8\x91\x89]", "\xf0\x9f\x8c\xba"=>"[\xe3\x83\x8f\xe3\x82\xa4\xe3\x83\x93\xe3\x82\xb9\xe3\x82\xab\xe3\x82\xb9]", "\xf0\x9f\x8c\xbb"=>"[\xe3\x81\xb2\xe3\x81\xbe\xe3\x82\x8f\xe3\x82\x8a]", "\xf0\x9f\x8c\xb4"=>"[\xe3\x83\xa4\xe3\x82\xb7]",
- "\xf0\x9f\x8c\xb5"=>"[\xe3\x82\xb5\xe3\x83\x9c\xe3\x83\x86\xe3\x83\xb3]", "\xf0\x9f\x8c\xbe"=>"[\xe7\xa8\xb2\xe7\xa9\x82]", "\xf0\x9f\x8c\xbd"=>"[\xe3\x81\xa8\xe3\x81\x86\xe3\x82\x82\xe3\x82\x8d\xe3\x81\x93\xe3\x81\x97]", "\xf0\x9f\x8d\x84"=>"[\xe3\x82\xad\xe3\x83\x8e\xe3\x82\xb3]", "\xf0\x9f\x8c\xb0"=>"[\xe6\xa0\x97]",
- "\xf0\x9f\x8c\xbc"=>"[\xe8\x8a\xb1]", "\xf0\x9f\x8c\xbf"=>"\xee\x9d\x81", "\xf0\x9f\x8d\x92"=>"\xee\x9d\x82", "\xf0\x9f\x8d\x8c"=>"\xee\x9d\x84", "\xf0\x9f\x8d\x8e"=>"\xee\x9d\x85",
- "\xf0\x9f\x8d\x8a"=>"[\xe3\x81\xbf\xe3\x81\x8b\xe3\x82\x93]", "\xf0\x9f\x8d\x93"=>"[\xe3\x82\xa4\xe3\x83\x81\xe3\x82\xb4]", "\xf0\x9f\x8d\x89"=>"[\xe3\x82\xb9\xe3\x82\xa4\xe3\x82\xab]", "\xf0\x9f\x8d\x85"=>"[\xe3\x83\x88\xe3\x83\x9e\xe3\x83\x88]", "\xf0\x9f\x8d\x86"=>"[\xe3\x83\x8a\xe3\x82\xb9]",
- "\xf0\x9f\x8d\x88"=>"[\xe3\x83\xa1\xe3\x83\xad\xe3\x83\xb3]", "\xf0\x9f\x8d\x8d"=>"[\xe3\x83\x91\xe3\x82\xa4\xe3\x83\x8a\xe3\x83\x83\xe3\x83\x97\xe3\x83\xab]", "\xf0\x9f\x8d\x87"=>"[\xe3\x83\x96\xe3\x83\x89\xe3\x82\xa6]", "\xf0\x9f\x8d\x91"=>"[\xe3\x83\xa2\xe3\x83\xa2]", "\xf0\x9f\x8d\x8f"=>"\xee\x9d\x85",
- "\xf0\x9f\x91\x80"=>"\xee\x9a\x91", "\xf0\x9f\x91\x82"=>"\xee\x9a\x92", "\xf0\x9f\x91\x83"=>"[\xe9\xbc\xbb]", "\xf0\x9f\x91\x84"=>"\xee\x9b\xb9", "\xf0\x9f\x91\x85"=>"\xee\x9c\xa8",
- "\xf0\x9f\x92\x84"=>"\xee\x9c\x90", "\xf0\x9f\x92\x85"=>"[\xe3\x83\x9e\xe3\x83\x8b\xe3\x82\xad\xe3\x83\xa5\xe3\x82\xa2]", "\xf0\x9f\x92\x86"=>"[\xe3\x82\xa8\xe3\x82\xb9\xe3\x83\x86]", "\xf0\x9f\x92\x87"=>"\xee\x99\xb5", "\xf0\x9f\x92\x88"=>"[\xe5\xba\x8a\xe5\xb1\x8b]",
- "\xf0\x9f\x91\xa4"=>"\xee\x9a\xb1", "\xf0\x9f\x91\xa6"=>"\xee\x9b\xb0", "\xf0\x9f\x91\xa7"=>"\xee\x9b\xb0", "\xf0\x9f\x91\xa8"=>"\xee\x9b\xb0", "\xf0\x9f\x91\xa9"=>"\xee\x9b\xb0",
- "\xf0\x9f\x91\xaa"=>"[\xe5\xae\xb6\xe6\x97\x8f]", "\xf0\x9f\x91\xab"=>"[\xe3\x82\xab\xe3\x83\x83\xe3\x83\x97\xe3\x83\xab]", "\xf0\x9f\x91\xae"=>"[\xe8\xad\xa6\xe5\xae\x98]", "\xf0\x9f\x91\xaf"=>"[\xe3\x83\x90\xe3\x83\x8b\xe3\x83\xbc]", "\xf0\x9f\x91\xb0"=>"[\xe8\x8a\xb1\xe5\xab\x81]",
- "\xf0\x9f\x91\xb1"=>"[\xe7\x99\xbd\xe4\xba\xba]", "\xf0\x9f\x91\xb2"=>"[\xe4\xb8\xad\xe5\x9b\xbd\xe4\xba\xba]", "\xf0\x9f\x91\xb3"=>"[\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x89\xe4\xba\xba]", "\xf0\x9f\x91\xb4"=>"[\xe3\x81\x8a\xe3\x81\x98\xe3\x81\x84\xe3\x81\x95\xe3\x82\x93]", "\xf0\x9f\x91\xb5"=>"[\xe3\x81\x8a\xe3\x81\xb0\xe3\x81\x82\xe3\x81\x95\xe3\x82\x93]",
- "\xf0\x9f\x91\xb6"=>"[\xe8\xb5\xa4\xe3\x81\xa1\xe3\x82\x83\xe3\x82\x93]", "\xf0\x9f\x91\xb7"=>"[\xe5\xb7\xa5\xe4\xba\x8b\xe7\x8f\xbe\xe5\xa0\xb4\xe3\x81\xae\xe4\xba\xba]", "\xf0\x9f\x91\xb8"=>"[\xe3\x81\x8a\xe5\xa7\xab\xe6\xa7\x98]", "\xf0\x9f\x91\xb9"=>"[\xe3\x81\xaa\xe3\x81\xbe\xe3\x81\xaf\xe3\x81\x92]", "\xf0\x9f\x91\xba"=>"[\xe5\xa4\xa9\xe7\x8b\x97]",
- "\xf0\x9f\x91\xbb"=>"[\xe3\x81\x8a\xe5\x8c\x96\xe3\x81\x91]", "\xf0\x9f\x91\xbc"=>"[\xe5\xa4\xa9\xe4\xbd\xbf]", "\xf0\x9f\x91\xbd"=>"[UFO]", "\xf0\x9f\x91\xbe"=>"[\xe5\xae\x87\xe5\xae\x99\xe4\xba\xba]", "\xf0\x9f\x91\xbf"=>"[\xe3\x82\xa2\xe3\x82\xaf\xe3\x83\x9e]",
- "\xf0\x9f\x92\x80"=>"[\xe3\x83\x89\xe3\x82\xaf\xe3\x83\xad]", "\xf0\x9f\x92\x81"=>"[\xe6\xa1\x88\xe5\x86\x85]", "\xf0\x9f\x92\x82"=>"[\xe8\xa1\x9b\xe5\x85\xb5]", "\xf0\x9f\x92\x83"=>"[\xe3\x83\x80\xe3\x83\xb3\xe3\x82\xb9]", "\xf0\x9f\x90\x8c"=>"\xee\x9d\x8e",
- "\xf0\x9f\x90\x8d"=>"[\xe3\x83\x98\xe3\x83\x93]", "\xf0\x9f\x90\x8e"=>"\xee\x9d\x94", "\xf0\x9f\x90\x94"=>"[\xe3\x83\x8b\xe3\x83\xaf\xe3\x83\x88\xe3\x83\xaa]", "\xf0\x9f\x90\x97"=>"[\xe3\x82\xa4\xe3\x83\x8e\xe3\x82\xb7\xe3\x82\xb7]", "\xf0\x9f\x90\xab"=>"[\xe3\x83\xa9\xe3\x82\xaf\xe3\x83\x80]",
- "\xf0\x9f\x90\x98"=>"[\xe3\x82\xbe\xe3\x82\xa6]", "\xf0\x9f\x90\xa8"=>"[\xe3\x82\xb3\xe3\x82\xa2\xe3\x83\xa9]", "\xf0\x9f\x90\x92"=>"[\xe3\x82\xb5\xe3\x83\xab]", "\xf0\x9f\x90\x91"=>"[\xe3\x83\x92\xe3\x83\x84\xe3\x82\xb8]", "\xf0\x9f\x90\x99"=>"[\xe3\x82\xbf\xe3\x82\xb3]",
- "\xf0\x9f\x90\x9a"=>"[\xe5\xb7\xbb\xe8\xb2\x9d]", "\xf0\x9f\x90\x9b"=>"[\xe3\x82\xb2\xe3\x82\xb8\xe3\x82\xb2\xe3\x82\xb8]", "\xf0\x9f\x90\x9c"=>"[\xe3\x82\xa2\xe3\x83\xaa]", "\xf0\x9f\x90\x9d"=>"[\xe3\x83\x9f\xe3\x83\x84\xe3\x83\x90\xe3\x83\x81]", "\xf0\x9f\x90\x9e"=>"[\xe3\x81\xa6\xe3\x82\x93\xe3\x81\xa8\xe3\x81\x86\xe8\x99\xab]",
- "\xf0\x9f\x90\xa0"=>"\xee\x9d\x91", "\xf0\x9f\x90\xa1"=>"\xee\x9d\x91", "\xf0\x9f\x90\xa2"=>"[\xe3\x82\xab\xe3\x83\xa1]", "\xf0\x9f\x90\xa4"=>"\xee\x9d\x8f", "\xf0\x9f\x90\xa5"=>"\xee\x9d\x8f",
- "\xf0\x9f\x90\xa6"=>"\xee\x9d\x8f", "\xf0\x9f\x90\xa3"=>"\xee\x9d\x8f", "\xf0\x9f\x90\xa7"=>"\xee\x9d\x90", "\xf0\x9f\x90\xa9"=>"\xee\x9a\xa1", "\xf0\x9f\x90\x9f"=>"\xee\x9d\x91",
- "\xf0\x9f\x90\xac"=>"[\xe3\x82\xa4\xe3\x83\xab\xe3\x82\xab]", "\xf0\x9f\x90\xad"=>"[\xe3\x83\x8d\xe3\x82\xba\xe3\x83\x9f]", "\xf0\x9f\x90\xaf"=>"[\xe3\x83\x88\xe3\x83\xa9]", "\xf0\x9f\x90\xb1"=>"\xee\x9a\xa2", "\xf0\x9f\x90\xb3"=>"[\xe3\x82\xaf\xe3\x82\xb8\xe3\x83\xa9]",
- "\xf0\x9f\x90\xb4"=>"\xee\x9d\x94", "\xf0\x9f\x90\xb5"=>"[\xe3\x82\xb5\xe3\x83\xab]", "\xf0\x9f\x90\xb6"=>"\xee\x9a\xa1", "\xf0\x9f\x90\xb7"=>"\xee\x9d\x95", "\xf0\x9f\x90\xbb"=>"[\xe3\x82\xaf\xe3\x83\x9e]",
- "\xf0\x9f\x90\xb9"=>"[\xe3\x83\x8f\xe3\x83\xa0\xe3\x82\xb9\xe3\x82\xbf\xe3\x83\xbc]", "\xf0\x9f\x90\xba"=>"\xee\x9a\xa1", "\xf0\x9f\x90\xae"=>"[\xe7\x89\x9b]", "\xf0\x9f\x90\xb0"=>"[\xe3\x82\xa6\xe3\x82\xb5\xe3\x82\xae]", "\xf0\x9f\x90\xb8"=>"[\xe3\x82\xab\xe3\x82\xa8\xe3\x83\xab]",
- "\xf0\x9f\x90\xbe"=>"\xee\x9a\x98", "\xf0\x9f\x90\xb2"=>"[\xe8\xbe\xb0]", "\xf0\x9f\x90\xbc"=>"[\xe3\x83\x91\xe3\x83\xb3\xe3\x83\x80]", "\xf0\x9f\x90\xbd"=>"\xee\x9d\x95", "\xf0\x9f\x98\xa0"=>"\xee\x9b\xb1",
- "\xf0\x9f\x98\xa9"=>"\xee\x9b\xb3", "\xf0\x9f\x98\xb2"=>"\xee\x9b\xb4", "\xf0\x9f\x98\x9e"=>"\xee\x9b\xb2", "\xf0\x9f\x98\xb5"=>"\xee\x9b\xb4", "\xf0\x9f\x98\xb0"=>"\xee\x9c\xa3",
- "\xf0\x9f\x98\x92"=>"\xee\x9c\xa5", "\xf0\x9f\x98\x8d"=>"\xee\x9c\xa6", "\xf0\x9f\x98\xa4"=>"\xee\x9d\x93", "\xf0\x9f\x98\x9c"=>"\xee\x9c\xa8", "\xf0\x9f\x98\x9d"=>"\xee\x9c\xa8",
- "\xf0\x9f\x98\x8b"=>"\xee\x9d\x92", "\xf0\x9f\x98\x98"=>"\xee\x9c\xa6", "\xf0\x9f\x98\x9a"=>"\xee\x9c\xa6", "\xf0\x9f\x98\xb7"=>"[\xe9\xa2\xa8\xe9\x82\xaa\xe3\x81\xb2\xe3\x81\x8d]", "\xf0\x9f\x98\xb3"=>"\xee\x9c\xaa",
- "\xf0\x9f\x98\x83"=>"\xee\x9b\xb0", "\xf0\x9f\x98\x85"=>"\xee\x9c\xa2", "\xf0\x9f\x98\x86"=>"\xee\x9c\xaa", "\xf0\x9f\x98\x81"=>"\xee\x9d\x93", "\xf0\x9f\x98\x82"=>"\xee\x9c\xaa",
- "\xf0\x9f\x98\x8a"=>"\xee\x9b\xb0", "\xe2\x98\xba"=>"\xee\x9b\xb0", "\xf0\x9f\x98\x84"=>"\xee\x9b\xb0", "\xf0\x9f\x98\xa2"=>"\xee\x9c\xae", "\xf0\x9f\x98\xad"=>"\xee\x9c\xad",
- "\xf0\x9f\x98\xa8"=>"\xee\x9d\x97", "\xf0\x9f\x98\xa3"=>"\xee\x9c\xab", "\xf0\x9f\x98\xa1"=>"\xee\x9c\xa4", "\xf0\x9f\x98\x8c"=>"\xee\x9c\xa1", "\xf0\x9f\x98\x96"=>"\xee\x9b\xb3",
- "\xf0\x9f\x98\x94"=>"\xee\x9c\xa0", "\xf0\x9f\x98\xb1"=>"\xee\x9d\x97", "\xf0\x9f\x98\xaa"=>"\xee\x9c\x81", "\xf0\x9f\x98\x8f"=>"\xee\x9c\xac", "\xf0\x9f\x98\x93"=>"\xee\x9c\xa3",
- "\xf0\x9f\x98\xa5"=>"\xee\x9c\xa3", "\xf0\x9f\x98\xab"=>"\xee\x9c\xab", "\xf0\x9f\x98\x89"=>"\xee\x9c\xa9", "\xf0\x9f\x98\xba"=>"\xee\x9b\xb0", "\xf0\x9f\x98\xb8"=>"\xee\x9d\x93",
- "\xf0\x9f\x98\xb9"=>"\xee\x9c\xaa", "\xf0\x9f\x98\xbd"=>"\xee\x9c\xa6", "\xf0\x9f\x98\xbb"=>"\xee\x9c\xa6", "\xf0\x9f\x98\xbf"=>"\xee\x9c\xae", "\xf0\x9f\x98\xbe"=>"\xee\x9c\xa4",
- "\xf0\x9f\x98\xbc"=>"\xee\x9d\x93", "\xf0\x9f\x99\x80"=>"\xee\x9b\xb3", "\xf0\x9f\x99\x85"=>"\xee\x9c\xaf", "\xf0\x9f\x99\x86"=>"\xee\x9c\x8b", "\xf0\x9f\x99\x87"=>"m(_ _)m",
- "\xf0\x9f\x99\x88"=>"(/_\xef\xbc\xbc)", "\xf0\x9f\x99\x8a"=>"(\xe3\x83\xbb\xc3\x97\xe3\x83\xbb)", "\xf0\x9f\x99\x89"=>"|(\xe3\x83\xbb\xc3\x97\xe3\x83\xbb)|", "\xf0\x9f\x99\x8b"=>"(^-^)/", "\xf0\x9f\x99\x8c"=>"\xef\xbc\xbc(^o^)\xef\xbc\x8f",
- "\xf0\x9f\x99\x8d"=>"\xee\x9b\xb3", "\xf0\x9f\x99\x8e"=>"\xee\x9b\xb1", "\xf0\x9f\x99\x8f"=>"(>\xe4\xba\xba<)", "\xf0\x9f\x8f\xa0"=>"\xee\x99\xa3", "\xf0\x9f\x8f\xa1"=>"\xee\x99\xa3",
- "\xf0\x9f\x8f\xa2"=>"\xee\x99\xa4", "\xf0\x9f\x8f\xa3"=>"\xee\x99\xa5", "\xf0\x9f\x8f\xa5"=>"\xee\x99\xa6", "\xf0\x9f\x8f\xa6"=>"\xee\x99\xa7", "\xf0\x9f\x8f\xa7"=>"\xee\x99\xa8",
- "\xf0\x9f\x8f\xa8"=>"\xee\x99\xa9", "\xf0\x9f\x8f\xa9"=>"\xee\x99\xa9\xee\x9b\xaf", "\xf0\x9f\x8f\xaa"=>"\xee\x99\xaa", "\xf0\x9f\x8f\xab"=>"\xee\x9c\xbe", "\xe2\x9b\xaa"=>"[\xe6\x95\x99\xe4\xbc\x9a]",
- "\xe2\x9b\xb2"=>"[\xe5\x99\xb4\xe6\xb0\xb4]", "\xf0\x9f\x8f\xac"=>"[\xe3\x83\x87\xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88]", "\xf0\x9f\x8f\xaf"=>"[\xe5\x9f\x8e]", "\xf0\x9f\x8f\xb0"=>"[\xe5\x9f\x8e]", "\xf0\x9f\x8f\xad"=>"[\xe5\xb7\xa5\xe5\xa0\xb4]",
- "\xe2\x9a\x93"=>"\xee\x99\xa1", "\xf0\x9f\x8f\xae"=>"\xee\x9d\x8b", "\xf0\x9f\x97\xbb"=>"\xee\x9d\x80", "\xf0\x9f\x97\xbc"=>"[\xe6\x9d\xb1\xe4\xba\xac\xe3\x82\xbf\xe3\x83\xaf\xe3\x83\xbc]", "\xf0\x9f\x97\xbd"=>"[\xe8\x87\xaa\xe7\x94\xb1\xe3\x81\xae\xe5\xa5\xb3\xe7\xa5\x9e]",
- "\xf0\x9f\x97\xbe"=>"[\xe6\x97\xa5\xe6\x9c\xac\xe5\x9c\xb0\xe5\x9b\xb3]", "\xf0\x9f\x97\xbf"=>"[\xe3\x83\xa2\xe3\x82\xa2\xe3\x82\xa4]", "\xf0\x9f\x91\x9e"=>"\xee\x9a\x99", "\xf0\x9f\x91\x9f"=>"\xee\x9a\x99", "\xf0\x9f\x91\xa0"=>"\xee\x99\xb4",
- "\xf0\x9f\x91\xa1"=>"\xee\x99\xb4", "\xf0\x9f\x91\xa2"=>"[\xe3\x83\x96\xe3\x83\xbc\xe3\x83\x84]", "\xf0\x9f\x91\xa3"=>"\xee\x9a\x98", "\xf0\x9f\x91\x93"=>"\xee\x9a\x9a", "\xf0\x9f\x91\x95"=>"\xee\x9c\x8e",
- "\xf0\x9f\x91\x96"=>"\xee\x9c\x91", "\xf0\x9f\x91\x91"=>"\xee\x9c\x9a", "\xf0\x9f\x91\x94"=>"[\xe3\x83\x8d\xe3\x82\xaf\xe3\x82\xbf\xe3\x82\xa4]", "\xf0\x9f\x91\x92"=>"[\xe5\xb8\xbd\xe5\xad\x90]", "\xf0\x9f\x91\x97"=>"[\xe3\x83\x89\xe3\x83\xac\xe3\x82\xb9]",
- "\xf0\x9f\x91\x98"=>"[\xe7\x9d\x80\xe7\x89\xa9]", "\xf0\x9f\x91\x99"=>"[\xe3\x83\x93\xe3\x82\xad\xe3\x83\x8b]", "\xf0\x9f\x91\x9a"=>"\xee\x9c\x8e", "\xf0\x9f\x91\x9b"=>"\xee\x9c\x8f", "\xf0\x9f\x91\x9c"=>"\xee\x9a\x82",
- "\xf0\x9f\x91\x9d"=>"\xee\x9a\xad", "\xf0\x9f\x92\xb0"=>"\xee\x9c\x95", "\xf0\x9f\x92\xb1"=>"[$\xef\xbf\xa5]", "\xf0\x9f\x92\xb9"=>"[\xe6\xa0\xaa\xe4\xbe\xa1]", "\xf0\x9f\x92\xb2"=>"\xee\x9c\x95",
- "\xf0\x9f\x92\xb3"=>"[\xe3\x82\xab\xe3\x83\xbc\xe3\x83\x89]", "\xf0\x9f\x92\xb4"=>"\xee\x9b\x96", "\xf0\x9f\x92\xb5"=>"\xee\x9c\x95", "\xf0\x9f\x92\xb8"=>"[\xe9\xa3\x9b\xe3\x82\x93\xe3\x81\xa7\xe3\x81\x84\xe3\x81\x8f\xe3\x81\x8a\xe9\x87\x91]", "\xf0\x9f\x87\xa8\xf0\x9f\x87\xb3"=>"[\xe4\xb8\xad\xe5\x9b\xbd]",
- "\xf0\x9f\x87\xa9\xf0\x9f\x87\xaa"=>"[\xe3\x83\x89\xe3\x82\xa4\xe3\x83\x84]", "\xf0\x9f\x87\xaa\xf0\x9f\x87\xb8"=>"[\xe3\x82\xb9\xe3\x83\x9a\xe3\x82\xa4\xe3\x83\xb3]", "\xf0\x9f\x87\xab\xf0\x9f\x87\xb7"=>"[\xe3\x83\x95\xe3\x83\xa9\xe3\x83\xb3\xe3\x82\xb9]", "\xf0\x9f\x87\xac\xf0\x9f\x87\xa7"=>"[\xe3\x82\xa4\xe3\x82\xae\xe3\x83\xaa\xe3\x82\xb9]", "\xf0\x9f\x87\xae\xf0\x9f\x87\xb9"=>"[\xe3\x82\xa4\xe3\x82\xbf\xe3\x83\xaa\xe3\x82\xa2]",
- "\xf0\x9f\x87\xaf\xf0\x9f\x87\xb5"=>"[\xe6\x97\xa5\xe3\x81\xae\xe4\xb8\xb8]", "\xf0\x9f\x87\xb0\xf0\x9f\x87\xb7"=>"[\xe9\x9f\x93\xe5\x9b\xbd]", "\xf0\x9f\x87\xb7\xf0\x9f\x87\xba"=>"[\xe3\x83\xad\xe3\x82\xb7\xe3\x82\xa2]", "\xf0\x9f\x87\xba\xf0\x9f\x87\xb8"=>"[USA]", "\xf0\x9f\x94\xa5"=>"[\xe7\x82\x8e]",
- "\xf0\x9f\x94\xa6"=>"\xee\x9b\xbb", "\xf0\x9f\x94\xa7"=>"\xee\x9c\x98", "\xf0\x9f\x94\xa8"=>"[\xe3\x83\x8f\xe3\x83\xb3\xe3\x83\x9e\xe3\x83\xbc]", "\xf0\x9f\x94\xa9"=>"[\xe3\x83\x8d\xe3\x82\xb8]", "\xf0\x9f\x94\xaa"=>"[\xe5\x8c\x85\xe4\xb8\x81]",
- "\xf0\x9f\x94\xab"=>"[\xe3\x83\x94\xe3\x82\xb9\xe3\x83\x88\xe3\x83\xab]", "\xf0\x9f\x94\xae"=>"[\xe5\x8d\xa0\xe3\x81\x84]", "\xf0\x9f\x94\xaf"=>"[\xe5\x8d\xa0\xe3\x81\x84]", "\xf0\x9f\x94\xb0"=>"[\xe8\x8b\xa5\xe8\x91\x89\xe3\x83\x9e\xe3\x83\xbc\xe3\x82\xaf]", "\xf0\x9f\x94\xb1"=>"\xee\x9c\x9a",
- "\xf0\x9f\x92\x89"=>"[\xe6\xb3\xa8\xe5\xb0\x84]", "\xf0\x9f\x92\x8a"=>"[\xe8\x96\xac]", "\xf0\x9f\x85\xb0"=>"[A]", "\xf0\x9f\x85\xb1"=>"[B]", "\xf0\x9f\x86\x8e"=>"[AB]",
- "\xf0\x9f\x85\xbe"=>"[O]", "\xf0\x9f\x8e\x80"=>"\xee\x9a\x84", "\xf0\x9f\x8e\x81"=>"\xee\x9a\x85", "\xf0\x9f\x8e\x82"=>"\xee\x9a\x86", "\xf0\x9f\x8e\x84"=>"\xee\x9a\xa4",
- "\xf0\x9f\x8e\x85"=>"[\xe3\x82\xb5\xe3\x83\xb3\xe3\x82\xbf]", "\xf0\x9f\x8e\x8c"=>"[\xe7\xa5\x9d\xe6\x97\xa5]", "\xf0\x9f\x8e\x86"=>"[\xe8\x8a\xb1\xe7\x81\xab]", "\xf0\x9f\x8e\x88"=>"[\xe9\xa2\xa8\xe8\x88\xb9]", "\xf0\x9f\x8e\x89"=>"[\xe3\x82\xaf\xe3\x83\xa9\xe3\x83\x83\xe3\x82\xab\xe3\x83\xbc]",
- "\xf0\x9f\x8e\x8d"=>"[\xe9\x96\x80\xe6\x9d\xbe]", "\xf0\x9f\x8e\x8e"=>"[\xe3\x81\xb2\xe3\x81\xaa\xe7\xa5\xad\xe3\x82\x8a]", "\xf0\x9f\x8e\x93"=>"[\xe5\x8d\x92\xe6\xa5\xad\xe5\xbc\x8f]", "\xf0\x9f\x8e\x92"=>"[\xe3\x83\xa9\xe3\x83\xb3\xe3\x83\x89\xe3\x82\xbb\xe3\x83\xab]", "\xf0\x9f\x8e\x8f"=>"[\xe3\x81\x93\xe3\x81\x84\xe3\x81\xae\xe3\x81\xbc\xe3\x82\x8a]",
- "\xf0\x9f\x8e\x87"=>"[\xe7\xb7\x9a\xe9\xa6\x99\xe8\x8a\xb1\xe7\x81\xab]", "\xf0\x9f\x8e\x90"=>"[\xe9\xa2\xa8\xe9\x88\xb4]", "\xf0\x9f\x8e\x83"=>"[\xe3\x83\x8f\xe3\x83\xad\xe3\x82\xa6\xe3\x82\xa3\xe3\x83\xb3]", "\xf0\x9f\x8e\x8a"=>"[\xe3\x82\xaa\xe3\x83\xa1\xe3\x83\x87\xe3\x83\x88\xe3\x82\xa6]", "\xf0\x9f\x8e\x8b"=>"[\xe4\xb8\x83\xe5\xa4\x95]",
- "\xf0\x9f\x8e\x91"=>"[\xe3\x81\x8a\xe6\x9c\x88\xe8\xa6\x8b]", "\xf0\x9f\x93\x9f"=>"\xee\x99\x9a", "\xe2\x98\x8e"=>"\xee\x9a\x87", "\xf0\x9f\x93\x9e"=>"\xee\x9a\x87", "\xf0\x9f\x93\xb1"=>"\xee\x9a\x88",
- "\xf0\x9f\x93\xb2"=>"\xee\x9b\x8e", "\xf0\x9f\x93\x9d"=>"\xee\x9a\x89", "\xf0\x9f\x93\xa0"=>"\xee\x9b\x90", "\xe2\x9c\x89"=>"\xee\x9b\x93", "\xf0\x9f\x93\xa8"=>"\xee\x9b\x8f",
- "\xf0\x9f\x93\xa9"=>"\xee\x9b\x8f", "\xf0\x9f\x93\xaa"=>"\xee\x99\xa5", "\xf0\x9f\x93\xab"=>"\xee\x99\xa5", "\xf0\x9f\x93\xae"=>"\xee\x99\xa5", "\xf0\x9f\x93\xb0"=>"[\xe6\x96\xb0\xe8\x81\x9e]",
- "\xf0\x9f\x93\xa2"=>"[\xe3\x82\xb9\xe3\x83\x94\xe3\x83\xbc\xe3\x82\xab]", "\xf0\x9f\x93\xa3"=>"[\xe3\x83\xa1\xe3\x82\xac\xe3\x83\x9b\xe3\x83\xb3]", "\xf0\x9f\x93\xa1"=>"[\xe3\x82\xa2\xe3\x83\xb3\xe3\x83\x86\xe3\x83\x8a]", "\xf0\x9f\x93\xa4"=>"[\xe9\x80\x81\xe4\xbf\xa1BOX]", "\xf0\x9f\x93\xa5"=>"[\xe5\x8f\x97\xe4\xbf\xa1BOX]",
- "\xf0\x9f\x93\xa6"=>"\xee\x9a\x85", "\xf0\x9f\x93\xa7"=>"\xee\x9b\x93", "\xf0\x9f\x94\xa0"=>"[ABCD]", "\xf0\x9f\x94\xa1"=>"[abcd]", "\xf0\x9f\x94\xa2"=>"[1234]",
- "\xf0\x9f\x94\xa3"=>"[\xe8\xa8\x98\xe5\x8f\xb7]", "\xf0\x9f\x94\xa4"=>"[ABC]", "\xe2\x9c\x92"=>"\xee\x9a\xae", "\xf0\x9f\x92\xba"=>"\xee\x9a\xb2", "\xf0\x9f\x92\xbb"=>"\xee\x9c\x96",
- "\xe2\x9c\x8f"=>"\xee\x9c\x99", "\xf0\x9f\x93\x8e"=>"\xee\x9c\xb0", "\xf0\x9f\x92\xbc"=>"\xee\x9a\x82", "\xf0\x9f\x92\xbd"=>"[MD]", "\xf0\x9f\x92\xbe"=>"[\xe3\x83\x95\xe3\x83\xad\xe3\x83\x83\xe3\x83\x94\xe3\x83\xbc]",
- "\xf0\x9f\x92\xbf"=>"\xee\x9a\x8c", "\xf0\x9f\x93\x80"=>"\xee\x9a\x8c", "\xe2\x9c\x82"=>"\xee\x99\xb5", "\xf0\x9f\x93\x8d"=>"[\xe7\x94\xbb\xe3\x81\xb3\xe3\x82\x87\xe3\x81\x86]", "\xf0\x9f\x93\x83"=>"\xee\x9a\x89",
- "\xf0\x9f\x93\x84"=>"\xee\x9a\x89", "\xf0\x9f\x93\x85"=>"[\xe3\x82\xab\xe3\x83\xac\xe3\x83\xb3\xe3\x83\x80\xe3\x83\xbc]", "\xf0\x9f\x93\x81"=>"[\xe3\x83\x95\xe3\x82\xa9\xe3\x83\xab\xe3\x83\x80]", "\xf0\x9f\x93\x82"=>"[\xe3\x83\x95\xe3\x82\xa9\xe3\x83\xab\xe3\x83\x80]", "\xf0\x9f\x93\x93"=>"\xee\x9a\x83",
- "\xf0\x9f\x93\x96"=>"\xee\x9a\x83", "\xf0\x9f\x93\x94"=>"\xee\x9a\x83", "\xf0\x9f\x93\x95"=>"\xee\x9a\x83", "\xf0\x9f\x93\x97"=>"\xee\x9a\x83", "\xf0\x9f\x93\x98"=>"\xee\x9a\x83",
- "\xf0\x9f\x93\x99"=>"\xee\x9a\x83", "\xf0\x9f\x93\x9a"=>"\xee\x9a\x83", "\xf0\x9f\x93\x9b"=>"[\xe5\x90\x8d\xe6\x9c\xad]", "\xf0\x9f\x93\x9c"=>"\xee\x9c\x8a", "\xf0\x9f\x93\x8b"=>"\xee\x9a\x89",
- "\xf0\x9f\x93\x86"=>"[\xe3\x82\xab\xe3\x83\xac\xe3\x83\xb3\xe3\x83\x80\xe3\x83\xbc]", "\xf0\x9f\x93\x8a"=>"[\xe3\x82\xb0\xe3\x83\xa9\xe3\x83\x95]", "\xf0\x9f\x93\x88"=>"[\xe3\x82\xb0\xe3\x83\xa9\xe3\x83\x95]", "\xf0\x9f\x93\x89"=>"[\xe3\x82\xb0\xe3\x83\xa9\xe3\x83\x95]", "\xf0\x9f\x93\x87"=>"\xee\x9a\x83",
- "\xf0\x9f\x93\x8c"=>"[\xe7\x94\xbb\xe3\x81\xb3\xe3\x82\x87\xe3\x81\x86]", "\xf0\x9f\x93\x92"=>"\xee\x9a\x83", "\xf0\x9f\x93\x8f"=>"[\xe5\xae\x9a\xe8\xa6\x8f]", "\xf0\x9f\x93\x90"=>"[\xe4\xb8\x89\xe8\xa7\x92\xe5\xae\x9a\xe8\xa6\x8f]", "\xf0\x9f\x93\x91"=>"\xee\x9a\x89",
- "\xf0\x9f\x8e\xbd"=>"\xee\x99\x92", "\xe2\x9a\xbe"=>"\xee\x99\x93", "\xe2\x9b\xb3"=>"\xee\x99\x94", "\xf0\x9f\x8e\xbe"=>"\xee\x99\x95", "\xe2\x9a\xbd"=>"\xee\x99\x96",
- "\xf0\x9f\x8e\xbf"=>"\xee\x99\x97", "\xf0\x9f\x8f\x80"=>"\xee\x99\x98", "\xf0\x9f\x8f\x81"=>"\xee\x99\x99", "\xf0\x9f\x8f\x82"=>"\xee\x9c\x92", "\xf0\x9f\x8f\x83"=>"\xee\x9c\xb3",
- "\xf0\x9f\x8f\x84"=>"\xee\x9c\x92", "\xf0\x9f\x8f\x86"=>"[\xe3\x83\x88\xe3\x83\xad\xe3\x83\x95\xe3\x82\xa3\xe3\x83\xbc]", "\xf0\x9f\x8f\x88"=>"[\xe3\x83\x95\xe3\x83\x83\xe3\x83\x88\xe3\x83\x9c\xe3\x83\xbc\xe3\x83\xab]", "\xf0\x9f\x8f\x8a"=>"[\xe6\xb0\xb4\xe6\xb3\xb3]", "\xf0\x9f\x9a\x83"=>"\xee\x99\x9b",
- "\xf0\x9f\x9a\x87"=>"\xee\x99\x9c", "\xe2\x93\x82"=>"\xee\x99\x9c", "\xf0\x9f\x9a\x84"=>"\xee\x99\x9d", "\xf0\x9f\x9a\x85"=>"\xee\x99\x9d", "\xf0\x9f\x9a\x97"=>"\xee\x99\x9e",
- "\xf0\x9f\x9a\x99"=>"\xee\x99\x9f", "\xf0\x9f\x9a\x8c"=>"\xee\x99\xa0", "\xf0\x9f\x9a\x8f"=>"[\xe3\x83\x90\xe3\x82\xb9\xe5\x81\x9c]", "\xf0\x9f\x9a\xa2"=>"\xee\x99\xa1", "\xe2\x9c\x88"=>"\xee\x99\xa2",
- "\xe2\x9b\xb5"=>"\xee\x9a\xa3", "\xf0\x9f\x9a\x89"=>"[\xe9\xa7\x85]", "\xf0\x9f\x9a\x80"=>"[\xe3\x83\xad\xe3\x82\xb1\xe3\x83\x83\xe3\x83\x88]", "\xf0\x9f\x9a\xa4"=>"\xee\x9a\xa3", "\xf0\x9f\x9a\x95"=>"\xee\x99\x9e",
- "\xf0\x9f\x9a\x9a"=>"[\xe3\x83\x88\xe3\x83\xa9\xe3\x83\x83\xe3\x82\xaf]", "\xf0\x9f\x9a\x92"=>"[\xe6\xb6\x88\xe9\x98\xb2\xe8\xbb\x8a]", "\xf0\x9f\x9a\x91"=>"[\xe6\x95\x91\xe6\x80\xa5\xe8\xbb\x8a]", "\xf0\x9f\x9a\x93"=>"[\xe3\x83\x91\xe3\x83\x88\xe3\x82\xab\xe3\x83\xbc]", "\xe2\x9b\xbd"=>"\xee\x99\xab",
- "\xf0\x9f\x85\xbf"=>"\xee\x99\xac", "\xf0\x9f\x9a\xa5"=>"\xee\x99\xad", "\xf0\x9f\x9a\xa7"=>"[\xe5\xb7\xa5\xe4\xba\x8b\xe4\xb8\xad]", "\xf0\x9f\x9a\xa8"=>"[\xe3\x83\x91\xe3\x83\x88\xe3\x82\xab\xe3\x83\xbc]", "\xe2\x99\xa8"=>"\xee\x9b\xb7",
- "\xe2\x9b\xba"=>"[\xe3\x82\xad\xe3\x83\xa3\xe3\x83\xb3\xe3\x83\x97]", "\xf0\x9f\x8e\xa0"=>"\xee\x99\xb9", "\xf0\x9f\x8e\xa1"=>"[\xe8\xa6\xb3\xe8\xa6\xa7\xe8\xbb\x8a]", "\xf0\x9f\x8e\xa2"=>"[\xe3\x82\xb8\xe3\x82\xa7\xe3\x83\x83\xe3\x83\x88\xe3\x82\xb3\xe3\x83\xbc\xe3\x82\xb9\xe3\x82\xbf\xe3\x83\xbc]", "\xf0\x9f\x8e\xa3"=>"\xee\x9d\x91",
- "\xf0\x9f\x8e\xa4"=>"\xee\x99\xb6", "\xf0\x9f\x8e\xa5"=>"\xee\x99\xb7", "\xf0\x9f\x8e\xa6"=>"\xee\x99\xb7", "\xf0\x9f\x8e\xa7"=>"\xee\x99\xba", "\xf0\x9f\x8e\xa8"=>"\xee\x99\xbb",
- "\xf0\x9f\x8e\xa9"=>"\xee\x99\xbc", "\xf0\x9f\x8e\xaa"=>"\xee\x99\xbd", "\xf0\x9f\x8e\xab"=>"\xee\x99\xbe", "\xf0\x9f\x8e\xac"=>"\xee\x9a\xac", "\xf0\x9f\x8e\xad"=>"[\xe6\xbc\x94\xe5\x8a\x87]",
- "\xf0\x9f\x8e\xae"=>"\xee\x9a\x8b", "\xf0\x9f\x80\x84"=>"[\xe9\xba\xbb\xe9\x9b\x80]", "\xf0\x9f\x8e\xaf"=>"[\xe7\x9a\x84\xe4\xb8\xad]", "\xf0\x9f\x8e\xb0"=>"[777]", "\xf0\x9f\x8e\xb1"=>"[\xe3\x83\x93\xe3\x83\xaa\xe3\x83\xa4\xe3\x83\xbc\xe3\x83\x89]",
- "\xf0\x9f\x8e\xb2"=>"[\xe3\x82\xb5\xe3\x82\xa4\xe3\x82\xb3\xe3\x83\xad]", "\xf0\x9f\x8e\xb3"=>"[\xe3\x83\x9c\xe3\x83\xbc\xe3\x83\xaa\xe3\x83\xb3\xe3\x82\xb0]", "\xf0\x9f\x8e\xb4"=>"[\xe8\x8a\xb1\xe6\x9c\xad]", "\xf0\x9f\x83\x8f"=>"[\xe3\x82\xb8\xe3\x83\xa7\xe3\x83\xbc\xe3\x82\xab\xe3\x83\xbc]", "\xf0\x9f\x8e\xb5"=>"\xee\x9b\xb6",
- "\xf0\x9f\x8e\xb6"=>"\xee\x9b\xbf", "\xf0\x9f\x8e\xb7"=>"[\xe3\x82\xb5\xe3\x83\x83\xe3\x82\xaf\xe3\x82\xb9]", "\xf0\x9f\x8e\xb8"=>"[\xe3\x82\xae\xe3\x82\xbf\xe3\x83\xbc]", "\xf0\x9f\x8e\xb9"=>"[\xe3\x83\x94\xe3\x82\xa2\xe3\x83\x8e]", "\xf0\x9f\x8e\xba"=>"[\xe3\x83\x88\xe3\x83\xa9\xe3\x83\xb3\xe3\x83\x9a\xe3\x83\x83\xe3\x83\x88]",
- "\xf0\x9f\x8e\xbb"=>"[\xe3\x83\x90\xe3\x82\xa4\xe3\x82\xaa\xe3\x83\xaa\xe3\x83\xb3]", "\xf0\x9f\x8e\xbc"=>"\xee\x9b\xbf", "\xe3\x80\xbd"=>"[\xe6\xad\x8c\xe8\xa8\x98\xe5\x8f\xb7]", "\xf0\x9f\x93\xb7"=>"\xee\x9a\x81", "\xf0\x9f\x93\xb9"=>"\xee\x99\xb7",
- "\xf0\x9f\x93\xba"=>"\xee\x9a\x8a", "\xf0\x9f\x93\xbb"=>"[\xe3\x83\xa9\xe3\x82\xb8\xe3\x82\xaa]", "\xf0\x9f\x93\xbc"=>"[\xe3\x83\x93\xe3\x83\x87\xe3\x82\xaa]", "\xf0\x9f\x92\x8b"=>"\xee\x9b\xb9", "\xf0\x9f\x92\x8c"=>"\xee\x9c\x97",
- "\xf0\x9f\x92\x8d"=>"\xee\x9c\x9b", "\xf0\x9f\x92\x8e"=>"\xee\x9c\x9b", "\xf0\x9f\x92\x8f"=>"\xee\x9b\xb9", "\xf0\x9f\x92\x90"=>"[\xe8\x8a\xb1\xe6\x9d\x9f]", "\xf0\x9f\x92\x91"=>"\xee\x9b\xad",
- "\xf0\x9f\x92\x92"=>"[\xe7\xb5\x90\xe5\xa9\x9a\xe5\xbc\x8f]", "\xf0\x9f\x94\x9e"=>"[18\xe7\xa6\x81]", "\xc2\xa9"=>"\xee\x9c\xb1", "\xc2\xae"=>"\xee\x9c\xb6", "\xe2\x84\xa2"=>"\xee\x9c\xb2",
- "\xe2\x84\xb9"=>"[\xef\xbd\x89]", "#\xe2\x83\xa3"=>"\xee\x9b\xa0", "1\xe2\x83\xa3"=>"\xee\x9b\xa2", "2\xe2\x83\xa3"=>"\xee\x9b\xa3", "3\xe2\x83\xa3"=>"\xee\x9b\xa4",
- "4\xe2\x83\xa3"=>"\xee\x9b\xa5", "5\xe2\x83\xa3"=>"\xee\x9b\xa6", "6\xe2\x83\xa3"=>"\xee\x9b\xa7", "7\xe2\x83\xa3"=>"\xee\x9b\xa8", "8\xe2\x83\xa3"=>"\xee\x9b\xa9",
- "9\xe2\x83\xa3"=>"\xee\x9b\xaa", "0\xe2\x83\xa3"=>"\xee\x9b\xab", "\xf0\x9f\x94\x9f"=>"[10]", "\xf0\x9f\x93\xb6"=>"[\xe3\x83\x90\xe3\x83\xaa3]", "\xf0\x9f\x93\xb3"=>"[\xe3\x83\x9e\xe3\x83\x8a\xe3\x83\xbc\xe3\x83\xa2\xe3\x83\xbc\xe3\x83\x89]",
- "\xf0\x9f\x93\xb4"=>"[\xe3\x82\xb1\xe3\x83\xbc\xe3\x82\xbf\xe3\x82\xa4OFF]", "\xf0\x9f\x8d\x94"=>"\xee\x99\xb3", "\xf0\x9f\x8d\x99"=>"\xee\x9d\x89", "\xf0\x9f\x8d\xb0"=>"\xee\x9d\x8a", "\xf0\x9f\x8d\x9c"=>"\xee\x9d\x8c",
- "\xf0\x9f\x8d\x9e"=>"\xee\x9d\x8d", "\xf0\x9f\x8d\xb3"=>"[\xe3\x83\x95\xe3\x83\xa9\xe3\x82\xa4\xe3\x83\x91\xe3\x83\xb3]", "\xf0\x9f\x8d\xa6"=>"[\xe3\x82\xbd\xe3\x83\x95\xe3\x83\x88\xe3\x82\xaf\xe3\x83\xaa\xe3\x83\xbc\xe3\x83\xa0]", "\xf0\x9f\x8d\x9f"=>"[\xe3\x83\x9d\xe3\x83\x86\xe3\x83\x88]", "\xf0\x9f\x8d\xa1"=>"[\xe3\x81\xa0\xe3\x82\x93\xe3\x81\x94]",
- "\xf0\x9f\x8d\x98"=>"[\xe3\x81\x9b\xe3\x82\x93\xe3\x81\xb9\xe3\x81\x84]", "\xf0\x9f\x8d\x9a"=>"\xee\x9d\x8c", "\xf0\x9f\x8d\x9d"=>"[\xe3\x83\x91\xe3\x82\xb9\xe3\x82\xbf]", "\xf0\x9f\x8d\x9b"=>"[\xe3\x82\xab\xe3\x83\xac\xe3\x83\xbc]", "\xf0\x9f\x8d\xa2"=>"[\xe3\x81\x8a\xe3\x81\xa7\xe3\x82\x93]",
- "\xf0\x9f\x8d\xa3"=>"[\xe3\x81\x99\xe3\x81\x97]", "\xf0\x9f\x8d\xb1"=>"[\xe5\xbc\x81\xe5\xbd\x93]", "\xf0\x9f\x8d\xb2"=>"[\xe9\x8d\x8b]", "\xf0\x9f\x8d\xa7"=>"[\xe3\x82\xab\xe3\x82\xad\xe6\xb0\xb7]", "\xf0\x9f\x8d\x96"=>"[\xe8\x82\x89]",
- "\xf0\x9f\x8d\xa5"=>"\xee\x99\x83", "\xf0\x9f\x8d\xa0"=>"[\xe3\x82\x84\xe3\x81\x8d\xe3\x81\x84\xe3\x82\x82]", "\xf0\x9f\x8d\x95"=>"[\xe3\x83\x94\xe3\x82\xb6]", "\xf0\x9f\x8d\x97"=>"[\xe3\x83\x81\xe3\x82\xad\xe3\x83\xb3]", "\xf0\x9f\x8d\xa8"=>"[\xe3\x82\xa2\xe3\x82\xa4\xe3\x82\xb9\xe3\x82\xaf\xe3\x83\xaa\xe3\x83\xbc\xe3\x83\xa0]",
- "\xf0\x9f\x8d\xa9"=>"[\xe3\x83\x89\xe3\x83\xbc\xe3\x83\x8a\xe3\x83\x84]", "\xf0\x9f\x8d\xaa"=>"[\xe3\x82\xaf\xe3\x83\x83\xe3\x82\xad\xe3\x83\xbc]", "\xf0\x9f\x8d\xab"=>"[\xe3\x83\x81\xe3\x83\xa7\xe3\x82\xb3]", "\xf0\x9f\x8d\xac"=>"[\xe3\x82\xad\xe3\x83\xa3\xe3\x83\xb3\xe3\x83\x87\xe3\x82\xa3]", "\xf0\x9f\x8d\xad"=>"[\xe3\x82\xad\xe3\x83\xa3\xe3\x83\xb3\xe3\x83\x87\xe3\x82\xa3]",
- "\xf0\x9f\x8d\xae"=>"[\xe3\x83\x97\xe3\x83\xaa\xe3\x83\xb3]", "\xf0\x9f\x8d\xaf"=>"[\xe3\x83\x8f\xe3\x83\x81\xe3\x83\x9f\xe3\x83\x84]", "\xf0\x9f\x8d\xa4"=>"[\xe3\x82\xa8\xe3\x83\x93\xe3\x83\x95\xe3\x83\xa9\xe3\x82\xa4]", "\xf0\x9f\x8d\xb4"=>"\xee\x99\xaf", "\xe2\x98\x95"=>"\xee\x99\xb0",
- "\xf0\x9f\x8d\xb8"=>"\xee\x99\xb1", "\xf0\x9f\x8d\xba"=>"\xee\x99\xb2", "\xf0\x9f\x8d\xb5"=>"\xee\x9c\x9e", "\xf0\x9f\x8d\xb6"=>"\xee\x9d\x8b", "\xf0\x9f\x8d\xb7"=>"\xee\x9d\x96",
- "\xf0\x9f\x8d\xbb"=>"\xee\x99\xb2", "\xf0\x9f\x8d\xb9"=>"\xee\x99\xb1", "\xe2\x86\x97"=>"\xee\x99\xb8", "\xe2\x86\x98"=>"\xee\x9a\x96", "\xe2\x86\x96"=>"\xee\x9a\x97",
- "\xe2\x86\x99"=>"\xee\x9a\xa5", "\xe2\xa4\xb4"=>"\xee\x9b\xb5", "\xe2\xa4\xb5"=>"\xee\x9c\x80", "\xe2\x86\x94"=>"\xee\x9c\xbc", "\xe2\x86\x95"=>"\xee\x9c\xbd",
- "\xe2\xac\x86"=>"[\xe2\x86\x91]", "\xe2\xac\x87"=>"[\xe2\x86\x93]", "\xe2\x9e\xa1"=>"[\xe2\x86\x92]", "\xe2\xac\x85"=>"[\xe2\x86\x90]", "\xe2\x96\xb6"=>"[>]",
- "\xe2\x97\x80"=>"[<]", "\xe2\x8f\xa9"=>"[>>]", "\xe2\x8f\xaa"=>"[<<]", "\xe2\x8f\xab"=>"\xe2\x96\xb2", "\xe2\x8f\xac"=>"\xe2\x96\xbc",
- "\xf0\x9f\x94\xba"=>"\xe2\x96\xb2", "\xf0\x9f\x94\xbb"=>"\xe2\x96\xbc", "\xf0\x9f\x94\xbc"=>"\xe2\x96\xb2", "\xf0\x9f\x94\xbd"=>"\xe2\x96\xbc", "\xe2\xad\x95"=>"\xee\x9a\xa0",
- "\xe2\x9d\x8c"=>"[\xc3\x97]", "\xe2\x9d\x8e"=>"[\xc3\x97]", "\xe2\x9d\x97"=>"\xee\x9c\x82", "\xe2\x81\x89"=>"\xee\x9c\x83", "\xe2\x80\xbc"=>"\xee\x9c\x84",
- "\xe2\x9d\x93"=>"[\xef\xbc\x9f]", "\xe2\x9d\x94"=>"[\xef\xbc\x9f]", "\xe2\x9d\x95"=>"\xee\x9c\x82", "\xe3\x80\xb0"=>"\xee\x9c\x89", "\xe2\x9e\xb0"=>"\xee\x9c\x8a",
- "\xe2\x9e\xbf"=>"\xee\x9b\x9f", "\xe2\x9d\xa4"=>"\xee\x9b\xac", "\xf0\x9f\x92\x93"=>"\xee\x9b\xad", "\xf0\x9f\x92\x94"=>"\xee\x9b\xae", "\xf0\x9f\x92\x95"=>"\xee\x9b\xaf",
- "\xf0\x9f\x92\x96"=>"\xee\x9b\xac", "\xf0\x9f\x92\x97"=>"\xee\x9b\xad", "\xf0\x9f\x92\x98"=>"\xee\x9b\xac", "\xf0\x9f\x92\x99"=>"\xee\x9b\xac", "\xf0\x9f\x92\x9a"=>"\xee\x9b\xac",
- "\xf0\x9f\x92\x9b"=>"\xee\x9b\xac", "\xf0\x9f\x92\x9c"=>"\xee\x9b\xac", "\xf0\x9f\x92\x9d"=>"\xee\x9b\xac", "\xf0\x9f\x92\x9e"=>"\xee\x9b\xad", "\xf0\x9f\x92\x9f"=>"\xee\x9b\xb8",
- "\xe2\x99\xa5"=>"\xee\x9a\x8d", "\xe2\x99\xa0"=>"\xee\x9a\x8e", "\xe2\x99\xa6"=>"\xee\x9a\x8f", "\xe2\x99\xa3"=>"\xee\x9a\x90", "\xf0\x9f\x9a\xac"=>"\xee\x99\xbf",
- "\xf0\x9f\x9a\xad"=>"\xee\x9a\x80", "\xe2\x99\xbf"=>"\xee\x9a\x9b", "\xf0\x9f\x9a\xa9"=>"\xee\x9b\x9e", "\xe2\x9a\xa0"=>"\xee\x9c\xb7", "\xe2\x9b\x94"=>"\xee\x9c\xaf",
- "\xe2\x99\xbb"=>"\xee\x9c\xb5", "\xf0\x9f\x9a\xb2"=>"\xee\x9c\x9d", "\xf0\x9f\x9a\xb6"=>"\xee\x9c\xb3", "\xf0\x9f\x9a\xb9"=>"[\xe2\x99\x82]", "\xf0\x9f\x9a\xba"=>"[\xe2\x99\x80]",
- "\xf0\x9f\x9b\x80"=>"\xee\x9b\xb7", "\xf0\x9f\x9a\xbb"=>"\xee\x99\xae", "\xf0\x9f\x9a\xbd"=>"\xee\x99\xae", "\xf0\x9f\x9a\xbe"=>"\xee\x99\xae", "\xf0\x9f\x9a\xbc"=>"[\xe8\xb5\xa4\xe3\x81\xa1\xe3\x82\x83\xe3\x82\x93]",
- "\xf0\x9f\x9a\xaa"=>"\xee\x9c\x94", "\xf0\x9f\x9a\xab"=>"\xee\x9c\xb8", "\xe2\x9c\x94"=>"[\xe3\x83\x81\xe3\x82\xa7\xe3\x83\x83\xe3\x82\xaf\xe3\x83\x9e\xe3\x83\xbc\xe3\x82\xaf]", "\xf0\x9f\x86\x91"=>"\xee\x9b\x9b", "\xf0\x9f\x86\x92"=>"[COOL]",
- "\xf0\x9f\x86\x93"=>"\xee\x9b\x97", "\xf0\x9f\x86\x94"=>"\xee\x9b\x98", "\xf0\x9f\x86\x95"=>"\xee\x9b\x9d", "\xf0\x9f\x86\x96"=>"\xee\x9c\xaf", "\xf0\x9f\x86\x97"=>"\xee\x9c\x8b",
- "\xf0\x9f\x86\x98"=>"[SOS]", "\xf0\x9f\x86\x99"=>"[UP!]", "\xf0\x9f\x86\x9a"=>"[VS]", "\xf0\x9f\x88\x81"=>"[\xe3\x82\xb3\xe3\x82\xb3]", "\xf0\x9f\x88\x82"=>"[\xe3\x82\xb5\xe3\x83\xbc\xe3\x83\x93\xe3\x82\xb9]",
- "\xf0\x9f\x88\xb2"=>"\xee\x9c\xb8", "\xf0\x9f\x88\xb3"=>"\xee\x9c\xb9", "\xf0\x9f\x88\xb4"=>"\xee\x9c\xba", "\xf0\x9f\x88\xb5"=>"\xee\x9c\xbb", "\xf0\x9f\x88\xb6"=>"[\xe6\x9c\x89]",
- "\xf0\x9f\x88\x9a"=>"[\xe7\x84\xa1]", "\xf0\x9f\x88\xb7"=>"[\xe6\x9c\x88]", "\xf0\x9f\x88\xb8"=>"[\xe7\x94\xb3]", "\xf0\x9f\x88\xb9"=>"[\xe5\x89\xb2]", "\xf0\x9f\x88\xaf"=>"[\xe6\x8c\x87]",
- "\xf0\x9f\x88\xba"=>"[\xe5\x96\xb6]", "\xe3\x8a\x99"=>"\xee\x9c\xb4", "\xe3\x8a\x97"=>"[\xe7\xa5\x9d]", "\xf0\x9f\x89\x90"=>"[\xe5\xbe\x97]", "\xf0\x9f\x89\x91"=>"[\xe5\x8f\xaf]",
- "\xe2\x9e\x95"=>"[\xef\xbc\x8b]", "\xe2\x9e\x96"=>"[\xef\xbc\x8d]", "\xe2\x9c\x96"=>"[\xc3\x97]", "\xe2\x9e\x97"=>"[\xc3\xb7]", "\xf0\x9f\x92\xa0"=>"\xee\x9b\xb8",
- "\xf0\x9f\x92\xa1"=>"\xee\x9b\xbb", "\xf0\x9f\x92\xa2"=>"\xee\x9b\xbc", "\xf0\x9f\x92\xa3"=>"\xee\x9b\xbe", "\xf0\x9f\x92\xa4"=>"\xee\x9c\x81", "\xf0\x9f\x92\xa5"=>"\xee\x9c\x85",
- "\xf0\x9f\x92\xa6"=>"\xee\x9c\x86", "\xf0\x9f\x92\xa7"=>"\xee\x9c\x87", "\xf0\x9f\x92\xa8"=>"\xee\x9c\x88", "\xf0\x9f\x92\xa9"=>"[\xe3\x82\xa6\xe3\x83\xb3\xe3\x83\x81]", "\xf0\x9f\x92\xaa"=>"[\xe5\x8a\x9b\xe3\x81\x93\xe3\x81\xb6]",
- "\xf0\x9f\x92\xab"=>"[\xe3\x82\xaf\xe3\x83\xa9\xe3\x82\xaf\xe3\x83\xa9]", "\xf0\x9f\x92\xac"=>"[\xe3\x83\x95\xe3\x82\xad\xe3\x83\x80\xe3\x82\xb7]", "\xe2\x9c\xa8"=>"\xee\x9b\xba", "\xe2\x9c\xb4"=>"\xee\x9b\xb8", "\xe2\x9c\xb3"=>"\xee\x9b\xb8",
- "\xe2\x9a\xaa"=>"\xee\x9a\x9c", "\xe2\x9a\xab"=>"\xee\x9a\x9c", "\xf0\x9f\x94\xb4"=>"\xee\x9a\x9c", "\xf0\x9f\x94\xb5"=>"\xee\x9a\x9c", "\xf0\x9f\x94\xb2"=>"\xee\x9a\x9c",
- "\xf0\x9f\x94\xb3"=>"\xee\x9a\x9c", "\xe2\xad\x90"=>"[\xe2\x98\x86]", "\xe2\xac\x9c"=>"\xe2\x96\xa0", "\xe2\xac\x9b"=>"\xe2\x96\xa0", "\xe2\x96\xab"=>"\xe2\x96\xa0",
- "\xe2\x96\xaa"=>"\xe2\x96\xa0", "\xe2\x97\xbd"=>"\xe2\x96\xa0", "\xe2\x97\xbe"=>"\xe2\x96\xa0", "\xe2\x97\xbb"=>"\xe2\x96\xa0", "\xe2\x97\xbc"=>"\xe2\x96\xa0",
- "\xf0\x9f\x94\xb6"=>"\xe2\x97\x86", "\xf0\x9f\x94\xb7"=>"\xe2\x97\x86", "\xf0\x9f\x94\xb8"=>"\xe2\x97\x86", "\xf0\x9f\x94\xb9"=>"\xe2\x97\x86", "\xe2\x9d\x87"=>"\xee\x9b\xba",
- "\xf0\x9f\x92\xae"=>"[\xe8\x8a\xb1\xe4\xb8\xb8]", "\xf0\x9f\x92\xaf"=>"[100\xe7\x82\xb9]", "\xe2\x86\xa9"=>"\xee\x9b\x9a", "\xe2\x86\xaa"=>"\xe2\x94\x94\xe2\x86\x92", "\xf0\x9f\x94\x83"=>"\xee\x9c\xb5",
- "\xf0\x9f\x94\x8a"=>"[\xe3\x82\xb9\xe3\x83\x94\xe3\x83\xbc\xe3\x82\xab]", "\xf0\x9f\x94\x8b"=>"[\xe9\x9b\xbb\xe6\xb1\xa0]", "\xf0\x9f\x94\x8c"=>"[\xe3\x82\xb3\xe3\x83\xb3\xe3\x82\xbb\xe3\x83\xb3\xe3\x83\x88]", "\xf0\x9f\x94\x8d"=>"\xee\x9b\x9c", "\xf0\x9f\x94\x8e"=>"\xee\x9b\x9c",
- "\xf0\x9f\x94\x92"=>"\xee\x9b\x99", "\xf0\x9f\x94\x93"=>"\xee\x9b\x99", "\xf0\x9f\x94\x8f"=>"\xee\x9b\x99", "\xf0\x9f\x94\x90"=>"\xee\x9b\x99", "\xf0\x9f\x94\x91"=>"\xee\x9b\x99",
- "\xf0\x9f\x94\x94"=>"\xee\x9c\x93", "\xe2\x98\x91"=>"[\xe3\x83\x81\xe3\x82\xa7\xe3\x83\x83\xe3\x82\xaf\xe3\x83\x9e\xe3\x83\xbc\xe3\x82\xaf]", "\xf0\x9f\x94\x98"=>"[\xe3\x83\xa9\xe3\x82\xb8\xe3\x82\xaa\xe3\x83\x9c\xe3\x82\xbf\xe3\x83\xb3]", "\xf0\x9f\x94\x96"=>"[\xe3\x83\x96\xe3\x83\x83\xe3\x82\xaf\xe3\x83\x9e\xe3\x83\xbc\xe3\x82\xaf]", "\xf0\x9f\x94\x97"=>"[\xe3\x83\xaa\xe3\x83\xb3\xe3\x82\xaf]",
- "\xf0\x9f\x94\x99"=>"[\xe2\x86\x90BACK]", "\xf0\x9f\x94\x9a"=>"\xee\x9a\xb9", "\xf0\x9f\x94\x9b"=>"\xee\x9a\xb8", "\xf0\x9f\x94\x9c"=>"\xee\x9a\xb7", "\xf0\x9f\x94\x9d"=>"[TOP]",
- "\xe2\x9c\x85"=>"[\xe3\x83\x81\xe3\x82\xa7\xe3\x83\x83\xe3\x82\xaf\xe3\x83\x9e\xe3\x83\xbc\xe3\x82\xaf]", "\xe2\x9c\x8a"=>"\xee\x9a\x93", "\xe2\x9c\x8b"=>"\xee\x9a\x95", "\xe2\x9c\x8c"=>"\xee\x9a\x94", "\xf0\x9f\x91\x8a"=>"\xee\x9b\xbd",
- "\xf0\x9f\x91\x8d"=>"\xee\x9c\xa7", "\xe2\x98\x9d"=>"[\xe4\xba\xba\xe5\xb7\xae\xe3\x81\x97\xe6\x8c\x87]", "\xf0\x9f\x91\x86"=>"[\xe2\x86\x91]", "\xf0\x9f\x91\x87"=>"[\xe2\x86\x93]", "\xf0\x9f\x91\x88"=>"[\xe2\x86\x90]",
- "\xf0\x9f\x91\x89"=>"[\xe2\x86\x92]", "\xf0\x9f\x91\x8b"=>"\xee\x9a\x95", "\xf0\x9f\x91\x8f"=>"[\xe6\x8b\x8d\xe6\x89\x8b]", "\xf0\x9f\x91\x8c"=>"\xee\x9c\x8b", "\xf0\x9f\x91\x8e"=>"\xee\x9c\x80",
- "\xf0\x9f\x91\x90"=>"\xee\x9a\x95",
- ),
- 'unified_to_kddi' => array(
- "\xe2\x98\x80"=>"\xee\x92\x88", "\xe2\x98\x81"=>"\xee\x92\x8d", "\xe2\x98\x94"=>"\xee\x92\x8c", "\xe2\x9b\x84"=>"\xee\x92\x85",
- "\xe2\x9a\xa1"=>"\xee\x92\x87", "\xf0\x9f\x8c\x80"=>"\xee\x91\xa9", "\xf0\x9f\x8c\x81"=>"\xee\x96\x98", "\xf0\x9f\x8c\x82"=>"\xee\xab\xa8", "\xf0\x9f\x8c\x83"=>"\xee\xab\xb1",
- "\xf0\x9f\x8c\x84"=>"\xee\xab\xb4", "\xf0\x9f\x8c\x85"=>"\xee\xab\xb4", "\xf0\x9f\x8c\x86"=>"\xee\x97\x9a", "\xf0\x9f\x8c\x87"=>"\xee\x97\x9a", "\xf0\x9f\x8c\x88"=>"\xee\xab\xb2",
- "\xe2\x9d\x84"=>"\xee\x92\x8a", "\xe2\x9b\x85"=>"\xee\x92\x8e", "\xf0\x9f\x8c\x89"=>"\xee\x92\xbf", "\xf0\x9f\x8c\x8a"=>"\xee\xad\xbc", "\xf0\x9f\x8c\x8b"=>"\xee\xad\x93",
- "\xf0\x9f\x8c\x8c"=>"\xee\xad\x9f", "\xf0\x9f\x8c\x8f"=>"\xee\x96\xb3", "\xf0\x9f\x8c\x91"=>"\xee\x96\xa8", "\xf0\x9f\x8c\x94"=>"\xee\x96\xa9", "\xf0\x9f\x8c\x93"=>"\xee\x96\xaa",
- "\xf0\x9f\x8c\x99"=>"\xee\x92\x86", "\xf0\x9f\x8c\x95"=>"\xe2\x97\x8b", "\xf0\x9f\x8c\x9b"=>"\xee\x92\x89", "\xf0\x9f\x8c\x9f"=>"\xee\x92\x8b", "\xf0\x9f\x8c\xa0"=>"\xee\x91\xa8",
- "\xf0\x9f\x95\x90"=>"\xee\x96\x94", "\xf0\x9f\x95\x91"=>"\xee\x96\x94", "\xf0\x9f\x95\x92"=>"\xee\x96\x94", "\xf0\x9f\x95\x93"=>"\xee\x96\x94", "\xf0\x9f\x95\x94"=>"\xee\x96\x94",
- "\xf0\x9f\x95\x95"=>"\xee\x96\x94", "\xf0\x9f\x95\x96"=>"\xee\x96\x94", "\xf0\x9f\x95\x97"=>"\xee\x96\x94", "\xf0\x9f\x95\x98"=>"\xee\x96\x94", "\xf0\x9f\x95\x99"=>"\xee\x96\x94",
- "\xf0\x9f\x95\x9a"=>"\xee\x96\x94", "\xf0\x9f\x95\x9b"=>"\xee\x96\x94", "\xe2\x8c\x9a"=>"\xee\x95\xba", "\xe2\x8c\x9b"=>"\xee\x95\xbb", "\xe2\x8f\xb0"=>"\xee\x96\x94",
- "\xe2\x8f\xb3"=>"\xee\x91\xbc", "\xe2\x99\x88"=>"\xee\x92\x8f", "\xe2\x99\x89"=>"\xee\x92\x90", "\xe2\x99\x8a"=>"\xee\x92\x91", "\xe2\x99\x8b"=>"\xee\x92\x92",
- "\xe2\x99\x8c"=>"\xee\x92\x93", "\xe2\x99\x8d"=>"\xee\x92\x94", "\xe2\x99\x8e"=>"\xee\x92\x95", "\xe2\x99\x8f"=>"\xee\x92\x96", "\xe2\x99\x90"=>"\xee\x92\x97",
- "\xe2\x99\x91"=>"\xee\x92\x98", "\xe2\x99\x92"=>"\xee\x92\x99", "\xe2\x99\x93"=>"\xee\x92\x9a", "\xe2\x9b\x8e"=>"\xee\x92\x9b", "\xf0\x9f\x8d\x80"=>"\xee\x94\x93",
- "\xf0\x9f\x8c\xb7"=>"\xee\x93\xa4", "\xf0\x9f\x8c\xb1"=>"\xee\xad\xbd", "\xf0\x9f\x8d\x81"=>"\xee\x93\x8e", "\xf0\x9f\x8c\xb8"=>"\xee\x93\x8a", "\xf0\x9f\x8c\xb9"=>"\xee\x96\xba",
- "\xf0\x9f\x8d\x82"=>"\xee\x97\x8d", "\xf0\x9f\x8d\x83"=>"\xee\x97\x8d", "\xf0\x9f\x8c\xba"=>"\xee\xaa\x94", "\xf0\x9f\x8c\xbb"=>"\xee\x93\xa3", "\xf0\x9f\x8c\xb4"=>"\xee\x93\xa2",
- "\xf0\x9f\x8c\xb5"=>"\xee\xaa\x96", "\xf0\x9f\x8c\xbe"=>"[\xe7\xa8\xb2\xe7\xa9\x82]", "\xf0\x9f\x8c\xbd"=>"\xee\xac\xb6", "\xf0\x9f\x8d\x84"=>"\xee\xac\xb7", "\xf0\x9f\x8c\xb0"=>"\xee\xac\xb8",
- "\xf0\x9f\x8c\xbc"=>"\xee\xad\x89", "\xf0\x9f\x8c\xbf"=>"\xee\xae\x82", "\xf0\x9f\x8d\x92"=>"\xee\x93\x92", "\xf0\x9f\x8d\x8c"=>"\xee\xac\xb5", "\xf0\x9f\x8d\x8e"=>"\xee\xaa\xb9",
- "\xf0\x9f\x8d\x8a"=>"\xee\xaa\xba", "\xf0\x9f\x8d\x93"=>"\xee\x93\x94", "\xf0\x9f\x8d\x89"=>"\xee\x93\x8d", "\xf0\x9f\x8d\x85"=>"\xee\xaa\xbb", "\xf0\x9f\x8d\x86"=>"\xee\xaa\xbc",
- "\xf0\x9f\x8d\x88"=>"\xee\xac\xb2", "\xf0\x9f\x8d\x8d"=>"\xee\xac\xb3", "\xf0\x9f\x8d\x87"=>"\xee\xac\xb4", "\xf0\x9f\x8d\x91"=>"\xee\xac\xb9", "\xf0\x9f\x8d\x8f"=>"\xee\xad\x9a",
- "\xf0\x9f\x91\x80"=>"\xee\x96\xa4", "\xf0\x9f\x91\x82"=>"\xee\x96\xa5", "\xf0\x9f\x91\x83"=>"\xee\xab\x90", "\xf0\x9f\x91\x84"=>"\xee\xab\x91", "\xf0\x9f\x91\x85"=>"\xee\xad\x87",
- "\xf0\x9f\x92\x84"=>"\xee\x94\x89", "\xf0\x9f\x92\x85"=>"\xee\xaa\xa0", "\xf0\x9f\x92\x86"=>"\xee\x94\x8b", "\xf0\x9f\x92\x87"=>"\xee\xaa\xa1", "\xf0\x9f\x92\x88"=>"\xee\xaa\xa2",
- "\xf0\x9f\x91\xa4"=>"\xe3\x80\x93", "\xf0\x9f\x91\xa6"=>"\xee\x93\xbc", "\xf0\x9f\x91\xa7"=>"\xee\x93\xba", "\xf0\x9f\x91\xa8"=>"\xee\x93\xbc", "\xf0\x9f\x91\xa9"=>"\xee\x93\xba",
- "\xf0\x9f\x91\xaa"=>"\xee\x94\x81", "\xf0\x9f\x91\xab"=>"[\xe3\x82\xab\xe3\x83\x83\xe3\x83\x97\xe3\x83\xab]", "\xf0\x9f\x91\xae"=>"\xee\x97\x9d", "\xf0\x9f\x91\xaf"=>"\xee\xab\x9b", "\xf0\x9f\x91\xb0"=>"\xee\xab\xa9",
- "\xf0\x9f\x91\xb1"=>"\xee\xac\x93", "\xf0\x9f\x91\xb2"=>"\xee\xac\x94", "\xf0\x9f\x91\xb3"=>"\xee\xac\x95", "\xf0\x9f\x91\xb4"=>"\xee\xac\x96", "\xf0\x9f\x91\xb5"=>"\xee\xac\x97",
- "\xf0\x9f\x91\xb6"=>"\xee\xac\x98", "\xf0\x9f\x91\xb7"=>"\xee\xac\x99", "\xf0\x9f\x91\xb8"=>"\xee\xac\x9a", "\xf0\x9f\x91\xb9"=>"\xee\xad\x84", "\xf0\x9f\x91\xba"=>"\xee\xad\x85",
- "\xf0\x9f\x91\xbb"=>"\xee\x93\x8b", "\xf0\x9f\x91\xbc"=>"\xee\x96\xbf", "\xf0\x9f\x91\xbd"=>"\xee\x94\x8e", "\xf0\x9f\x91\xbe"=>"\xee\x93\xac", "\xf0\x9f\x91\xbf"=>"\xee\x93\xaf",
- "\xf0\x9f\x92\x80"=>"\xee\x93\xb8", "\xf0\x9f\x92\x81"=>"[\xe6\xa1\x88\xe5\x86\x85]", "\xf0\x9f\x92\x82"=>"[\xe8\xa1\x9b\xe5\x85\xb5]", "\xf0\x9f\x92\x83"=>"\xee\xac\x9c", "\xf0\x9f\x90\x8c"=>"\xee\xad\xbe",
- "\xf0\x9f\x90\x8d"=>"\xee\xac\xa2", "\xf0\x9f\x90\x8e"=>"\xee\x93\x98", "\xf0\x9f\x90\x94"=>"\xee\xac\xa3", "\xf0\x9f\x90\x97"=>"\xee\xac\xa4", "\xf0\x9f\x90\xab"=>"\xee\xac\xa5",
- "\xf0\x9f\x90\x98"=>"\xee\xac\x9f", "\xf0\x9f\x90\xa8"=>"\xee\xac\xa0", "\xf0\x9f\x90\x92"=>"\xee\x93\x99", "\xf0\x9f\x90\x91"=>"\xee\x92\x8f", "\xf0\x9f\x90\x99"=>"\xee\x97\x87",
- "\xf0\x9f\x90\x9a"=>"\xee\xab\xac", "\xf0\x9f\x90\x9b"=>"\xee\xac\x9e", "\xf0\x9f\x90\x9c"=>"\xee\x93\x9d", "\xf0\x9f\x90\x9d"=>"\xee\xad\x97", "\xf0\x9f\x90\x9e"=>"\xee\xad\x98",
- "\xf0\x9f\x90\xa0"=>"\xee\xac\x9d", "\xf0\x9f\x90\xa1"=>"\xee\x93\x93", "\xf0\x9f\x90\xa2"=>"\xee\x97\x94", "\xf0\x9f\x90\xa4"=>"\xee\x93\xa0", "\xf0\x9f\x90\xa5"=>"\xee\xad\xb6",
- "\xf0\x9f\x90\xa6"=>"\xee\x93\xa0", "\xf0\x9f\x90\xa3"=>"\xee\x97\x9b", "\xf0\x9f\x90\xa7"=>"\xee\x93\x9c", "\xf0\x9f\x90\xa9"=>"\xee\x93\x9f", "\xf0\x9f\x90\x9f"=>"\xee\x92\x9a",
- "\xf0\x9f\x90\xac"=>"\xee\xac\x9b", "\xf0\x9f\x90\xad"=>"\xee\x97\x82", "\xf0\x9f\x90\xaf"=>"\xee\x97\x80", "\xf0\x9f\x90\xb1"=>"\xee\x93\x9b", "\xf0\x9f\x90\xb3"=>"\xee\x91\xb0",
- "\xf0\x9f\x90\xb4"=>"\xee\x93\x98", "\xf0\x9f\x90\xb5"=>"\xee\x93\x99", "\xf0\x9f\x90\xb6"=>"\xee\x93\xa1", "\xf0\x9f\x90\xb7"=>"\xee\x93\x9e", "\xf0\x9f\x90\xbb"=>"\xee\x97\x81",
- "\xf0\x9f\x90\xb9"=>"[\xe3\x83\x8f\xe3\x83\xa0\xe3\x82\xb9\xe3\x82\xbf\xe3\x83\xbc]", "\xf0\x9f\x90\xba"=>"\xee\x93\xa1", "\xf0\x9f\x90\xae"=>"\xee\xac\xa1", "\xf0\x9f\x90\xb0"=>"\xee\x93\x97", "\xf0\x9f\x90\xb8"=>"\xee\x93\x9a",
- "\xf0\x9f\x90\xbe"=>"\xee\x93\xae", "\xf0\x9f\x90\xb2"=>"\xee\xac\xbf", "\xf0\x9f\x90\xbc"=>"\xee\xad\x86", "\xf0\x9f\x90\xbd"=>"\xee\xad\x88", "\xf0\x9f\x98\xa0"=>"\xee\x91\xb2",
- "\xf0\x9f\x98\xa9"=>"\xee\xad\xa7", "\xf0\x9f\x98\xb2"=>"\xee\xab\x8a", "\xf0\x9f\x98\x9e"=>"\xee\xab\x80", "\xf0\x9f\x98\xb5"=>"\xee\x96\xae", "\xf0\x9f\x98\xb0"=>"\xee\xab\x8b",
- "\xf0\x9f\x98\x92"=>"\xee\xab\x89", "\xf0\x9f\x98\x8d"=>"\xee\x97\x84", "\xf0\x9f\x98\xa4"=>"\xee\xab\x81", "\xf0\x9f\x98\x9c"=>"\xee\x93\xa7", "\xf0\x9f\x98\x9d"=>"\xee\x93\xa7",
- "\xf0\x9f\x98\x8b"=>"\xee\xab\x8d", "\xf0\x9f\x98\x98"=>"\xee\xab\x8f", "\xf0\x9f\x98\x9a"=>"\xee\xab\x8e", "\xf0\x9f\x98\xb7"=>"\xee\xab\x87", "\xf0\x9f\x98\xb3"=>"\xee\xab\x88",
- "\xf0\x9f\x98\x83"=>"\xee\x91\xb1", "\xf0\x9f\x98\x85"=>"\xee\x91\xb1\xee\x96\xb1", "\xf0\x9f\x98\x86"=>"\xee\xab\x85", "\xf0\x9f\x98\x81"=>"\xee\xae\x80", "\xf0\x9f\x98\x82"=>"\xee\xad\xa4",
- "\xf0\x9f\x98\x8a"=>"\xee\xab\x8d", "\xe2\x98\xba"=>"\xee\x93\xbb", "\xf0\x9f\x98\x84"=>"\xee\x91\xb1", "\xf0\x9f\x98\xa2"=>"\xee\xad\xa9", "\xf0\x9f\x98\xad"=>"\xee\x91\xb3",
- "\xf0\x9f\x98\xa8"=>"\xee\xab\x86", "\xf0\x9f\x98\xa3"=>"\xee\xab\x82", "\xf0\x9f\x98\xa1"=>"\xee\xad\x9d", "\xf0\x9f\x98\x8c"=>"\xee\xab\x85", "\xf0\x9f\x98\x96"=>"\xee\xab\x83",
- "\xf0\x9f\x98\x94"=>"\xee\xab\x80", "\xf0\x9f\x98\xb1"=>"\xee\x97\x85", "\xf0\x9f\x98\xaa"=>"\xee\xab\x84", "\xf0\x9f\x98\x8f"=>"\xee\xaa\xbf", "\xf0\x9f\x98\x93"=>"\xee\x97\x86",
- "\xf0\x9f\x98\xa5"=>"\xee\x97\x86", "\xf0\x9f\x98\xab"=>"\xee\x91\xb4", "\xf0\x9f\x98\x89"=>"\xee\x97\x83", "\xf0\x9f\x98\xba"=>"\xee\xad\xa1", "\xf0\x9f\x98\xb8"=>"\xee\xad\xbf",
- "\xf0\x9f\x98\xb9"=>"\xee\xad\xa3", "\xf0\x9f\x98\xbd"=>"\xee\xad\xa0", "\xf0\x9f\x98\xbb"=>"\xee\xad\xa5", "\xf0\x9f\x98\xbf"=>"\xee\xad\xa8", "\xf0\x9f\x98\xbe"=>"\xee\xad\x9e",
- "\xf0\x9f\x98\xbc"=>"\xee\xad\xaa", "\xf0\x9f\x99\x80"=>"\xee\xad\xa6", "\xf0\x9f\x99\x85"=>"\xee\xab\x97", "\xf0\x9f\x99\x86"=>"\xee\xab\x98", "\xf0\x9f\x99\x87"=>"\xee\xab\x99",
- "\xf0\x9f\x99\x88"=>"\xee\xad\x90", "\xf0\x9f\x99\x8a"=>"\xee\xad\x91", "\xf0\x9f\x99\x89"=>"\xee\xad\x92", "\xf0\x9f\x99\x8b"=>"\xee\xae\x85", "\xf0\x9f\x99\x8c"=>"\xee\xae\x86",
- "\xf0\x9f\x99\x8d"=>"\xee\xae\x87", "\xf0\x9f\x99\x8e"=>"\xee\xae\x88", "\xf0\x9f\x99\x8f"=>"\xee\xab\x92", "\xf0\x9f\x8f\xa0"=>"\xee\x92\xab", "\xf0\x9f\x8f\xa1"=>"\xee\xac\x89",
- "\xf0\x9f\x8f\xa2"=>"\xee\x92\xad", "\xf0\x9f\x8f\xa3"=>"\xee\x97\x9e", "\xf0\x9f\x8f\xa5"=>"\xee\x97\x9f", "\xf0\x9f\x8f\xa6"=>"\xee\x92\xaa", "\xf0\x9f\x8f\xa7"=>"\xee\x92\xa3",
- "\xf0\x9f\x8f\xa8"=>"\xee\xaa\x81", "\xf0\x9f\x8f\xa9"=>"\xee\xab\xb3", "\xf0\x9f\x8f\xaa"=>"\xee\x92\xa4", "\xf0\x9f\x8f\xab"=>"\xee\xaa\x80", "\xe2\x9b\xaa"=>"\xee\x96\xbb",
- "\xe2\x9b\xb2"=>"\xee\x97\x8f", "\xf0\x9f\x8f\xac"=>"\xee\xab\xb6", "\xf0\x9f\x8f\xaf"=>"\xee\xab\xb7", "\xf0\x9f\x8f\xb0"=>"\xee\xab\xb8", "\xf0\x9f\x8f\xad"=>"\xee\xab\xb9",
- "\xe2\x9a\x93"=>"\xee\x92\xa9", "\xf0\x9f\x8f\xae"=>"\xee\x92\xbd", "\xf0\x9f\x97\xbb"=>"\xee\x96\xbd", "\xf0\x9f\x97\xbc"=>"\xee\x93\x80", "\xf0\x9f\x97\xbd"=>"[\xe8\x87\xaa\xe7\x94\xb1\xe3\x81\xae\xe5\xa5\xb3\xe7\xa5\x9e]",
- "\xf0\x9f\x97\xbe"=>"\xee\x95\xb2", "\xf0\x9f\x97\xbf"=>"\xee\xad\xac", "\xf0\x9f\x91\x9e"=>"\xee\x96\xb7", "\xf0\x9f\x91\x9f"=>"\xee\xac\xab", "\xf0\x9f\x91\xa0"=>"\xee\x94\x9a",
- "\xf0\x9f\x91\xa1"=>"\xee\x94\x9a", "\xf0\x9f\x91\xa2"=>"\xee\xaa\x9f", "\xf0\x9f\x91\xa3"=>"\xee\xac\xaa", "\xf0\x9f\x91\x93"=>"\xee\x93\xbe", "\xf0\x9f\x91\x95"=>"\xee\x96\xb6",
- "\xf0\x9f\x91\x96"=>"\xee\xad\xb7", "\xf0\x9f\x91\x91"=>"\xee\x97\x89", "\xf0\x9f\x91\x94"=>"\xee\xaa\x93", "\xf0\x9f\x91\x92"=>"\xee\xaa\x9e", "\xf0\x9f\x91\x97"=>"\xee\xad\xab",
- "\xf0\x9f\x91\x98"=>"\xee\xaa\xa3", "\xf0\x9f\x91\x99"=>"\xee\xaa\xa4", "\xf0\x9f\x91\x9a"=>"\xee\x94\x8d", "\xf0\x9f\x91\x9b"=>"\xee\x94\x84", "\xf0\x9f\x91\x9c"=>"\xee\x92\x9c",
- "\xf0\x9f\x91\x9d"=>"[\xe3\x81\xb5\xe3\x81\x8f\xe3\x82\x8d]", "\xf0\x9f\x92\xb0"=>"\xee\x93\x87", "\xf0\x9f\x92\xb1"=>"[$\xef\xbf\xa5]", "\xf0\x9f\x92\xb9"=>"\xee\x97\x9c", "\xf0\x9f\x92\xb2"=>"\xee\x95\xb9",
- "\xf0\x9f\x92\xb3"=>"\xee\x95\xbc", "\xf0\x9f\x92\xb4"=>"\xee\x95\xbd", "\xf0\x9f\x92\xb5"=>"\xee\x96\x85", "\xf0\x9f\x92\xb8"=>"\xee\xad\x9b", "\xf0\x9f\x87\xa8\xf0\x9f\x87\xb3"=>"\xee\xac\x91",
- "\xf0\x9f\x87\xa9\xf0\x9f\x87\xaa"=>"\xee\xac\x8e", "\xf0\x9f\x87\xaa\xf0\x9f\x87\xb8"=>"\xee\x97\x95", "\xf0\x9f\x87\xab\xf0\x9f\x87\xb7"=>"\xee\xab\xba", "\xf0\x9f\x87\xac\xf0\x9f\x87\xa7"=>"\xee\xac\x90", "\xf0\x9f\x87\xae\xf0\x9f\x87\xb9"=>"\xee\xac\x8f",
- "\xf0\x9f\x87\xaf\xf0\x9f\x87\xb5"=>"\xee\x93\x8c", "\xf0\x9f\x87\xb0\xf0\x9f\x87\xb7"=>"\xee\xac\x92", "\xf0\x9f\x87\xb7\xf0\x9f\x87\xba"=>"\xee\x97\x96", "\xf0\x9f\x87\xba\xf0\x9f\x87\xb8"=>"\xee\x95\xb3", "\xf0\x9f\x94\xa5"=>"\xee\x91\xbb",
- "\xf0\x9f\x94\xa6"=>"\xee\x96\x83", "\xf0\x9f\x94\xa7"=>"\xee\x96\x87", "\xf0\x9f\x94\xa8"=>"\xee\x97\x8b", "\xf0\x9f\x94\xa9"=>"\xee\x96\x81", "\xf0\x9f\x94\xaa"=>"\xee\x95\xbf",
- "\xf0\x9f\x94\xab"=>"\xee\x94\x8a", "\xf0\x9f\x94\xae"=>"\xee\xaa\x8f", "\xf0\x9f\x94\xaf"=>"\xee\xaa\x8f", "\xf0\x9f\x94\xb0"=>"\xee\x92\x80", "\xf0\x9f\x94\xb1"=>"\xee\x97\x89",
- "\xf0\x9f\x92\x89"=>"\xee\x94\x90", "\xf0\x9f\x92\x8a"=>"\xee\xaa\x9a", "\xf0\x9f\x85\xb0"=>"\xee\xac\xa6", "\xf0\x9f\x85\xb1"=>"\xee\xac\xa7", "\xf0\x9f\x86\x8e"=>"\xee\xac\xa9",
- "\xf0\x9f\x85\xbe"=>"\xee\xac\xa8", "\xf0\x9f\x8e\x80"=>"\xee\x96\x9f", "\xf0\x9f\x8e\x81"=>"\xee\x93\x8f", "\xf0\x9f\x8e\x82"=>"\xee\x96\xa0", "\xf0\x9f\x8e\x84"=>"\xee\x93\x89",
- "\xf0\x9f\x8e\x85"=>"\xee\xab\xb0", "\xf0\x9f\x8e\x8c"=>"\xee\x97\x99", "\xf0\x9f\x8e\x86"=>"\xee\x97\x8c", "\xf0\x9f\x8e\x88"=>"\xee\xaa\x9b", "\xf0\x9f\x8e\x89"=>"\xee\xaa\x9c",
- "\xf0\x9f\x8e\x8d"=>"\xee\xab\xa3", "\xf0\x9f\x8e\x8e"=>"\xee\xab\xa4", "\xf0\x9f\x8e\x93"=>"\xee\xab\xa5", "\xf0\x9f\x8e\x92"=>"\xee\xab\xa6", "\xf0\x9f\x8e\x8f"=>"\xee\xab\xa7",
- "\xf0\x9f\x8e\x87"=>"\xee\xab\xab", "\xf0\x9f\x8e\x90"=>"\xee\xab\xad", "\xf0\x9f\x8e\x83"=>"\xee\xab\xae", "\xf0\x9f\x8e\x8a"=>"\xee\x91\xaf", "\xf0\x9f\x8e\x8b"=>"\xee\xac\xbd",
- "\xf0\x9f\x8e\x91"=>"\xee\xab\xaf", "\xf0\x9f\x93\x9f"=>"\xee\x96\x9b", "\xe2\x98\x8e"=>"\xee\x96\x96", "\xf0\x9f\x93\x9e"=>"\xee\x94\x9e", "\xf0\x9f\x93\xb1"=>"\xee\x96\x88",
- "\xf0\x9f\x93\xb2"=>"\xee\xac\x88", "\xf0\x9f\x93\x9d"=>"\xee\xaa\x92", "\xf0\x9f\x93\xa0"=>"\xee\x94\xa0", "\xe2\x9c\x89"=>"\xee\x94\xa1", "\xf0\x9f\x93\xa8"=>"\xee\x96\x91",
- "\xf0\x9f\x93\xa9"=>"\xee\xad\xa2", "\xf0\x9f\x93\xaa"=>"\xee\x94\x9b", "\xf0\x9f\x93\xab"=>"\xee\xac\x8a", "\xf0\x9f\x93\xae"=>"\xee\x94\x9b", "\xf0\x9f\x93\xb0"=>"\xee\x96\x8b",
- "\xf0\x9f\x93\xa2"=>"\xee\x94\x91", "\xf0\x9f\x93\xa3"=>"\xee\x94\x91", "\xf0\x9f\x93\xa1"=>"\xee\x92\xa8", "\xf0\x9f\x93\xa4"=>"\xee\x96\x92", "\xf0\x9f\x93\xa5"=>"\xee\x96\x93",
- "\xf0\x9f\x93\xa6"=>"\xee\x94\x9f", "\xf0\x9f\x93\xa7"=>"\xee\xad\xb1", "\xf0\x9f\x94\xa0"=>"\xee\xab\xbd", "\xf0\x9f\x94\xa1"=>"\xee\xab\xbe", "\xf0\x9f\x94\xa2"=>"\xee\xab\xbf",
- "\xf0\x9f\x94\xa3"=>"\xee\xac\x80", "\xf0\x9f\x94\xa4"=>"\xee\xad\x95", "\xe2\x9c\x92"=>"\xee\xac\x83", "\xf0\x9f\x92\xba"=>"[\xe3\x81\x84\xe3\x81\x99]", "\xf0\x9f\x92\xbb"=>"\xee\x96\xb8",
- "\xe2\x9c\x8f"=>"\xee\x92\xa1", "\xf0\x9f\x93\x8e"=>"\xee\x92\xa0", "\xf0\x9f\x92\xbc"=>"\xee\x97\x8e", "\xf0\x9f\x92\xbd"=>"\xee\x96\x82", "\xf0\x9f\x92\xbe"=>"\xee\x95\xa2",
- "\xf0\x9f\x92\xbf"=>"\xee\x94\x8c", "\xf0\x9f\x93\x80"=>"\xee\x94\x8c", "\xe2\x9c\x82"=>"\xee\x94\x96", "\xf0\x9f\x93\x8d"=>"\xee\x95\xa0", "\xf0\x9f\x93\x83"=>"\xee\x95\xa1",
- "\xf0\x9f\x93\x84"=>"\xee\x95\xa9", "\xf0\x9f\x93\x85"=>"\xee\x95\xa3", "\xf0\x9f\x93\x81"=>"\xee\x96\x8f", "\xf0\x9f\x93\x82"=>"\xee\x96\x90", "\xf0\x9f\x93\x93"=>"\xee\x95\xab",
- "\xf0\x9f\x93\x96"=>"\xee\x92\x9f", "\xf0\x9f\x93\x94"=>"\xee\x92\x9d", "\xf0\x9f\x93\x95"=>"\xee\x95\xa8", "\xf0\x9f\x93\x97"=>"\xee\x95\xa5", "\xf0\x9f\x93\x98"=>"\xee\x95\xa6",
- "\xf0\x9f\x93\x99"=>"\xee\x95\xa7", "\xf0\x9f\x93\x9a"=>"\xee\x95\xaf", "\xf0\x9f\x93\x9b"=>"\xee\x94\x9d", "\xf0\x9f\x93\x9c"=>"\xee\x95\x9f", "\xf0\x9f\x93\x8b"=>"\xee\x95\xa4",
- "\xf0\x9f\x93\x86"=>"\xee\x95\xaa", "\xf0\x9f\x93\x8a"=>"\xee\x95\xb4", "\xf0\x9f\x93\x88"=>"\xee\x95\xb5", "\xf0\x9f\x93\x89"=>"\xee\x95\xb6", "\xf0\x9f\x93\x87"=>"\xee\x95\xac",
- "\xf0\x9f\x93\x8c"=>"\xee\x95\xad", "\xf0\x9f\x93\x92"=>"\xee\x95\xae", "\xf0\x9f\x93\x8f"=>"\xee\x95\xb0", "\xf0\x9f\x93\x90"=>"\xee\x92\xa2", "\xf0\x9f\x93\x91"=>"\xee\xac\x8b",
- "\xf0\x9f\x8e\xbd"=>"\xe3\x80\x93", "\xe2\x9a\xbe"=>"\xee\x92\xba", "\xe2\x9b\xb3"=>"\xee\x96\x99", "\xf0\x9f\x8e\xbe"=>"\xee\x92\xb7", "\xe2\x9a\xbd"=>"\xee\x92\xb6",
- "\xf0\x9f\x8e\xbf"=>"\xee\xaa\xac", "\xf0\x9f\x8f\x80"=>"\xee\x96\x9a", "\xf0\x9f\x8f\x81"=>"\xee\x92\xb9", "\xf0\x9f\x8f\x82"=>"\xee\x92\xb8", "\xf0\x9f\x8f\x83"=>"\xee\x91\xab",
- "\xf0\x9f\x8f\x84"=>"\xee\xad\x81", "\xf0\x9f\x8f\x86"=>"\xee\x97\x93", "\xf0\x9f\x8f\x88"=>"\xee\x92\xbb", "\xf0\x9f\x8f\x8a"=>"\xee\xab\x9e", "\xf0\x9f\x9a\x83"=>"\xee\x92\xb5",
- "\xf0\x9f\x9a\x87"=>"\xee\x96\xbc", "\xe2\x93\x82"=>"\xee\x96\xbc", "\xf0\x9f\x9a\x84"=>"\xee\x92\xb0", "\xf0\x9f\x9a\x85"=>"\xee\x92\xb0", "\xf0\x9f\x9a\x97"=>"\xee\x92\xb1",
- "\xf0\x9f\x9a\x99"=>"\xee\x92\xb1", "\xf0\x9f\x9a\x8c"=>"\xee\x92\xaf", "\xf0\x9f\x9a\x8f"=>"\xee\x92\xa7", "\xf0\x9f\x9a\xa2"=>"\xee\xaa\x82", "\xe2\x9c\x88"=>"\xee\x92\xb3",
- "\xe2\x9b\xb5"=>"\xee\x92\xb4", "\xf0\x9f\x9a\x89"=>"\xee\xad\xad", "\xf0\x9f\x9a\x80"=>"\xee\x97\x88", "\xf0\x9f\x9a\xa4"=>"\xee\x92\xb4", "\xf0\x9f\x9a\x95"=>"\xee\x92\xb1",
- "\xf0\x9f\x9a\x9a"=>"\xee\x92\xb2", "\xf0\x9f\x9a\x92"=>"\xee\xab\x9f", "\xf0\x9f\x9a\x91"=>"\xee\xab\xa0", "\xf0\x9f\x9a\x93"=>"\xee\xab\xa1", "\xe2\x9b\xbd"=>"\xee\x95\xb1",
- "\xf0\x9f\x85\xbf"=>"\xee\x92\xa6", "\xf0\x9f\x9a\xa5"=>"\xee\x91\xaa", "\xf0\x9f\x9a\xa7"=>"\xee\x97\x97", "\xf0\x9f\x9a\xa8"=>"\xee\xad\xb3", "\xe2\x99\xa8"=>"\xee\x92\xbc",
- "\xe2\x9b\xba"=>"\xee\x97\x90", "\xf0\x9f\x8e\xa0"=>"\xe3\x80\x93", "\xf0\x9f\x8e\xa1"=>"\xee\x91\xad", "\xf0\x9f\x8e\xa2"=>"\xee\xab\xa2", "\xf0\x9f\x8e\xa3"=>"\xee\xad\x82",
- "\xf0\x9f\x8e\xa4"=>"\xee\x94\x83", "\xf0\x9f\x8e\xa5"=>"\xee\x94\x97", "\xf0\x9f\x8e\xa6"=>"\xee\x94\x97", "\xf0\x9f\x8e\xa7"=>"\xee\x94\x88", "\xf0\x9f\x8e\xa8"=>"\xee\x96\x9c",
- "\xf0\x9f\x8e\xa9"=>"\xee\xab\xb5", "\xf0\x9f\x8e\xaa"=>"\xee\x96\x9e", "\xf0\x9f\x8e\xab"=>"\xee\x92\x9e", "\xf0\x9f\x8e\xac"=>"\xee\x92\xbe", "\xf0\x9f\x8e\xad"=>"\xee\x96\x9d",
- "\xf0\x9f\x8e\xae"=>"\xee\x93\x86", "\xf0\x9f\x80\x84"=>"\xee\x97\x91", "\xf0\x9f\x8e\xaf"=>"\xee\x93\x85", "\xf0\x9f\x8e\xb0"=>"\xee\x91\xae", "\xf0\x9f\x8e\xb1"=>"\xee\xab\x9d",
- "\xf0\x9f\x8e\xb2"=>"\xee\x93\x88", "\xf0\x9f\x8e\xb3"=>"\xee\xad\x83", "\xf0\x9f\x8e\xb4"=>"\xee\xad\xae", "\xf0\x9f\x83\x8f"=>"\xee\xad\xaf", "\xf0\x9f\x8e\xb5"=>"\xee\x96\xbe",
- "\xf0\x9f\x8e\xb6"=>"\xee\x94\x85", "\xf0\x9f\x8e\xb7"=>"[\xe3\x82\xb5\xe3\x83\x83\xe3\x82\xaf\xe3\x82\xb9]", "\xf0\x9f\x8e\xb8"=>"\xee\x94\x86", "\xf0\x9f\x8e\xb9"=>"\xee\xad\x80", "\xf0\x9f\x8e\xba"=>"\xee\xab\x9c",
- "\xf0\x9f\x8e\xbb"=>"\xee\x94\x87", "\xf0\x9f\x8e\xbc"=>"\xee\xab\x8c", "\xe3\x80\xbd"=>"[\xe6\xad\x8c\xe8\xa8\x98\xe5\x8f\xb7]", "\xf0\x9f\x93\xb7"=>"\xee\x94\x95", "\xf0\x9f\x93\xb9"=>"\xee\x95\xbe",
- "\xf0\x9f\x93\xba"=>"\xee\x94\x82", "\xf0\x9f\x93\xbb"=>"\xee\x96\xb9", "\xf0\x9f\x93\xbc"=>"\xee\x96\x80", "\xf0\x9f\x92\x8b"=>"\xee\x93\xab", "\xf0\x9f\x92\x8c"=>"\xee\xad\xb8",
- "\xf0\x9f\x92\x8d"=>"\xee\x94\x94", "\xf0\x9f\x92\x8e"=>"\xee\x94\x94", "\xf0\x9f\x92\x8f"=>"\xee\x97\x8a", "\xf0\x9f\x92\x90"=>"\xee\xaa\x95", "\xf0\x9f\x92\x91"=>"\xee\xab\x9a",
- "\xf0\x9f\x92\x92"=>"\xee\x96\xbb", "\xf0\x9f\x94\x9e"=>"\xee\xaa\x83", "\xc2\xa9"=>"\xee\x95\x98", "\xc2\xae"=>"\xee\x95\x99", "\xe2\x84\xa2"=>"\xee\x95\x8e",
- "\xe2\x84\xb9"=>"\xee\x94\xb3", "#\xe2\x83\xa3"=>"\xee\xae\x84", "1\xe2\x83\xa3"=>"\xee\x94\xa2", "2\xe2\x83\xa3"=>"\xee\x94\xa3", "3\xe2\x83\xa3"=>"\xee\x94\xa4",
- "4\xe2\x83\xa3"=>"\xee\x94\xa5", "5\xe2\x83\xa3"=>"\xee\x94\xa6", "6\xe2\x83\xa3"=>"\xee\x94\xa7", "7\xe2\x83\xa3"=>"\xee\x94\xa8", "8\xe2\x83\xa3"=>"\xee\x94\xa9",
- "9\xe2\x83\xa3"=>"\xee\x94\xaa", "0\xe2\x83\xa3"=>"\xee\x96\xac", "\xf0\x9f\x94\x9f"=>"\xee\x94\xab", "\xf0\x9f\x93\xb6"=>"\xee\xaa\x84", "\xf0\x9f\x93\xb3"=>"\xee\xaa\x90",
- "\xf0\x9f\x93\xb4"=>"\xee\xaa\x91", "\xf0\x9f\x8d\x94"=>"\xee\x93\x96", "\xf0\x9f\x8d\x99"=>"\xee\x93\x95", "\xf0\x9f\x8d\xb0"=>"\xee\x93\x90", "\xf0\x9f\x8d\x9c"=>"\xee\x96\xb4",
- "\xf0\x9f\x8d\x9e"=>"\xee\xaa\xaf", "\xf0\x9f\x8d\xb3"=>"\xee\x93\x91", "\xf0\x9f\x8d\xa6"=>"\xee\xaa\xb0", "\xf0\x9f\x8d\x9f"=>"\xee\xaa\xb1", "\xf0\x9f\x8d\xa1"=>"\xee\xaa\xb2",
- "\xf0\x9f\x8d\x98"=>"\xee\xaa\xb3", "\xf0\x9f\x8d\x9a"=>"\xee\xaa\xb4", "\xf0\x9f\x8d\x9d"=>"\xee\xaa\xb5", "\xf0\x9f\x8d\x9b"=>"\xee\xaa\xb6", "\xf0\x9f\x8d\xa2"=>"\xee\xaa\xb7",
- "\xf0\x9f\x8d\xa3"=>"\xee\xaa\xb8", "\xf0\x9f\x8d\xb1"=>"\xee\xaa\xbd", "\xf0\x9f\x8d\xb2"=>"\xee\xaa\xbe", "\xf0\x9f\x8d\xa7"=>"\xee\xab\xaa", "\xf0\x9f\x8d\x96"=>"\xee\x93\x84",
- "\xf0\x9f\x8d\xa5"=>"\xee\x93\xad", "\xf0\x9f\x8d\xa0"=>"\xee\xac\xba", "\xf0\x9f\x8d\x95"=>"\xee\xac\xbb", "\xf0\x9f\x8d\x97"=>"\xee\xac\xbc", "\xf0\x9f\x8d\xa8"=>"\xee\xad\x8a",
- "\xf0\x9f\x8d\xa9"=>"\xee\xad\x8b", "\xf0\x9f\x8d\xaa"=>"\xee\xad\x8c", "\xf0\x9f\x8d\xab"=>"\xee\xad\x8d", "\xf0\x9f\x8d\xac"=>"\xee\xad\x8e", "\xf0\x9f\x8d\xad"=>"\xee\xad\x8f",
- "\xf0\x9f\x8d\xae"=>"\xee\xad\x96", "\xf0\x9f\x8d\xaf"=>"\xee\xad\x99", "\xf0\x9f\x8d\xa4"=>"\xee\xad\xb0", "\xf0\x9f\x8d\xb4"=>"\xee\x92\xac", "\xe2\x98\x95"=>"\xee\x96\x97",
- "\xf0\x9f\x8d\xb8"=>"\xee\x93\x82", "\xf0\x9f\x8d\xba"=>"\xee\x93\x83", "\xf0\x9f\x8d\xb5"=>"\xee\xaa\xae", "\xf0\x9f\x8d\xb6"=>"\xee\xaa\x97", "\xf0\x9f\x8d\xb7"=>"\xee\x93\x81",
- "\xf0\x9f\x8d\xbb"=>"\xee\xaa\x98", "\xf0\x9f\x8d\xb9"=>"\xee\xac\xbe", "\xe2\x86\x97"=>"\xee\x95\x95", "\xe2\x86\x98"=>"\xee\x95\x8d", "\xe2\x86\x96"=>"\xee\x95\x8c",
- "\xe2\x86\x99"=>"\xee\x95\x96", "\xe2\xa4\xb4"=>"\xee\xac\xad", "\xe2\xa4\xb5"=>"\xee\xac\xae", "\xe2\x86\x94"=>"\xee\xad\xba", "\xe2\x86\x95"=>"\xee\xad\xbb",
- "\xe2\xac\x86"=>"\xee\x94\xbf", "\xe2\xac\x87"=>"\xee\x95\x80", "\xe2\x9e\xa1"=>"\xee\x95\x92", "\xe2\xac\x85"=>"\xee\x95\x93", "\xe2\x96\xb6"=>"\xee\x94\xae",
- "\xe2\x97\x80"=>"\xee\x94\xad", "\xe2\x8f\xa9"=>"\xee\x94\xb0", "\xe2\x8f\xaa"=>"\xee\x94\xaf", "\xe2\x8f\xab"=>"\xee\x95\x85", "\xe2\x8f\xac"=>"\xee\x95\x84",
- "\xf0\x9f\x94\xba"=>"\xee\x95\x9a", "\xf0\x9f\x94\xbb"=>"\xee\x95\x9b", "\xf0\x9f\x94\xbc"=>"\xee\x95\x83", "\xf0\x9f\x94\xbd"=>"\xee\x95\x82", "\xe2\xad\x95"=>"\xee\xaa\xad",
- "\xe2\x9d\x8c"=>"\xee\x95\x90", "\xe2\x9d\x8e"=>"\xee\x95\x91", "\xe2\x9d\x97"=>"\xee\x92\x82", "\xe2\x81\x89"=>"\xee\xac\xaf", "\xe2\x80\xbc"=>"\xee\xac\xb0",
- "\xe2\x9d\x93"=>"\xee\x92\x83", "\xe2\x9d\x94"=>"\xee\x92\x83", "\xe2\x9d\x95"=>"\xee\x92\x82", "\xe3\x80\xb0"=>"\xe3\x80\x93", "\xe2\x9e\xb0"=>"\xee\xac\xb1",
- "\xe2\x9e\xbf"=>"[\xe3\x83\x95\xe3\x83\xaa\xe3\x83\xbc\xe3\x83\x80\xe3\x82\xa4\xe3\x83\xa4\xe3\x83\xab]", "\xe2\x9d\xa4"=>"\xee\x96\x95", "\xf0\x9f\x92\x93"=>"\xee\xad\xb5", "\xf0\x9f\x92\x94"=>"\xee\x91\xb7", "\xf0\x9f\x92\x95"=>"\xee\x91\xb8",
- "\xf0\x9f\x92\x96"=>"\xee\xaa\xa6", "\xf0\x9f\x92\x97"=>"\xee\xad\xb5", "\xf0\x9f\x92\x98"=>"\xee\x93\xaa", "\xf0\x9f\x92\x99"=>"\xee\xaa\xa7", "\xf0\x9f\x92\x9a"=>"\xee\xaa\xa8",
- "\xf0\x9f\x92\x9b"=>"\xee\xaa\xa9", "\xf0\x9f\x92\x9c"=>"\xee\xaa\xaa", "\xf0\x9f\x92\x9d"=>"\xee\xad\x94", "\xf0\x9f\x92\x9e"=>"\xee\x96\xaf", "\xf0\x9f\x92\x9f"=>"\xee\x96\x95",
- "\xe2\x99\xa5"=>"\xee\xaa\xa5", "\xe2\x99\xa0"=>"\xee\x96\xa1", "\xe2\x99\xa6"=>"\xee\x96\xa2", "\xe2\x99\xa3"=>"\xee\x96\xa3", "\xf0\x9f\x9a\xac"=>"\xee\x91\xbd",
- "\xf0\x9f\x9a\xad"=>"\xee\x91\xbe", "\xe2\x99\xbf"=>"\xee\x91\xbf", "\xf0\x9f\x9a\xa9"=>"\xee\xac\xac", "\xe2\x9a\xa0"=>"\xee\x92\x81", "\xe2\x9b\x94"=>"\xee\x92\x84",
- "\xe2\x99\xbb"=>"\xee\xad\xb9", "\xf0\x9f\x9a\xb2"=>"\xee\x92\xae", "\xf0\x9f\x9a\xb6"=>"\xee\xad\xb2", "\xf0\x9f\x9a\xb9"=>"[\xe2\x99\x82]", "\xf0\x9f\x9a\xba"=>"[\xe2\x99\x80]",
- "\xf0\x9f\x9b\x80"=>"\xee\x97\x98", "\xf0\x9f\x9a\xbb"=>"\xee\x92\xa5", "\xf0\x9f\x9a\xbd"=>"\xee\x92\xa5", "\xf0\x9f\x9a\xbe"=>"\xee\x92\xa5", "\xf0\x9f\x9a\xbc"=>"\xee\xac\x98",
- "\xf0\x9f\x9a\xaa"=>"[\xe3\x83\x89\xe3\x82\xa2]", "\xf0\x9f\x9a\xab"=>"\xee\x95\x81", "\xe2\x9c\x94"=>"\xee\x95\x97", "\xf0\x9f\x86\x91"=>"\xee\x96\xab", "\xf0\x9f\x86\x92"=>"\xee\xaa\x85",
- "\xf0\x9f\x86\x93"=>"\xee\x95\xb8", "\xf0\x9f\x86\x94"=>"\xee\xaa\x88", "\xf0\x9f\x86\x95"=>"\xee\x96\xb5", "\xf0\x9f\x86\x96"=>"[NG]", "\xf0\x9f\x86\x97"=>"\xee\x96\xad",
- "\xf0\x9f\x86\x98"=>"\xee\x93\xa8", "\xf0\x9f\x86\x99"=>"\xee\x94\x8f", "\xf0\x9f\x86\x9a"=>"\xee\x97\x92", "\xf0\x9f\x88\x81"=>"[\xe3\x82\xb3\xe3\x82\xb3]", "\xf0\x9f\x88\x82"=>"\xee\xaa\x87",
- "\xf0\x9f\x88\xb2"=>"[\xe7\xa6\x81]", "\xf0\x9f\x88\xb3"=>"\xee\xaa\x8a", "\xf0\x9f\x88\xb4"=>"[\xe5\x90\x88]", "\xf0\x9f\x88\xb5"=>"\xee\xaa\x89", "\xf0\x9f\x88\xb6"=>"[\xe6\x9c\x89]",
- "\xf0\x9f\x88\x9a"=>"[\xe7\x84\xa1]", "\xf0\x9f\x88\xb7"=>"[\xe6\x9c\x88]", "\xf0\x9f\x88\xb8"=>"[\xe7\x94\xb3]", "\xf0\x9f\x88\xb9"=>"\xee\xaa\x86", "\xf0\x9f\x88\xaf"=>"\xee\xaa\x8b",
- "\xf0\x9f\x88\xba"=>"\xee\xaa\x8c", "\xe3\x8a\x99"=>"\xee\x93\xb1", "\xe3\x8a\x97"=>"\xee\xaa\x99", "\xf0\x9f\x89\x90"=>"\xee\x93\xb7", "\xf0\x9f\x89\x91"=>"\xee\xac\x81",
- "\xe2\x9e\x95"=>"\xee\x94\xbc", "\xe2\x9e\x96"=>"\xee\x94\xbd", "\xe2\x9c\x96"=>"\xee\x95\x8f", "\xe2\x9e\x97"=>"\xee\x95\x94", "\xf0\x9f\x92\xa0"=>"\xe3\x80\x93",
- "\xf0\x9f\x92\xa1"=>"\xee\x91\xb6", "\xf0\x9f\x92\xa2"=>"\xee\x93\xa5", "\xf0\x9f\x92\xa3"=>"\xee\x91\xba", "\xf0\x9f\x92\xa4"=>"\xee\x91\xb5", "\xf0\x9f\x92\xa5"=>"\xee\x96\xb0",
- "\xf0\x9f\x92\xa6"=>"\xee\x96\xb1", "\xf0\x9f\x92\xa7"=>"\xee\x93\xa6", "\xf0\x9f\x92\xa8"=>"\xee\x93\xb4", "\xf0\x9f\x92\xa9"=>"\xee\x93\xb5", "\xf0\x9f\x92\xaa"=>"\xee\x93\xa9",
- "\xf0\x9f\x92\xab"=>"\xee\xad\x9c", "\xf0\x9f\x92\xac"=>"\xee\x93\xbd", "\xe2\x9c\xa8"=>"\xee\xaa\xab", "\xe2\x9c\xb4"=>"\xee\x91\xb9", "\xe2\x9c\xb3"=>"\xee\x94\xbe",
- "\xe2\x9a\xaa"=>"\xee\x94\xba", "\xe2\x9a\xab"=>"\xee\x94\xbb", "\xf0\x9f\x94\xb4"=>"\xee\x95\x8a", "\xf0\x9f\x94\xb5"=>"\xee\x95\x8b", "\xf0\x9f\x94\xb2"=>"\xee\x95\x8b",
- "\xf0\x9f\x94\xb3"=>"\xee\x95\x8b", "\xe2\xad\x90"=>"\xee\x92\x8b", "\xe2\xac\x9c"=>"\xee\x95\x88", "\xe2\xac\x9b"=>"\xee\x95\x89", "\xe2\x96\xab"=>"\xee\x94\xb1",
- "\xe2\x96\xaa"=>"\xee\x94\xb2", "\xe2\x97\xbd"=>"\xee\x94\xb4", "\xe2\x97\xbe"=>"\xee\x94\xb5", "\xe2\x97\xbb"=>"\xee\x94\xb8", "\xe2\x97\xbc"=>"\xee\x94\xb9",
- "\xf0\x9f\x94\xb6"=>"\xee\x95\x86", "\xf0\x9f\x94\xb7"=>"\xee\x95\x87", "\xf0\x9f\x94\xb8"=>"\xee\x94\xb6", "\xf0\x9f\x94\xb9"=>"\xee\x94\xb7", "\xe2\x9d\x87"=>"\xee\x91\xac",
- "\xf0\x9f\x92\xae"=>"\xee\x93\xb0", "\xf0\x9f\x92\xaf"=>"\xee\x93\xb2", "\xe2\x86\xa9"=>"\xee\x95\x9d", "\xe2\x86\xaa"=>"\xee\x95\x9c", "\xf0\x9f\x94\x83"=>"\xee\xac\x8d",
- "\xf0\x9f\x94\x8a"=>"\xee\x94\x91", "\xf0\x9f\x94\x8b"=>"\xee\x96\x84", "\xf0\x9f\x94\x8c"=>"\xee\x96\x89", "\xf0\x9f\x94\x8d"=>"\xee\x94\x98", "\xf0\x9f\x94\x8e"=>"\xee\xac\x85",
- "\xf0\x9f\x94\x92"=>"\xee\x94\x9c", "\xf0\x9f\x94\x93"=>"\xee\x94\x9c", "\xf0\x9f\x94\x8f"=>"\xee\xac\x8c", "\xf0\x9f\x94\x90"=>"\xee\xab\xbc", "\xf0\x9f\x94\x91"=>"\xee\x94\x99",
- "\xf0\x9f\x94\x94"=>"\xee\x94\x92", "\xe2\x98\x91"=>"\xee\xac\x82", "\xf0\x9f\x94\x98"=>"\xee\xac\x84", "\xf0\x9f\x94\x96"=>"\xee\xac\x87", "\xf0\x9f\x94\x97"=>"\xee\x96\x8a",
- "\xf0\x9f\x94\x99"=>"\xee\xac\x86", "\xf0\x9f\x94\x9a"=>"[end]", "\xf0\x9f\x94\x9b"=>"[ON]", "\xf0\x9f\x94\x9c"=>"[SOON]", "\xf0\x9f\x94\x9d"=>"[TOP]",
- "\xe2\x9c\x85"=>"\xee\x95\x9e", "\xe2\x9c\x8a"=>"\xee\xae\x83", "\xe2\x9c\x8b"=>"\xee\x96\xa7", "\xe2\x9c\x8c"=>"\xee\x96\xa6", "\xf0\x9f\x91\x8a"=>"\xee\x93\xb3",
- "\xf0\x9f\x91\x8d"=>"\xee\x93\xb9", "\xe2\x98\x9d"=>"\xee\x93\xb6", "\xf0\x9f\x91\x86"=>"\xee\xaa\x8d", "\xf0\x9f\x91\x87"=>"\xee\xaa\x8e", "\xf0\x9f\x91\x88"=>"\xee\x93\xbf",
- "\xf0\x9f\x91\x89"=>"\xee\x94\x80", "\xf0\x9f\x91\x8b"=>"\xee\xab\x96", "\xf0\x9f\x91\x8f"=>"\xee\xab\x93", "\xf0\x9f\x91\x8c"=>"\xee\xab\x94", "\xf0\x9f\x91\x8e"=>"\xee\xab\x95",
- "\xf0\x9f\x91\x90"=>"\xee\xab\x96",
- ),
- 'unified_to_softbank' => array(
- "\xe2\x98\x80"=>"\xee\x81\x8a", "\xe2\x98\x81"=>"\xee\x81\x89", "\xe2\x98\x94"=>"\xee\x81\x8b", "\xe2\x9b\x84"=>"\xee\x81\x88",
- "\xe2\x9a\xa1"=>"\xee\x84\xbd", "\xf0\x9f\x8c\x80"=>"\xee\x91\x83", "\xf0\x9f\x8c\x81"=>"[\xe9\x9c\xa7]", "\xf0\x9f\x8c\x82"=>"\xee\x90\xbc", "\xf0\x9f\x8c\x83"=>"\xee\x91\x8b",
- "\xf0\x9f\x8c\x84"=>"\xee\x81\x8d", "\xf0\x9f\x8c\x85"=>"\xee\x91\x89", "\xf0\x9f\x8c\x86"=>"\xee\x85\x86", "\xf0\x9f\x8c\x87"=>"\xee\x91\x8a", "\xf0\x9f\x8c\x88"=>"\xee\x91\x8c",
- "\xe2\x9d\x84"=>"[\xe9\x9b\xaa\xe7\xb5\x90\xe6\x99\xb6]", "\xe2\x9b\x85"=>"\xee\x81\x8a\xee\x81\x89", "\xf0\x9f\x8c\x89"=>"\xee\x91\x8b", "\xf0\x9f\x8c\x8a"=>"\xee\x90\xbe", "\xf0\x9f\x8c\x8b"=>"[\xe7\x81\xab\xe5\xb1\xb1]",
- "\xf0\x9f\x8c\x8c"=>"\xee\x91\x8b", "\xf0\x9f\x8c\x8f"=>"[\xe5\x9c\xb0\xe7\x90\x83]", "\xf0\x9f\x8c\x91"=>"\xe2\x97\x8f", "\xf0\x9f\x8c\x94"=>"\xee\x81\x8c", "\xf0\x9f\x8c\x93"=>"\xee\x81\x8c",
- "\xf0\x9f\x8c\x99"=>"\xee\x81\x8c", "\xf0\x9f\x8c\x95"=>"\xe2\x97\x8b", "\xf0\x9f\x8c\x9b"=>"\xee\x81\x8c", "\xf0\x9f\x8c\x9f"=>"\xee\x8c\xb5", "\xf0\x9f\x8c\xa0"=>"\xe2\x98\x86\xe5\xbd\xa1",
- "\xf0\x9f\x95\x90"=>"\xee\x80\xa4", "\xf0\x9f\x95\x91"=>"\xee\x80\xa5", "\xf0\x9f\x95\x92"=>"\xee\x80\xa6", "\xf0\x9f\x95\x93"=>"\xee\x80\xa7", "\xf0\x9f\x95\x94"=>"\xee\x80\xa8",
- "\xf0\x9f\x95\x95"=>"\xee\x80\xa9", "\xf0\x9f\x95\x96"=>"\xee\x80\xaa", "\xf0\x9f\x95\x97"=>"\xee\x80\xab", "\xf0\x9f\x95\x98"=>"\xee\x80\xac", "\xf0\x9f\x95\x99"=>"\xee\x80\xad",
- "\xf0\x9f\x95\x9a"=>"\xee\x80\xae", "\xf0\x9f\x95\x9b"=>"\xee\x80\xaf", "\xe2\x8c\x9a"=>"[\xe8\x85\x95\xe6\x99\x82\xe8\xa8\x88]", "\xe2\x8c\x9b"=>"[\xe7\xa0\x82\xe6\x99\x82\xe8\xa8\x88]", "\xe2\x8f\xb0"=>"\xee\x80\xad",
- "\xe2\x8f\xb3"=>"[\xe7\xa0\x82\xe6\x99\x82\xe8\xa8\x88]", "\xe2\x99\x88"=>"\xee\x88\xbf", "\xe2\x99\x89"=>"\xee\x89\x80", "\xe2\x99\x8a"=>"\xee\x89\x81", "\xe2\x99\x8b"=>"\xee\x89\x82",
- "\xe2\x99\x8c"=>"\xee\x89\x83", "\xe2\x99\x8d"=>"\xee\x89\x84", "\xe2\x99\x8e"=>"\xee\x89\x85", "\xe2\x99\x8f"=>"\xee\x89\x86", "\xe2\x99\x90"=>"\xee\x89\x87",
- "\xe2\x99\x91"=>"\xee\x89\x88", "\xe2\x99\x92"=>"\xee\x89\x89", "\xe2\x99\x93"=>"\xee\x89\x8a", "\xe2\x9b\x8e"=>"\xee\x89\x8b", "\xf0\x9f\x8d\x80"=>"\xee\x84\x90",
- "\xf0\x9f\x8c\xb7"=>"\xee\x8c\x84", "\xf0\x9f\x8c\xb1"=>"\xee\x84\x90", "\xf0\x9f\x8d\x81"=>"\xee\x84\x98", "\xf0\x9f\x8c\xb8"=>"\xee\x80\xb0", "\xf0\x9f\x8c\xb9"=>"\xee\x80\xb2",
- "\xf0\x9f\x8d\x82"=>"\xee\x84\x99", "\xf0\x9f\x8d\x83"=>"\xee\x91\x87", "\xf0\x9f\x8c\xba"=>"\xee\x8c\x83", "\xf0\x9f\x8c\xbb"=>"\xee\x8c\x85", "\xf0\x9f\x8c\xb4"=>"\xee\x8c\x87",
- "\xf0\x9f\x8c\xb5"=>"\xee\x8c\x88", "\xf0\x9f\x8c\xbe"=>"\xee\x91\x84", "\xf0\x9f\x8c\xbd"=>"[\xe3\x81\xa8\xe3\x81\x86\xe3\x82\x82\xe3\x82\x8d\xe3\x81\x93\xe3\x81\x97]", "\xf0\x9f\x8d\x84"=>"[\xe3\x82\xad\xe3\x83\x8e\xe3\x82\xb3]", "\xf0\x9f\x8c\xb0"=>"[\xe6\xa0\x97]",
- "\xf0\x9f\x8c\xbc"=>"\xee\x8c\x85", "\xf0\x9f\x8c\xbf"=>"\xee\x84\x90", "\xf0\x9f\x8d\x92"=>"[\xe3\x81\x95\xe3\x81\x8f\xe3\x82\x89\xe3\x82\x93\xe3\x81\xbc]", "\xf0\x9f\x8d\x8c"=>"[\xe3\x83\x90\xe3\x83\x8a\xe3\x83\x8a]", "\xf0\x9f\x8d\x8e"=>"\xee\x8d\x85",
- "\xf0\x9f\x8d\x8a"=>"\xee\x8d\x86", "\xf0\x9f\x8d\x93"=>"\xee\x8d\x87", "\xf0\x9f\x8d\x89"=>"\xee\x8d\x88", "\xf0\x9f\x8d\x85"=>"\xee\x8d\x89", "\xf0\x9f\x8d\x86"=>"\xee\x8d\x8a",
- "\xf0\x9f\x8d\x88"=>"[\xe3\x83\xa1\xe3\x83\xad\xe3\x83\xb3]", "\xf0\x9f\x8d\x8d"=>"[\xe3\x83\x91\xe3\x82\xa4\xe3\x83\x8a\xe3\x83\x83\xe3\x83\x97\xe3\x83\xab]", "\xf0\x9f\x8d\x87"=>"[\xe3\x83\x96\xe3\x83\x89\xe3\x82\xa6]", "\xf0\x9f\x8d\x91"=>"[\xe3\x83\xa2\xe3\x83\xa2]", "\xf0\x9f\x8d\x8f"=>"\xee\x8d\x85",
- "\xf0\x9f\x91\x80"=>"\xee\x90\x99", "\xf0\x9f\x91\x82"=>"\xee\x90\x9b", "\xf0\x9f\x91\x83"=>"\xee\x90\x9a", "\xf0\x9f\x91\x84"=>"\xee\x90\x9c", "\xf0\x9f\x91\x85"=>"\xee\x90\x89",
- "\xf0\x9f\x92\x84"=>"\xee\x8c\x9c", "\xf0\x9f\x92\x85"=>"\xee\x8c\x9d", "\xf0\x9f\x92\x86"=>"\xee\x8c\x9e", "\xf0\x9f\x92\x87"=>"\xee\x8c\x9f", "\xf0\x9f\x92\x88"=>"\xee\x8c\xa0",
- "\xf0\x9f\x91\xa4"=>"\xe3\x80\x93", "\xf0\x9f\x91\xa6"=>"\xee\x80\x81", "\xf0\x9f\x91\xa7"=>"\xee\x80\x82", "\xf0\x9f\x91\xa8"=>"\xee\x80\x84", "\xf0\x9f\x91\xa9"=>"\xee\x80\x85",
- "\xf0\x9f\x91\xaa"=>"[\xe5\xae\xb6\xe6\x97\x8f]", "\xf0\x9f\x91\xab"=>"\xee\x90\xa8", "\xf0\x9f\x91\xae"=>"\xee\x85\x92", "\xf0\x9f\x91\xaf"=>"\xee\x90\xa9", "\xf0\x9f\x91\xb0"=>"[\xe8\x8a\xb1\xe5\xab\x81]",
- "\xf0\x9f\x91\xb1"=>"\xee\x94\x95", "\xf0\x9f\x91\xb2"=>"\xee\x94\x96", "\xf0\x9f\x91\xb3"=>"\xee\x94\x97", "\xf0\x9f\x91\xb4"=>"\xee\x94\x98", "\xf0\x9f\x91\xb5"=>"\xee\x94\x99",
- "\xf0\x9f\x91\xb6"=>"\xee\x94\x9a", "\xf0\x9f\x91\xb7"=>"\xee\x94\x9b", "\xf0\x9f\x91\xb8"=>"\xee\x94\x9c", "\xf0\x9f\x91\xb9"=>"[\xe3\x81\xaa\xe3\x81\xbe\xe3\x81\xaf\xe3\x81\x92]", "\xf0\x9f\x91\xba"=>"[\xe5\xa4\xa9\xe7\x8b\x97]",
- "\xf0\x9f\x91\xbb"=>"\xee\x84\x9b", "\xf0\x9f\x91\xbc"=>"\xee\x81\x8e", "\xf0\x9f\x91\xbd"=>"\xee\x84\x8c", "\xf0\x9f\x91\xbe"=>"\xee\x84\xab", "\xf0\x9f\x91\xbf"=>"\xee\x84\x9a",
- "\xf0\x9f\x92\x80"=>"\xee\x84\x9c", "\xf0\x9f\x92\x81"=>"\xee\x89\x93", "\xf0\x9f\x92\x82"=>"\xee\x94\x9e", "\xf0\x9f\x92\x83"=>"\xee\x94\x9f", "\xf0\x9f\x90\x8c"=>"[\xe3\x82\xab\xe3\x82\xbf\xe3\x83\x84\xe3\x83\xa0\xe3\x83\xaa]",
- "\xf0\x9f\x90\x8d"=>"\xee\x94\xad", "\xf0\x9f\x90\x8e"=>"\xee\x84\xb4", "\xf0\x9f\x90\x94"=>"\xee\x94\xae", "\xf0\x9f\x90\x97"=>"\xee\x94\xaf", "\xf0\x9f\x90\xab"=>"\xee\x94\xb0",
- "\xf0\x9f\x90\x98"=>"\xee\x94\xa6", "\xf0\x9f\x90\xa8"=>"\xee\x94\xa7", "\xf0\x9f\x90\x92"=>"\xee\x94\xa8", "\xf0\x9f\x90\x91"=>"\xee\x94\xa9", "\xf0\x9f\x90\x99"=>"\xee\x84\x8a",
- "\xf0\x9f\x90\x9a"=>"\xee\x91\x81", "\xf0\x9f\x90\x9b"=>"\xee\x94\xa5", "\xf0\x9f\x90\x9c"=>"[\xe3\x82\xa2\xe3\x83\xaa]", "\xf0\x9f\x90\x9d"=>"[\xe3\x83\x9f\xe3\x83\x84\xe3\x83\x90\xe3\x83\x81]", "\xf0\x9f\x90\x9e"=>"[\xe3\x81\xa6\xe3\x82\x93\xe3\x81\xa8\xe3\x81\x86\xe8\x99\xab]",
- "\xf0\x9f\x90\xa0"=>"\xee\x94\xa2", "\xf0\x9f\x90\xa1"=>"\xee\x80\x99", "\xf0\x9f\x90\xa2"=>"[\xe3\x82\xab\xe3\x83\xa1]", "\xf0\x9f\x90\xa4"=>"\xee\x94\xa3", "\xf0\x9f\x90\xa5"=>"\xee\x94\xa3",
- "\xf0\x9f\x90\xa6"=>"\xee\x94\xa1", "\xf0\x9f\x90\xa3"=>"\xee\x94\xa3", "\xf0\x9f\x90\xa7"=>"\xee\x81\x95", "\xf0\x9f\x90\xa9"=>"\xee\x81\x92", "\xf0\x9f\x90\x9f"=>"\xee\x80\x99",
- "\xf0\x9f\x90\xac"=>"\xee\x94\xa0", "\xf0\x9f\x90\xad"=>"\xee\x81\x93", "\xf0\x9f\x90\xaf"=>"\xee\x81\x90", "\xf0\x9f\x90\xb1"=>"\xee\x81\x8f", "\xf0\x9f\x90\xb3"=>"\xee\x81\x94",
- "\xf0\x9f\x90\xb4"=>"\xee\x80\x9a", "\xf0\x9f\x90\xb5"=>"\xee\x84\x89", "\xf0\x9f\x90\xb6"=>"\xee\x81\x92", "\xf0\x9f\x90\xb7"=>"\xee\x84\x8b", "\xf0\x9f\x90\xbb"=>"\xee\x81\x91",
- "\xf0\x9f\x90\xb9"=>"\xee\x94\xa4", "\xf0\x9f\x90\xba"=>"\xee\x94\xaa", "\xf0\x9f\x90\xae"=>"\xee\x94\xab", "\xf0\x9f\x90\xb0"=>"\xee\x94\xac", "\xf0\x9f\x90\xb8"=>"\xee\x94\xb1",
- "\xf0\x9f\x90\xbe"=>"\xee\x94\xb6", "\xf0\x9f\x90\xb2"=>"[\xe8\xbe\xb0]", "\xf0\x9f\x90\xbc"=>"[\xe3\x83\x91\xe3\x83\xb3\xe3\x83\x80]", "\xf0\x9f\x90\xbd"=>"\xee\x84\x8b", "\xf0\x9f\x98\xa0"=>"\xee\x81\x99",
- "\xf0\x9f\x98\xa9"=>"\xee\x90\x83", "\xf0\x9f\x98\xb2"=>"\xee\x90\x90", "\xf0\x9f\x98\x9e"=>"\xee\x81\x98", "\xf0\x9f\x98\xb5"=>"\xee\x90\x86", "\xf0\x9f\x98\xb0"=>"\xee\x90\x8f",
- "\xf0\x9f\x98\x92"=>"\xee\x90\x8e", "\xf0\x9f\x98\x8d"=>"\xee\x84\x86", "\xf0\x9f\x98\xa4"=>"\xee\x90\x84", "\xf0\x9f\x98\x9c"=>"\xee\x84\x85", "\xf0\x9f\x98\x9d"=>"\xee\x90\x89",
- "\xf0\x9f\x98\x8b"=>"\xee\x81\x96", "\xf0\x9f\x98\x98"=>"\xee\x90\x98", "\xf0\x9f\x98\x9a"=>"\xee\x90\x97", "\xf0\x9f\x98\xb7"=>"\xee\x90\x8c", "\xf0\x9f\x98\xb3"=>"\xee\x90\x8d",
- "\xf0\x9f\x98\x83"=>"\xee\x81\x97", "\xf0\x9f\x98\x85"=>"\xee\x90\x95\xee\x8c\xb1", "\xf0\x9f\x98\x86"=>"\xee\x90\x8a", "\xf0\x9f\x98\x81"=>"\xee\x90\x84", "\xf0\x9f\x98\x82"=>"\xee\x90\x92",
- "\xf0\x9f\x98\x8a"=>"\xee\x81\x96", "\xe2\x98\xba"=>"\xee\x90\x94", "\xf0\x9f\x98\x84"=>"\xee\x90\x95", "\xf0\x9f\x98\xa2"=>"\xee\x90\x93", "\xf0\x9f\x98\xad"=>"\xee\x90\x91",
- "\xf0\x9f\x98\xa8"=>"\xee\x90\x8b", "\xf0\x9f\x98\xa3"=>"\xee\x90\x86", "\xf0\x9f\x98\xa1"=>"\xee\x90\x96", "\xf0\x9f\x98\x8c"=>"\xee\x90\x8a", "\xf0\x9f\x98\x96"=>"\xee\x90\x87",
- "\xf0\x9f\x98\x94"=>"\xee\x90\x83", "\xf0\x9f\x98\xb1"=>"\xee\x84\x87", "\xf0\x9f\x98\xaa"=>"\xee\x90\x88", "\xf0\x9f\x98\x8f"=>"\xee\x90\x82", "\xf0\x9f\x98\x93"=>"\xee\x84\x88",
- "\xf0\x9f\x98\xa5"=>"\xee\x90\x81", "\xf0\x9f\x98\xab"=>"\xee\x90\x86", "\xf0\x9f\x98\x89"=>"\xee\x90\x85", "\xf0\x9f\x98\xba"=>"\xee\x81\x97", "\xf0\x9f\x98\xb8"=>"\xee\x90\x84",
- "\xf0\x9f\x98\xb9"=>"\xee\x90\x92", "\xf0\x9f\x98\xbd"=>"\xee\x90\x98", "\xf0\x9f\x98\xbb"=>"\xee\x84\x86", "\xf0\x9f\x98\xbf"=>"\xee\x90\x93", "\xf0\x9f\x98\xbe"=>"\xee\x90\x96",
- "\xf0\x9f\x98\xbc"=>"\xee\x90\x84", "\xf0\x9f\x99\x80"=>"\xee\x90\x83", "\xf0\x9f\x99\x85"=>"\xee\x90\xa3", "\xf0\x9f\x99\x86"=>"\xee\x90\xa4", "\xf0\x9f\x99\x87"=>"\xee\x90\xa6",
- "\xf0\x9f\x99\x88"=>"(/_\xef\xbc\xbc)", "\xf0\x9f\x99\x8a"=>"(\xe3\x83\xbb\xc3\x97\xe3\x83\xbb)", "\xf0\x9f\x99\x89"=>"|(\xe3\x83\xbb\xc3\x97\xe3\x83\xbb)|", "\xf0\x9f\x99\x8b"=>"\xee\x80\x92", "\xf0\x9f\x99\x8c"=>"\xee\x90\xa7",
- "\xf0\x9f\x99\x8d"=>"\xee\x90\x83", "\xf0\x9f\x99\x8e"=>"\xee\x90\x96", "\xf0\x9f\x99\x8f"=>"\xee\x90\x9d", "\xf0\x9f\x8f\xa0"=>"\xee\x80\xb6", "\xf0\x9f\x8f\xa1"=>"\xee\x80\xb6",
- "\xf0\x9f\x8f\xa2"=>"\xee\x80\xb8", "\xf0\x9f\x8f\xa3"=>"\xee\x85\x93", "\xf0\x9f\x8f\xa5"=>"\xee\x85\x95", "\xf0\x9f\x8f\xa6"=>"\xee\x85\x8d", "\xf0\x9f\x8f\xa7"=>"\xee\x85\x94",
- "\xf0\x9f\x8f\xa8"=>"\xee\x85\x98", "\xf0\x9f\x8f\xa9"=>"\xee\x94\x81", "\xf0\x9f\x8f\xaa"=>"\xee\x85\x96", "\xf0\x9f\x8f\xab"=>"\xee\x85\x97", "\xe2\x9b\xaa"=>"\xee\x80\xb7",
- "\xe2\x9b\xb2"=>"\xee\x84\xa1", "\xf0\x9f\x8f\xac"=>"\xee\x94\x84", "\xf0\x9f\x8f\xaf"=>"\xee\x94\x85", "\xf0\x9f\x8f\xb0"=>"\xee\x94\x86", "\xf0\x9f\x8f\xad"=>"\xee\x94\x88",
- "\xe2\x9a\x93"=>"\xee\x88\x82", "\xf0\x9f\x8f\xae"=>"\xee\x8c\x8b", "\xf0\x9f\x97\xbb"=>"\xee\x80\xbb", "\xf0\x9f\x97\xbc"=>"\xee\x94\x89", "\xf0\x9f\x97\xbd"=>"\xee\x94\x9d",
- "\xf0\x9f\x97\xbe"=>"[\xe6\x97\xa5\xe6\x9c\xac\xe5\x9c\xb0\xe5\x9b\xb3]", "\xf0\x9f\x97\xbf"=>"[\xe3\x83\xa2\xe3\x82\xa2\xe3\x82\xa4]", "\xf0\x9f\x91\x9e"=>"\xee\x80\x87", "\xf0\x9f\x91\x9f"=>"\xee\x80\x87", "\xf0\x9f\x91\xa0"=>"\xee\x84\xbe",
- "\xf0\x9f\x91\xa1"=>"\xee\x8c\x9a", "\xf0\x9f\x91\xa2"=>"\xee\x8c\x9b", "\xf0\x9f\x91\xa3"=>"\xee\x94\xb6", "\xf0\x9f\x91\x93"=>"[\xe3\x83\xa1\xe3\x82\xac\xe3\x83\x8d]", "\xf0\x9f\x91\x95"=>"\xee\x80\x86",
- "\xf0\x9f\x91\x96"=>"[\xe3\x82\xb8\xe3\x83\xbc\xe3\x83\xb3\xe3\x82\xba]", "\xf0\x9f\x91\x91"=>"\xee\x84\x8e", "\xf0\x9f\x91\x94"=>"\xee\x8c\x82", "\xf0\x9f\x91\x92"=>"\xee\x8c\x98", "\xf0\x9f\x91\x97"=>"\xee\x8c\x99",
- "\xf0\x9f\x91\x98"=>"\xee\x8c\xa1", "\xf0\x9f\x91\x99"=>"\xee\x8c\xa2", "\xf0\x9f\x91\x9a"=>"\xee\x80\x86", "\xf0\x9f\x91\x9b"=>"[\xe8\xb2\xa1\xe5\xb8\x83]", "\xf0\x9f\x91\x9c"=>"\xee\x8c\xa3",
- "\xf0\x9f\x91\x9d"=>"[\xe3\x81\xb5\xe3\x81\x8f\xe3\x82\x8d]", "\xf0\x9f\x92\xb0"=>"\xee\x84\xaf", "\xf0\x9f\x92\xb1"=>"\xee\x85\x89", "\xf0\x9f\x92\xb9"=>"\xee\x85\x8a", "\xf0\x9f\x92\xb2"=>"\xee\x84\xaf",
- "\xf0\x9f\x92\xb3"=>"[\xe3\x82\xab\xe3\x83\xbc\xe3\x83\x89]", "\xf0\x9f\x92\xb4"=>"\xef\xbf\xa5", "\xf0\x9f\x92\xb5"=>"\xee\x84\xaf", "\xf0\x9f\x92\xb8"=>"[\xe9\xa3\x9b\xe3\x82\x93\xe3\x81\xa7\xe3\x81\x84\xe3\x81\x8f\xe3\x81\x8a\xe9\x87\x91]", "\xf0\x9f\x87\xa8\xf0\x9f\x87\xb3"=>"\xee\x94\x93",
- "\xf0\x9f\x87\xa9\xf0\x9f\x87\xaa"=>"\xee\x94\x8e", "\xf0\x9f\x87\xaa\xf0\x9f\x87\xb8"=>"\xee\x94\x91", "\xf0\x9f\x87\xab\xf0\x9f\x87\xb7"=>"\xee\x94\x8d", "\xf0\x9f\x87\xac\xf0\x9f\x87\xa7"=>"\xee\x94\x90", "\xf0\x9f\x87\xae\xf0\x9f\x87\xb9"=>"\xee\x94\x8f",
- "\xf0\x9f\x87\xaf\xf0\x9f\x87\xb5"=>"\xee\x94\x8b", "\xf0\x9f\x87\xb0\xf0\x9f\x87\xb7"=>"\xee\x94\x94", "\xf0\x9f\x87\xb7\xf0\x9f\x87\xba"=>"\xee\x94\x92", "\xf0\x9f\x87\xba\xf0\x9f\x87\xb8"=>"\xee\x94\x8c", "\xf0\x9f\x94\xa5"=>"\xee\x84\x9d",
- "\xf0\x9f\x94\xa6"=>"[\xe6\x87\x90\xe4\xb8\xad\xe9\x9b\xbb\xe7\x81\xaf]", "\xf0\x9f\x94\xa7"=>"[\xe3\x83\xac\xe3\x83\xb3\xe3\x83\x81]", "\xf0\x9f\x94\xa8"=>"\xee\x84\x96", "\xf0\x9f\x94\xa9"=>"[\xe3\x83\x8d\xe3\x82\xb8]", "\xf0\x9f\x94\xaa"=>"[\xe5\x8c\x85\xe4\xb8\x81]",
- "\xf0\x9f\x94\xab"=>"\xee\x84\x93", "\xf0\x9f\x94\xae"=>"\xee\x88\xbe", "\xf0\x9f\x94\xaf"=>"\xee\x88\xbe", "\xf0\x9f\x94\xb0"=>"\xee\x88\x89", "\xf0\x9f\x94\xb1"=>"\xee\x80\xb1",
- "\xf0\x9f\x92\x89"=>"\xee\x84\xbb", "\xf0\x9f\x92\x8a"=>"\xee\x8c\x8f", "\xf0\x9f\x85\xb0"=>"\xee\x94\xb2", "\xf0\x9f\x85\xb1"=>"\xee\x94\xb3", "\xf0\x9f\x86\x8e"=>"\xee\x94\xb4",
- "\xf0\x9f\x85\xbe"=>"\xee\x94\xb5", "\xf0\x9f\x8e\x80"=>"\xee\x8c\x94", "\xf0\x9f\x8e\x81"=>"\xee\x84\x92", "\xf0\x9f\x8e\x82"=>"\xee\x8d\x8b", "\xf0\x9f\x8e\x84"=>"\xee\x80\xb3",
- "\xf0\x9f\x8e\x85"=>"\xee\x91\x88", "\xf0\x9f\x8e\x8c"=>"\xee\x85\x83", "\xf0\x9f\x8e\x86"=>"\xee\x84\x97", "\xf0\x9f\x8e\x88"=>"\xee\x8c\x90", "\xf0\x9f\x8e\x89"=>"\xee\x8c\x92",
- "\xf0\x9f\x8e\x8d"=>"\xee\x90\xb6", "\xf0\x9f\x8e\x8e"=>"\xee\x90\xb8", "\xf0\x9f\x8e\x93"=>"\xee\x90\xb9", "\xf0\x9f\x8e\x92"=>"\xee\x90\xba", "\xf0\x9f\x8e\x8f"=>"\xee\x90\xbb",
- "\xf0\x9f\x8e\x87"=>"\xee\x91\x80", "\xf0\x9f\x8e\x90"=>"\xee\x91\x82", "\xf0\x9f\x8e\x83"=>"\xee\x91\x85", "\xf0\x9f\x8e\x8a"=>"[\xe3\x82\xaa\xe3\x83\xa1\xe3\x83\x87\xe3\x83\x88\xe3\x82\xa6]", "\xf0\x9f\x8e\x8b"=>"[\xe4\xb8\x83\xe5\xa4\x95]",
- "\xf0\x9f\x8e\x91"=>"\xee\x91\x86", "\xf0\x9f\x93\x9f"=>"[\xe3\x83\x9d\xe3\x82\xb1\xe3\x83\x99\xe3\x83\xab]", "\xe2\x98\x8e"=>"\xee\x80\x89", "\xf0\x9f\x93\x9e"=>"\xee\x80\x89", "\xf0\x9f\x93\xb1"=>"\xee\x80\x8a",
- "\xf0\x9f\x93\xb2"=>"\xee\x84\x84", "\xf0\x9f\x93\x9d"=>"\xee\x8c\x81", "\xf0\x9f\x93\xa0"=>"\xee\x80\x8b", "\xe2\x9c\x89"=>"\xee\x84\x83", "\xf0\x9f\x93\xa8"=>"\xee\x84\x83",
- "\xf0\x9f\x93\xa9"=>"\xee\x84\x83", "\xf0\x9f\x93\xaa"=>"\xee\x84\x81", "\xf0\x9f\x93\xab"=>"\xee\x84\x81", "\xf0\x9f\x93\xae"=>"\xee\x84\x82", "\xf0\x9f\x93\xb0"=>"[\xe6\x96\xb0\xe8\x81\x9e]",
- "\xf0\x9f\x93\xa2"=>"\xee\x85\x82", "\xf0\x9f\x93\xa3"=>"\xee\x8c\x97", "\xf0\x9f\x93\xa1"=>"\xee\x85\x8b", "\xf0\x9f\x93\xa4"=>"[\xe9\x80\x81\xe4\xbf\xa1BOX]", "\xf0\x9f\x93\xa5"=>"[\xe5\x8f\x97\xe4\xbf\xa1BOX]",
- "\xf0\x9f\x93\xa6"=>"\xee\x84\x92", "\xf0\x9f\x93\xa7"=>"\xee\x84\x83", "\xf0\x9f\x94\xa0"=>"[ABCD]", "\xf0\x9f\x94\xa1"=>"[abcd]", "\xf0\x9f\x94\xa2"=>"[1234]",
- "\xf0\x9f\x94\xa3"=>"[\xe8\xa8\x98\xe5\x8f\xb7]", "\xf0\x9f\x94\xa4"=>"[ABC]", "\xe2\x9c\x92"=>"[\xe3\x83\x9a\xe3\x83\xb3]", "\xf0\x9f\x92\xba"=>"\xee\x84\x9f", "\xf0\x9f\x92\xbb"=>"\xee\x80\x8c",
- "\xe2\x9c\x8f"=>"\xee\x8c\x81", "\xf0\x9f\x93\x8e"=>"[\xe3\x82\xaf\xe3\x83\xaa\xe3\x83\x83\xe3\x83\x97]", "\xf0\x9f\x92\xbc"=>"\xee\x84\x9e", "\xf0\x9f\x92\xbd"=>"\xee\x8c\x96", "\xf0\x9f\x92\xbe"=>"\xee\x8c\x96",
- "\xf0\x9f\x92\xbf"=>"\xee\x84\xa6", "\xf0\x9f\x93\x80"=>"\xee\x84\xa7", "\xe2\x9c\x82"=>"\xee\x8c\x93", "\xf0\x9f\x93\x8d"=>"[\xe7\x94\xbb\xe3\x81\xb3\xe3\x82\x87\xe3\x81\x86]", "\xf0\x9f\x93\x83"=>"\xee\x8c\x81",
- "\xf0\x9f\x93\x84"=>"\xee\x8c\x81", "\xf0\x9f\x93\x85"=>"[\xe3\x82\xab\xe3\x83\xac\xe3\x83\xb3\xe3\x83\x80\xe3\x83\xbc]", "\xf0\x9f\x93\x81"=>"[\xe3\x83\x95\xe3\x82\xa9\xe3\x83\xab\xe3\x83\x80]", "\xf0\x9f\x93\x82"=>"[\xe3\x83\x95\xe3\x82\xa9\xe3\x83\xab\xe3\x83\x80]", "\xf0\x9f\x93\x93"=>"\xee\x85\x88",
- "\xf0\x9f\x93\x96"=>"\xee\x85\x88", "\xf0\x9f\x93\x94"=>"\xee\x85\x88", "\xf0\x9f\x93\x95"=>"\xee\x85\x88", "\xf0\x9f\x93\x97"=>"\xee\x85\x88", "\xf0\x9f\x93\x98"=>"\xee\x85\x88",
- "\xf0\x9f\x93\x99"=>"\xee\x85\x88", "\xf0\x9f\x93\x9a"=>"\xee\x85\x88", "\xf0\x9f\x93\x9b"=>"[\xe5\x90\x8d\xe6\x9c\xad]", "\xf0\x9f\x93\x9c"=>"[\xe3\x82\xb9\xe3\x82\xaf\xe3\x83\xad\xe3\x83\xbc\xe3\x83\xab]", "\xf0\x9f\x93\x8b"=>"\xee\x8c\x81",
- "\xf0\x9f\x93\x86"=>"[\xe3\x82\xab\xe3\x83\xac\xe3\x83\xb3\xe3\x83\x80\xe3\x83\xbc]", "\xf0\x9f\x93\x8a"=>"\xee\x85\x8a", "\xf0\x9f\x93\x88"=>"\xee\x85\x8a", "\xf0\x9f\x93\x89"=>"[\xe3\x82\xb0\xe3\x83\xa9\xe3\x83\x95]", "\xf0\x9f\x93\x87"=>"\xee\x85\x88",
- "\xf0\x9f\x93\x8c"=>"[\xe7\x94\xbb\xe3\x81\xb3\xe3\x82\x87\xe3\x81\x86]", "\xf0\x9f\x93\x92"=>"\xee\x85\x88", "\xf0\x9f\x93\x8f"=>"[\xe5\xae\x9a\xe8\xa6\x8f]", "\xf0\x9f\x93\x90"=>"[\xe4\xb8\x89\xe8\xa7\x92\xe5\xae\x9a\xe8\xa6\x8f]", "\xf0\x9f\x93\x91"=>"\xee\x8c\x81",
- "\xf0\x9f\x8e\xbd"=>"\xe3\x80\x93", "\xe2\x9a\xbe"=>"\xee\x80\x96", "\xe2\x9b\xb3"=>"\xee\x80\x94", "\xf0\x9f\x8e\xbe"=>"\xee\x80\x95", "\xe2\x9a\xbd"=>"\xee\x80\x98",
- "\xf0\x9f\x8e\xbf"=>"\xee\x80\x93", "\xf0\x9f\x8f\x80"=>"\xee\x90\xaa", "\xf0\x9f\x8f\x81"=>"\xee\x84\xb2", "\xf0\x9f\x8f\x82"=>"[\xe3\x82\xb9\xe3\x83\x8e\xe3\x83\x9c]", "\xf0\x9f\x8f\x83"=>"\xee\x84\x95",
- "\xf0\x9f\x8f\x84"=>"\xee\x80\x97", "\xf0\x9f\x8f\x86"=>"\xee\x84\xb1", "\xf0\x9f\x8f\x88"=>"\xee\x90\xab", "\xf0\x9f\x8f\x8a"=>"\xee\x90\xad", "\xf0\x9f\x9a\x83"=>"\xee\x80\x9e",
- "\xf0\x9f\x9a\x87"=>"\xee\x90\xb4", "\xe2\x93\x82"=>"\xee\x90\xb4", "\xf0\x9f\x9a\x84"=>"\xee\x90\xb5", "\xf0\x9f\x9a\x85"=>"\xee\x80\x9f", "\xf0\x9f\x9a\x97"=>"\xee\x80\x9b",
- "\xf0\x9f\x9a\x99"=>"\xee\x90\xae", "\xf0\x9f\x9a\x8c"=>"\xee\x85\x99", "\xf0\x9f\x9a\x8f"=>"\xee\x85\x90", "\xf0\x9f\x9a\xa2"=>"\xee\x88\x82", "\xe2\x9c\x88"=>"\xee\x80\x9d",
- "\xe2\x9b\xb5"=>"\xee\x80\x9c", "\xf0\x9f\x9a\x89"=>"\xee\x80\xb9", "\xf0\x9f\x9a\x80"=>"\xee\x84\x8d", "\xf0\x9f\x9a\xa4"=>"\xee\x84\xb5", "\xf0\x9f\x9a\x95"=>"\xee\x85\x9a",
- "\xf0\x9f\x9a\x9a"=>"\xee\x90\xaf", "\xf0\x9f\x9a\x92"=>"\xee\x90\xb0", "\xf0\x9f\x9a\x91"=>"\xee\x90\xb1", "\xf0\x9f\x9a\x93"=>"\xee\x90\xb2", "\xe2\x9b\xbd"=>"\xee\x80\xba",
- "\xf0\x9f\x85\xbf"=>"\xee\x85\x8f", "\xf0\x9f\x9a\xa5"=>"\xee\x85\x8e", "\xf0\x9f\x9a\xa7"=>"\xee\x84\xb7", "\xf0\x9f\x9a\xa8"=>"\xee\x90\xb2", "\xe2\x99\xa8"=>"\xee\x84\xa3",
- "\xe2\x9b\xba"=>"\xee\x84\xa2", "\xf0\x9f\x8e\xa0"=>"\xe3\x80\x93", "\xf0\x9f\x8e\xa1"=>"\xee\x84\xa4", "\xf0\x9f\x8e\xa2"=>"\xee\x90\xb3", "\xf0\x9f\x8e\xa3"=>"\xee\x80\x99",
- "\xf0\x9f\x8e\xa4"=>"\xee\x80\xbc", "\xf0\x9f\x8e\xa5"=>"\xee\x80\xbd", "\xf0\x9f\x8e\xa6"=>"\xee\x94\x87", "\xf0\x9f\x8e\xa7"=>"\xee\x8c\x8a", "\xf0\x9f\x8e\xa8"=>"\xee\x94\x82",
- "\xf0\x9f\x8e\xa9"=>"\xee\x94\x83", "\xf0\x9f\x8e\xaa"=>"[\xe3\x82\xa4\xe3\x83\x99\xe3\x83\xb3\xe3\x83\x88]", "\xf0\x9f\x8e\xab"=>"\xee\x84\xa5", "\xf0\x9f\x8e\xac"=>"\xee\x8c\xa4", "\xf0\x9f\x8e\xad"=>"\xee\x94\x83",
- "\xf0\x9f\x8e\xae"=>"[\xe3\x82\xb2\xe3\x83\xbc\xe3\x83\xa0]", "\xf0\x9f\x80\x84"=>"\xee\x84\xad", "\xf0\x9f\x8e\xaf"=>"\xee\x84\xb0", "\xf0\x9f\x8e\xb0"=>"\xee\x84\xb3", "\xf0\x9f\x8e\xb1"=>"\xee\x90\xac",
- "\xf0\x9f\x8e\xb2"=>"[\xe3\x82\xb5\xe3\x82\xa4\xe3\x82\xb3\xe3\x83\xad]", "\xf0\x9f\x8e\xb3"=>"[\xe3\x83\x9c\xe3\x83\xbc\xe3\x83\xaa\xe3\x83\xb3\xe3\x82\xb0]", "\xf0\x9f\x8e\xb4"=>"[\xe8\x8a\xb1\xe6\x9c\xad]", "\xf0\x9f\x83\x8f"=>"[\xe3\x82\xb8\xe3\x83\xa7\xe3\x83\xbc\xe3\x82\xab\xe3\x83\xbc]", "\xf0\x9f\x8e\xb5"=>"\xee\x80\xbe",
- "\xf0\x9f\x8e\xb6"=>"\xee\x8c\xa6", "\xf0\x9f\x8e\xb7"=>"\xee\x81\x80", "\xf0\x9f\x8e\xb8"=>"\xee\x81\x81", "\xf0\x9f\x8e\xb9"=>"[\xe3\x83\x94\xe3\x82\xa2\xe3\x83\x8e]", "\xf0\x9f\x8e\xba"=>"\xee\x81\x82",
- "\xf0\x9f\x8e\xbb"=>"[\xe3\x83\x90\xe3\x82\xa4\xe3\x82\xaa\xe3\x83\xaa\xe3\x83\xb3]", "\xf0\x9f\x8e\xbc"=>"\xee\x8c\xa6", "\xe3\x80\xbd"=>"\xee\x84\xac", "\xf0\x9f\x93\xb7"=>"\xee\x80\x88", "\xf0\x9f\x93\xb9"=>"\xee\x80\xbd",
- "\xf0\x9f\x93\xba"=>"\xee\x84\xaa", "\xf0\x9f\x93\xbb"=>"\xee\x84\xa8", "\xf0\x9f\x93\xbc"=>"\xee\x84\xa9", "\xf0\x9f\x92\x8b"=>"\xee\x80\x83", "\xf0\x9f\x92\x8c"=>"\xee\x84\x83\xee\x8c\xa8",
- "\xf0\x9f\x92\x8d"=>"\xee\x80\xb4", "\xf0\x9f\x92\x8e"=>"\xee\x80\xb5", "\xf0\x9f\x92\x8f"=>"\xee\x84\x91", "\xf0\x9f\x92\x90"=>"\xee\x8c\x86", "\xf0\x9f\x92\x91"=>"\xee\x90\xa5",
- "\xf0\x9f\x92\x92"=>"\xee\x90\xbd", "\xf0\x9f\x94\x9e"=>"\xee\x88\x87", "\xc2\xa9"=>"\xee\x89\x8e", "\xc2\xae"=>"\xee\x89\x8f", "\xe2\x84\xa2"=>"\xee\x94\xb7",
- "\xe2\x84\xb9"=>"[\xef\xbd\x89]", "#\xe2\x83\xa3"=>"\xee\x88\x90", "1\xe2\x83\xa3"=>"\xee\x88\x9c", "2\xe2\x83\xa3"=>"\xee\x88\x9d", "3\xe2\x83\xa3"=>"\xee\x88\x9e",
- "4\xe2\x83\xa3"=>"\xee\x88\x9f", "5\xe2\x83\xa3"=>"\xee\x88\xa0", "6\xe2\x83\xa3"=>"\xee\x88\xa1", "7\xe2\x83\xa3"=>"\xee\x88\xa2", "8\xe2\x83\xa3"=>"\xee\x88\xa3",
- "9\xe2\x83\xa3"=>"\xee\x88\xa4", "0\xe2\x83\xa3"=>"\xee\x88\xa5", "\xf0\x9f\x94\x9f"=>"[10]", "\xf0\x9f\x93\xb6"=>"\xee\x88\x8b", "\xf0\x9f\x93\xb3"=>"\xee\x89\x90",
- "\xf0\x9f\x93\xb4"=>"\xee\x89\x91", "\xf0\x9f\x8d\x94"=>"\xee\x84\xa0", "\xf0\x9f\x8d\x99"=>"\xee\x8d\x82", "\xf0\x9f\x8d\xb0"=>"\xee\x81\x86", "\xf0\x9f\x8d\x9c"=>"\xee\x8d\x80",
- "\xf0\x9f\x8d\x9e"=>"\xee\x8c\xb9", "\xf0\x9f\x8d\xb3"=>"\xee\x85\x87", "\xf0\x9f\x8d\xa6"=>"\xee\x8c\xba", "\xf0\x9f\x8d\x9f"=>"\xee\x8c\xbb", "\xf0\x9f\x8d\xa1"=>"\xee\x8c\xbc",
- "\xf0\x9f\x8d\x98"=>"\xee\x8c\xbd", "\xf0\x9f\x8d\x9a"=>"\xee\x8c\xbe", "\xf0\x9f\x8d\x9d"=>"\xee\x8c\xbf", "\xf0\x9f\x8d\x9b"=>"\xee\x8d\x81", "\xf0\x9f\x8d\xa2"=>"\xee\x8d\x83",
- "\xf0\x9f\x8d\xa3"=>"\xee\x8d\x84", "\xf0\x9f\x8d\xb1"=>"\xee\x8d\x8c", "\xf0\x9f\x8d\xb2"=>"\xee\x8d\x8d", "\xf0\x9f\x8d\xa7"=>"\xee\x90\xbf", "\xf0\x9f\x8d\x96"=>"[\xe8\x82\x89]",
- "\xf0\x9f\x8d\xa5"=>"[\xe3\x81\xaa\xe3\x82\x8b\xe3\x81\xa8]", "\xf0\x9f\x8d\xa0"=>"[\xe3\x82\x84\xe3\x81\x8d\xe3\x81\x84\xe3\x82\x82]", "\xf0\x9f\x8d\x95"=>"[\xe3\x83\x94\xe3\x82\xb6]", "\xf0\x9f\x8d\x97"=>"[\xe3\x83\x81\xe3\x82\xad\xe3\x83\xb3]", "\xf0\x9f\x8d\xa8"=>"[\xe3\x82\xa2\xe3\x82\xa4\xe3\x82\xb9\xe3\x82\xaf\xe3\x83\xaa\xe3\x83\xbc\xe3\x83\xa0]",
- "\xf0\x9f\x8d\xa9"=>"[\xe3\x83\x89\xe3\x83\xbc\xe3\x83\x8a\xe3\x83\x84]", "\xf0\x9f\x8d\xaa"=>"[\xe3\x82\xaf\xe3\x83\x83\xe3\x82\xad\xe3\x83\xbc]", "\xf0\x9f\x8d\xab"=>"[\xe3\x83\x81\xe3\x83\xa7\xe3\x82\xb3]", "\xf0\x9f\x8d\xac"=>"[\xe3\x82\xad\xe3\x83\xa3\xe3\x83\xb3\xe3\x83\x87\xe3\x82\xa3]", "\xf0\x9f\x8d\xad"=>"[\xe3\x82\xad\xe3\x83\xa3\xe3\x83\xb3\xe3\x83\x87\xe3\x82\xa3]",
- "\xf0\x9f\x8d\xae"=>"[\xe3\x83\x97\xe3\x83\xaa\xe3\x83\xb3]", "\xf0\x9f\x8d\xaf"=>"[\xe3\x83\x8f\xe3\x83\x81\xe3\x83\x9f\xe3\x83\x84]", "\xf0\x9f\x8d\xa4"=>"[\xe3\x82\xa8\xe3\x83\x93\xe3\x83\x95\xe3\x83\xa9\xe3\x82\xa4]", "\xf0\x9f\x8d\xb4"=>"\xee\x81\x83", "\xe2\x98\x95"=>"\xee\x81\x85",
- "\xf0\x9f\x8d\xb8"=>"\xee\x81\x84", "\xf0\x9f\x8d\xba"=>"\xee\x81\x87", "\xf0\x9f\x8d\xb5"=>"\xee\x8c\xb8", "\xf0\x9f\x8d\xb6"=>"\xee\x8c\x8b", "\xf0\x9f\x8d\xb7"=>"\xee\x81\x84",
- "\xf0\x9f\x8d\xbb"=>"\xee\x8c\x8c", "\xf0\x9f\x8d\xb9"=>"\xee\x81\x84", "\xe2\x86\x97"=>"\xee\x88\xb6", "\xe2\x86\x98"=>"\xee\x88\xb8", "\xe2\x86\x96"=>"\xee\x88\xb7",
- "\xe2\x86\x99"=>"\xee\x88\xb9", "\xe2\xa4\xb4"=>"\xee\x88\xb6", "\xe2\xa4\xb5"=>"\xee\x88\xb8", "\xe2\x86\x94"=>"\xe2\x87\x94", "\xe2\x86\x95"=>"\xe2\x86\x91\xe2\x86\x93",
- "\xe2\xac\x86"=>"\xee\x88\xb2", "\xe2\xac\x87"=>"\xee\x88\xb3", "\xe2\x9e\xa1"=>"\xee\x88\xb4", "\xe2\xac\x85"=>"\xee\x88\xb5", "\xe2\x96\xb6"=>"\xee\x88\xba",
- "\xe2\x97\x80"=>"\xee\x88\xbb", "\xe2\x8f\xa9"=>"\xee\x88\xbc", "\xe2\x8f\xaa"=>"\xee\x88\xbd", "\xe2\x8f\xab"=>"\xe2\x96\xb2", "\xe2\x8f\xac"=>"\xe2\x96\xbc",
- "\xf0\x9f\x94\xba"=>"\xe2\x96\xb2", "\xf0\x9f\x94\xbb"=>"\xe2\x96\xbc", "\xf0\x9f\x94\xbc"=>"\xe2\x96\xb2", "\xf0\x9f\x94\xbd"=>"\xe2\x96\xbc", "\xe2\xad\x95"=>"\xee\x8c\xb2",
- "\xe2\x9d\x8c"=>"\xee\x8c\xb3", "\xe2\x9d\x8e"=>"\xee\x8c\xb3", "\xe2\x9d\x97"=>"\xee\x80\xa1", "\xe2\x81\x89"=>"\xef\xbc\x81\xef\xbc\x9f", "\xe2\x80\xbc"=>"\xef\xbc\x81\xef\xbc\x81",
- "\xe2\x9d\x93"=>"\xee\x80\xa0", "\xe2\x9d\x94"=>"\xee\x8c\xb6", "\xe2\x9d\x95"=>"\xee\x8c\xb7", "\xe3\x80\xb0"=>"\xe3\x80\x93", "\xe2\x9e\xb0"=>"\xef\xbd\x9e",
- "\xe2\x9e\xbf"=>"\xee\x88\x91", "\xe2\x9d\xa4"=>"\xee\x80\xa2", "\xf0\x9f\x92\x93"=>"\xee\x8c\xa7", "\xf0\x9f\x92\x94"=>"\xee\x80\xa3", "\xf0\x9f\x92\x95"=>"\xee\x8c\xa7",
- "\xf0\x9f\x92\x96"=>"\xee\x8c\xa7", "\xf0\x9f\x92\x97"=>"\xee\x8c\xa8", "\xf0\x9f\x92\x98"=>"\xee\x8c\xa9", "\xf0\x9f\x92\x99"=>"\xee\x8c\xaa", "\xf0\x9f\x92\x9a"=>"\xee\x8c\xab",
- "\xf0\x9f\x92\x9b"=>"\xee\x8c\xac", "\xf0\x9f\x92\x9c"=>"\xee\x8c\xad", "\xf0\x9f\x92\x9d"=>"\xee\x90\xb7", "\xf0\x9f\x92\x9e"=>"\xee\x8c\xa7", "\xf0\x9f\x92\x9f"=>"\xee\x88\x84",
- "\xe2\x99\xa5"=>"\xee\x88\x8c", "\xe2\x99\xa0"=>"\xee\x88\x8e", "\xe2\x99\xa6"=>"\xee\x88\x8d", "\xe2\x99\xa3"=>"\xee\x88\x8f", "\xf0\x9f\x9a\xac"=>"\xee\x8c\x8e",
- "\xf0\x9f\x9a\xad"=>"\xee\x88\x88", "\xe2\x99\xbf"=>"\xee\x88\x8a", "\xf0\x9f\x9a\xa9"=>"[\xe6\x97\x97]", "\xe2\x9a\xa0"=>"\xee\x89\x92", "\xe2\x9b\x94"=>"\xee\x84\xb7",
- "\xe2\x99\xbb"=>"\xe2\x86\x91\xe2\x86\x93", "\xf0\x9f\x9a\xb2"=>"\xee\x84\xb6", "\xf0\x9f\x9a\xb6"=>"\xee\x88\x81", "\xf0\x9f\x9a\xb9"=>"\xee\x84\xb8", "\xf0\x9f\x9a\xba"=>"\xee\x84\xb9",
- "\xf0\x9f\x9b\x80"=>"\xee\x84\xbf", "\xf0\x9f\x9a\xbb"=>"\xee\x85\x91", "\xf0\x9f\x9a\xbd"=>"\xee\x85\x80", "\xf0\x9f\x9a\xbe"=>"\xee\x8c\x89", "\xf0\x9f\x9a\xbc"=>"\xee\x84\xba",
- "\xf0\x9f\x9a\xaa"=>"[\xe3\x83\x89\xe3\x82\xa2]", "\xf0\x9f\x9a\xab"=>"[\xe7\xa6\x81\xe6\xad\xa2]", "\xe2\x9c\x94"=>"[\xe3\x83\x81\xe3\x82\xa7\xe3\x83\x83\xe3\x82\xaf\xe3\x83\x9e\xe3\x83\xbc\xe3\x82\xaf]", "\xf0\x9f\x86\x91"=>"[CL]", "\xf0\x9f\x86\x92"=>"\xee\x88\x94",
- "\xf0\x9f\x86\x93"=>"[FREE]", "\xf0\x9f\x86\x94"=>"\xee\x88\xa9", "\xf0\x9f\x86\x95"=>"\xee\x88\x92", "\xf0\x9f\x86\x96"=>"[NG]", "\xf0\x9f\x86\x97"=>"\xee\x89\x8d",
- "\xf0\x9f\x86\x98"=>"[SOS]", "\xf0\x9f\x86\x99"=>"\xee\x88\x93", "\xf0\x9f\x86\x9a"=>"\xee\x84\xae", "\xf0\x9f\x88\x81"=>"\xee\x88\x83", "\xf0\x9f\x88\x82"=>"\xee\x88\xa8",
- "\xf0\x9f\x88\xb2"=>"[\xe7\xa6\x81]", "\xf0\x9f\x88\xb3"=>"\xee\x88\xab", "\xf0\x9f\x88\xb4"=>"[\xe5\x90\x88]", "\xf0\x9f\x88\xb5"=>"\xee\x88\xaa", "\xf0\x9f\x88\xb6"=>"\xee\x88\x95",
- "\xf0\x9f\x88\x9a"=>"\xee\x88\x96", "\xf0\x9f\x88\xb7"=>"\xee\x88\x97", "\xf0\x9f\x88\xb8"=>"\xee\x88\x98", "\xf0\x9f\x88\xb9"=>"\xee\x88\xa7", "\xf0\x9f\x88\xaf"=>"\xee\x88\xac",
- "\xf0\x9f\x88\xba"=>"\xee\x88\xad", "\xe3\x8a\x99"=>"\xee\x8c\x95", "\xe3\x8a\x97"=>"\xee\x8c\x8d", "\xf0\x9f\x89\x90"=>"\xee\x88\xa6", "\xf0\x9f\x89\x91"=>"[\xe5\x8f\xaf]",
- "\xe2\x9e\x95"=>"[\xef\xbc\x8b]", "\xe2\x9e\x96"=>"[\xef\xbc\x8d]", "\xe2\x9c\x96"=>"\xee\x8c\xb3", "\xe2\x9e\x97"=>"[\xc3\xb7]", "\xf0\x9f\x92\xa0"=>"\xe3\x80\x93",
- "\xf0\x9f\x92\xa1"=>"\xee\x84\x8f", "\xf0\x9f\x92\xa2"=>"\xee\x8c\xb4", "\xf0\x9f\x92\xa3"=>"\xee\x8c\x91", "\xf0\x9f\x92\xa4"=>"\xee\x84\xbc", "\xf0\x9f\x92\xa5"=>"[\xe3\x83\x89\xe3\x83\xb3\xe3\x83\x83]",
- "\xf0\x9f\x92\xa6"=>"\xee\x8c\xb1", "\xf0\x9f\x92\xa7"=>"\xee\x8c\xb1", "\xf0\x9f\x92\xa8"=>"\xee\x8c\xb0", "\xf0\x9f\x92\xa9"=>"\xee\x81\x9a", "\xf0\x9f\x92\xaa"=>"\xee\x85\x8c",
- "\xf0\x9f\x92\xab"=>"\xee\x90\x87", "\xf0\x9f\x92\xac"=>"[\xe3\x83\x95\xe3\x82\xad\xe3\x83\x80\xe3\x82\xb7]", "\xe2\x9c\xa8"=>"\xee\x8c\xae", "\xe2\x9c\xb4"=>"\xee\x88\x85", "\xe2\x9c\xb3"=>"\xee\x88\x86",
- "\xe2\x9a\xaa"=>"\xee\x88\x99", "\xe2\x9a\xab"=>"\xee\x88\x99", "\xf0\x9f\x94\xb4"=>"\xee\x88\x99", "\xf0\x9f\x94\xb5"=>"\xee\x88\x9a", "\xf0\x9f\x94\xb2"=>"\xee\x88\x9a",
- "\xf0\x9f\x94\xb3"=>"\xee\x88\x9b", "\xe2\xad\x90"=>"\xee\x8c\xaf", "\xe2\xac\x9c"=>"\xee\x88\x9b", "\xe2\xac\x9b"=>"\xee\x88\x9a", "\xe2\x96\xab"=>"\xee\x88\x9b",
- "\xe2\x96\xaa"=>"\xee\x88\x9a", "\xe2\x97\xbd"=>"\xee\x88\x9b", "\xe2\x97\xbe"=>"\xee\x88\x9a", "\xe2\x97\xbb"=>"\xee\x88\x9b", "\xe2\x97\xbc"=>"\xee\x88\x9a",
- "\xf0\x9f\x94\xb6"=>"\xee\x88\x9b", "\xf0\x9f\x94\xb7"=>"\xee\x88\x9b", "\xf0\x9f\x94\xb8"=>"\xee\x88\x9b", "\xf0\x9f\x94\xb9"=>"\xee\x88\x9b", "\xe2\x9d\x87"=>"\xee\x8c\xae",
- "\xf0\x9f\x92\xae"=>"[\xe8\x8a\xb1\xe4\xb8\xb8]", "\xf0\x9f\x92\xaf"=>"[100\xe7\x82\xb9]", "\xe2\x86\xa9"=>"\xe2\x86\x90\xe2\x94\x98", "\xe2\x86\xaa"=>"\xe2\x94\x94\xe2\x86\x92", "\xf0\x9f\x94\x83"=>"\xe2\x86\x91\xe2\x86\x93",
- "\xf0\x9f\x94\x8a"=>"\xee\x85\x81", "\xf0\x9f\x94\x8b"=>"[\xe9\x9b\xbb\xe6\xb1\xa0]", "\xf0\x9f\x94\x8c"=>"[\xe3\x82\xb3\xe3\x83\xb3\xe3\x82\xbb\xe3\x83\xb3\xe3\x83\x88]", "\xf0\x9f\x94\x8d"=>"\xee\x84\x94", "\xf0\x9f\x94\x8e"=>"\xee\x84\x94",
- "\xf0\x9f\x94\x92"=>"\xee\x85\x84", "\xf0\x9f\x94\x93"=>"\xee\x85\x85", "\xf0\x9f\x94\x8f"=>"\xee\x85\x84", "\xf0\x9f\x94\x90"=>"\xee\x85\x84", "\xf0\x9f\x94\x91"=>"\xee\x80\xbf",
- "\xf0\x9f\x94\x94"=>"\xee\x8c\xa5", "\xe2\x98\x91"=>"[\xe3\x83\x81\xe3\x82\xa7\xe3\x83\x83\xe3\x82\xaf\xe3\x83\x9e\xe3\x83\xbc\xe3\x82\xaf]", "\xf0\x9f\x94\x98"=>"[\xe3\x83\xa9\xe3\x82\xb8\xe3\x82\xaa\xe3\x83\x9c\xe3\x82\xbf\xe3\x83\xb3]", "\xf0\x9f\x94\x96"=>"[\xe3\x83\x96\xe3\x83\x83\xe3\x82\xaf\xe3\x83\x9e\xe3\x83\xbc\xe3\x82\xaf]", "\xf0\x9f\x94\x97"=>"[\xe3\x83\xaa\xe3\x83\xb3\xe3\x82\xaf]",
- "\xf0\x9f\x94\x99"=>"\xee\x88\xb5", "\xf0\x9f\x94\x9a"=>"[end]", "\xf0\x9f\x94\x9b"=>"[ON]", "\xf0\x9f\x94\x9c"=>"[SOON]", "\xf0\x9f\x94\x9d"=>"\xee\x89\x8c",
- "\xe2\x9c\x85"=>"[\xe3\x83\x81\xe3\x82\xa7\xe3\x83\x83\xe3\x82\xaf\xe3\x83\x9e\xe3\x83\xbc\xe3\x82\xaf]", "\xe2\x9c\x8a"=>"\xee\x80\x90", "\xe2\x9c\x8b"=>"\xee\x80\x92", "\xe2\x9c\x8c"=>"\xee\x80\x91", "\xf0\x9f\x91\x8a"=>"\xee\x80\x8d",
- "\xf0\x9f\x91\x8d"=>"\xee\x80\x8e", "\xe2\x98\x9d"=>"\xee\x80\x8f", "\xf0\x9f\x91\x86"=>"\xee\x88\xae", "\xf0\x9f\x91\x87"=>"\xee\x88\xaf", "\xf0\x9f\x91\x88"=>"\xee\x88\xb0",
- "\xf0\x9f\x91\x89"=>"\xee\x88\xb1", "\xf0\x9f\x91\x8b"=>"\xee\x90\x9e", "\xf0\x9f\x91\x8f"=>"\xee\x90\x9f", "\xf0\x9f\x91\x8c"=>"\xee\x90\xa0", "\xf0\x9f\x91\x8e"=>"\xee\x90\xa1",
- "\xf0\x9f\x91\x90"=>"\xee\x90\xa2",
- ),
- 'unified_to_google' => array(
- "\xe2\x98\x80"=>"\xf3\xbe\x80\x80", "\xe2\x98\x81"=>"\xf3\xbe\x80\x81", "\xe2\x98\x94"=>"\xf3\xbe\x80\x82", "\xe2\x9b\x84"=>"\xf3\xbe\x80\x83",
- "\xe2\x9a\xa1"=>"\xf3\xbe\x80\x84", "\xf0\x9f\x8c\x80"=>"\xf3\xbe\x80\x85", "\xf0\x9f\x8c\x81"=>"\xf3\xbe\x80\x86", "\xf0\x9f\x8c\x82"=>"\xf3\xbe\x80\x87", "\xf0\x9f\x8c\x83"=>"\xf3\xbe\x80\x88",
- "\xf0\x9f\x8c\x84"=>"\xf3\xbe\x80\x89", "\xf0\x9f\x8c\x85"=>"\xf3\xbe\x80\x8a", "\xf0\x9f\x8c\x86"=>"\xf3\xbe\x80\x8b", "\xf0\x9f\x8c\x87"=>"\xf3\xbe\x80\x8c", "\xf0\x9f\x8c\x88"=>"\xf3\xbe\x80\x8d",
- "\xe2\x9d\x84"=>"\xf3\xbe\x80\x8e", "\xe2\x9b\x85"=>"\xf3\xbe\x80\x8f", "\xf0\x9f\x8c\x89"=>"\xf3\xbe\x80\x90", "\xf0\x9f\x8c\x8a"=>"\xf3\xbe\x80\xb8", "\xf0\x9f\x8c\x8b"=>"\xf3\xbe\x80\xba",
- "\xf0\x9f\x8c\x8c"=>"\xf3\xbe\x80\xbb", "\xf0\x9f\x8c\x8f"=>"\xf3\xbe\x80\xb9", "\xf0\x9f\x8c\x91"=>"\xf3\xbe\x80\x91", "\xf0\x9f\x8c\x94"=>"\xf3\xbe\x80\x92", "\xf0\x9f\x8c\x93"=>"\xf3\xbe\x80\x93",
- "\xf0\x9f\x8c\x99"=>"\xf3\xbe\x80\x94", "\xf0\x9f\x8c\x95"=>"\xf3\xbe\x80\x95", "\xf0\x9f\x8c\x9b"=>"\xf3\xbe\x80\x96", "\xf0\x9f\x8c\x9f"=>"\xf3\xbe\xad\xa9", "\xf0\x9f\x8c\xa0"=>"\xf3\xbe\xad\xaa",
- "\xf0\x9f\x95\x90"=>"\xf3\xbe\x80\x9e", "\xf0\x9f\x95\x91"=>"\xf3\xbe\x80\x9f", "\xf0\x9f\x95\x92"=>"\xf3\xbe\x80\xa0", "\xf0\x9f\x95\x93"=>"\xf3\xbe\x80\xa1", "\xf0\x9f\x95\x94"=>"\xf3\xbe\x80\xa2",
- "\xf0\x9f\x95\x95"=>"\xf3\xbe\x80\xa3", "\xf0\x9f\x95\x96"=>"\xf3\xbe\x80\xa4", "\xf0\x9f\x95\x97"=>"\xf3\xbe\x80\xa5", "\xf0\x9f\x95\x98"=>"\xf3\xbe\x80\xa6", "\xf0\x9f\x95\x99"=>"\xf3\xbe\x80\xa7",
- "\xf0\x9f\x95\x9a"=>"\xf3\xbe\x80\xa8", "\xf0\x9f\x95\x9b"=>"\xf3\xbe\x80\xa9", "\xe2\x8c\x9a"=>"\xf3\xbe\x80\x9d", "\xe2\x8c\x9b"=>"\xf3\xbe\x80\x9c", "\xe2\x8f\xb0"=>"\xf3\xbe\x80\xaa",
- "\xe2\x8f\xb3"=>"\xf3\xbe\x80\x9b", "\xe2\x99\x88"=>"\xf3\xbe\x80\xab", "\xe2\x99\x89"=>"\xf3\xbe\x80\xac", "\xe2\x99\x8a"=>"\xf3\xbe\x80\xad", "\xe2\x99\x8b"=>"\xf3\xbe\x80\xae",
- "\xe2\x99\x8c"=>"\xf3\xbe\x80\xaf", "\xe2\x99\x8d"=>"\xf3\xbe\x80\xb0", "\xe2\x99\x8e"=>"\xf3\xbe\x80\xb1", "\xe2\x99\x8f"=>"\xf3\xbe\x80\xb2", "\xe2\x99\x90"=>"\xf3\xbe\x80\xb3",
- "\xe2\x99\x91"=>"\xf3\xbe\x80\xb4", "\xe2\x99\x92"=>"\xf3\xbe\x80\xb5", "\xe2\x99\x93"=>"\xf3\xbe\x80\xb6", "\xe2\x9b\x8e"=>"\xf3\xbe\x80\xb7", "\xf0\x9f\x8d\x80"=>"\xf3\xbe\x80\xbc",
- "\xf0\x9f\x8c\xb7"=>"\xf3\xbe\x80\xbd", "\xf0\x9f\x8c\xb1"=>"\xf3\xbe\x80\xbe", "\xf0\x9f\x8d\x81"=>"\xf3\xbe\x80\xbf", "\xf0\x9f\x8c\xb8"=>"\xf3\xbe\x81\x80", "\xf0\x9f\x8c\xb9"=>"\xf3\xbe\x81\x81",
- "\xf0\x9f\x8d\x82"=>"\xf3\xbe\x81\x82", "\xf0\x9f\x8d\x83"=>"\xf3\xbe\x81\x83", "\xf0\x9f\x8c\xba"=>"\xf3\xbe\x81\x85", "\xf0\x9f\x8c\xbb"=>"\xf3\xbe\x81\x86", "\xf0\x9f\x8c\xb4"=>"\xf3\xbe\x81\x87",
- "\xf0\x9f\x8c\xb5"=>"\xf3\xbe\x81\x88", "\xf0\x9f\x8c\xbe"=>"\xf3\xbe\x81\x89", "\xf0\x9f\x8c\xbd"=>"\xf3\xbe\x81\x8a", "\xf0\x9f\x8d\x84"=>"\xf3\xbe\x81\x8b", "\xf0\x9f\x8c\xb0"=>"\xf3\xbe\x81\x8c",
- "\xf0\x9f\x8c\xbc"=>"\xf3\xbe\x81\x8d", "\xf0\x9f\x8c\xbf"=>"\xf3\xbe\x81\x8e", "\xf0\x9f\x8d\x92"=>"\xf3\xbe\x81\x8f", "\xf0\x9f\x8d\x8c"=>"\xf3\xbe\x81\x90", "\xf0\x9f\x8d\x8e"=>"\xf3\xbe\x81\x91",
- "\xf0\x9f\x8d\x8a"=>"\xf3\xbe\x81\x92", "\xf0\x9f\x8d\x93"=>"\xf3\xbe\x81\x93", "\xf0\x9f\x8d\x89"=>"\xf3\xbe\x81\x94", "\xf0\x9f\x8d\x85"=>"\xf3\xbe\x81\x95", "\xf0\x9f\x8d\x86"=>"\xf3\xbe\x81\x96",
- "\xf0\x9f\x8d\x88"=>"\xf3\xbe\x81\x97", "\xf0\x9f\x8d\x8d"=>"\xf3\xbe\x81\x98", "\xf0\x9f\x8d\x87"=>"\xf3\xbe\x81\x99", "\xf0\x9f\x8d\x91"=>"\xf3\xbe\x81\x9a", "\xf0\x9f\x8d\x8f"=>"\xf3\xbe\x81\x9b",
- "\xf0\x9f\x91\x80"=>"\xf3\xbe\x86\x90", "\xf0\x9f\x91\x82"=>"\xf3\xbe\x86\x91", "\xf0\x9f\x91\x83"=>"\xf3\xbe\x86\x92", "\xf0\x9f\x91\x84"=>"\xf3\xbe\x86\x93", "\xf0\x9f\x91\x85"=>"\xf3\xbe\x86\x94",
- "\xf0\x9f\x92\x84"=>"\xf3\xbe\x86\x95", "\xf0\x9f\x92\x85"=>"\xf3\xbe\x86\x96", "\xf0\x9f\x92\x86"=>"\xf3\xbe\x86\x97", "\xf0\x9f\x92\x87"=>"\xf3\xbe\x86\x98", "\xf0\x9f\x92\x88"=>"\xf3\xbe\x86\x99",
- "\xf0\x9f\x91\xa4"=>"\xf3\xbe\x86\x9a", "\xf0\x9f\x91\xa6"=>"\xf3\xbe\x86\x9b", "\xf0\x9f\x91\xa7"=>"\xf3\xbe\x86\x9c", "\xf0\x9f\x91\xa8"=>"\xf3\xbe\x86\x9d", "\xf0\x9f\x91\xa9"=>"\xf3\xbe\x86\x9e",
- "\xf0\x9f\x91\xaa"=>"\xf3\xbe\x86\x9f", "\xf0\x9f\x91\xab"=>"\xf3\xbe\x86\xa0", "\xf0\x9f\x91\xae"=>"\xf3\xbe\x86\xa1", "\xf0\x9f\x91\xaf"=>"\xf3\xbe\x86\xa2", "\xf0\x9f\x91\xb0"=>"\xf3\xbe\x86\xa3",
- "\xf0\x9f\x91\xb1"=>"\xf3\xbe\x86\xa4", "\xf0\x9f\x91\xb2"=>"\xf3\xbe\x86\xa5", "\xf0\x9f\x91\xb3"=>"\xf3\xbe\x86\xa6", "\xf0\x9f\x91\xb4"=>"\xf3\xbe\x86\xa7", "\xf0\x9f\x91\xb5"=>"\xf3\xbe\x86\xa8",
- "\xf0\x9f\x91\xb6"=>"\xf3\xbe\x86\xa9", "\xf0\x9f\x91\xb7"=>"\xf3\xbe\x86\xaa", "\xf0\x9f\x91\xb8"=>"\xf3\xbe\x86\xab", "\xf0\x9f\x91\xb9"=>"\xf3\xbe\x86\xac", "\xf0\x9f\x91\xba"=>"\xf3\xbe\x86\xad",
- "\xf0\x9f\x91\xbb"=>"\xf3\xbe\x86\xae", "\xf0\x9f\x91\xbc"=>"\xf3\xbe\x86\xaf", "\xf0\x9f\x91\xbd"=>"\xf3\xbe\x86\xb0", "\xf0\x9f\x91\xbe"=>"\xf3\xbe\x86\xb1", "\xf0\x9f\x91\xbf"=>"\xf3\xbe\x86\xb2",
- "\xf0\x9f\x92\x80"=>"\xf3\xbe\x86\xb3", "\xf0\x9f\x92\x81"=>"\xf3\xbe\x86\xb4", "\xf0\x9f\x92\x82"=>"\xf3\xbe\x86\xb5", "\xf0\x9f\x92\x83"=>"\xf3\xbe\x86\xb6", "\xf0\x9f\x90\x8c"=>"\xf3\xbe\x86\xb9",
- "\xf0\x9f\x90\x8d"=>"\xf3\xbe\x87\x93", "\xf0\x9f\x90\x8e"=>"\xf3\xbe\x9f\x9c", "\xf0\x9f\x90\x94"=>"\xf3\xbe\x87\x94", "\xf0\x9f\x90\x97"=>"\xf3\xbe\x87\x95", "\xf0\x9f\x90\xab"=>"\xf3\xbe\x87\x96",
- "\xf0\x9f\x90\x98"=>"\xf3\xbe\x87\x8c", "\xf0\x9f\x90\xa8"=>"\xf3\xbe\x87\x8d", "\xf0\x9f\x90\x92"=>"\xf3\xbe\x87\x8e", "\xf0\x9f\x90\x91"=>"\xf3\xbe\x87\x8f", "\xf0\x9f\x90\x99"=>"\xf3\xbe\x87\x85",
- "\xf0\x9f\x90\x9a"=>"\xf3\xbe\x87\x86", "\xf0\x9f\x90\x9b"=>"\xf3\xbe\x87\x8b", "\xf0\x9f\x90\x9c"=>"\xf3\xbe\x87\x9a", "\xf0\x9f\x90\x9d"=>"\xf3\xbe\x87\xa1", "\xf0\x9f\x90\x9e"=>"\xf3\xbe\x87\xa2",
- "\xf0\x9f\x90\xa0"=>"\xf3\xbe\x87\x89", "\xf0\x9f\x90\xa1"=>"\xf3\xbe\x87\x99", "\xf0\x9f\x90\xa2"=>"\xf3\xbe\x87\x9c", "\xf0\x9f\x90\xa4"=>"\xf3\xbe\x86\xba", "\xf0\x9f\x90\xa5"=>"\xf3\xbe\x86\xbb",
- "\xf0\x9f\x90\xa6"=>"\xf3\xbe\x87\x88", "\xf0\x9f\x90\xa3"=>"\xf3\xbe\x87\x9d", "\xf0\x9f\x90\xa7"=>"\xf3\xbe\x86\xbc", "\xf0\x9f\x90\xa9"=>"\xf3\xbe\x87\x98", "\xf0\x9f\x90\x9f"=>"\xf3\xbe\x86\xbd",
- "\xf0\x9f\x90\xac"=>"\xf3\xbe\x87\x87", "\xf0\x9f\x90\xad"=>"\xf3\xbe\x87\x82", "\xf0\x9f\x90\xaf"=>"\xf3\xbe\x87\x80", "\xf0\x9f\x90\xb1"=>"\xf3\xbe\x86\xb8", "\xf0\x9f\x90\xb3"=>"\xf3\xbe\x87\x83",
- "\xf0\x9f\x90\xb4"=>"\xf3\xbe\x86\xbe", "\xf0\x9f\x90\xb5"=>"\xf3\xbe\x87\x84", "\xf0\x9f\x90\xb6"=>"\xf3\xbe\x86\xb7", "\xf0\x9f\x90\xb7"=>"\xf3\xbe\x86\xbf", "\xf0\x9f\x90\xbb"=>"\xf3\xbe\x87\x81",
- "\xf0\x9f\x90\xb9"=>"\xf3\xbe\x87\x8a", "\xf0\x9f\x90\xba"=>"\xf3\xbe\x87\x90", "\xf0\x9f\x90\xae"=>"\xf3\xbe\x87\x91", "\xf0\x9f\x90\xb0"=>"\xf3\xbe\x87\x92", "\xf0\x9f\x90\xb8"=>"\xf3\xbe\x87\x97",
- "\xf0\x9f\x90\xbe"=>"\xf3\xbe\x87\x9b", "\xf0\x9f\x90\xb2"=>"\xf3\xbe\x87\x9e", "\xf0\x9f\x90\xbc"=>"\xf3\xbe\x87\x9f", "\xf0\x9f\x90\xbd"=>"\xf3\xbe\x87\xa0", "\xf0\x9f\x98\xa0"=>"\xf3\xbe\x8c\xa0",
- "\xf0\x9f\x98\xa9"=>"\xf3\xbe\x8c\xa1", "\xf0\x9f\x98\xb2"=>"\xf3\xbe\x8c\xa2", "\xf0\x9f\x98\x9e"=>"\xf3\xbe\x8c\xa3", "\xf0\x9f\x98\xb5"=>"\xf3\xbe\x8c\xa4", "\xf0\x9f\x98\xb0"=>"\xf3\xbe\x8c\xa5",
- "\xf0\x9f\x98\x92"=>"\xf3\xbe\x8c\xa6", "\xf0\x9f\x98\x8d"=>"\xf3\xbe\x8c\xa7", "\xf0\x9f\x98\xa4"=>"\xf3\xbe\x8c\xa8", "\xf0\x9f\x98\x9c"=>"\xf3\xbe\x8c\xa9", "\xf0\x9f\x98\x9d"=>"\xf3\xbe\x8c\xaa",
- "\xf0\x9f\x98\x8b"=>"\xf3\xbe\x8c\xab", "\xf0\x9f\x98\x98"=>"\xf3\xbe\x8c\xac", "\xf0\x9f\x98\x9a"=>"\xf3\xbe\x8c\xad", "\xf0\x9f\x98\xb7"=>"\xf3\xbe\x8c\xae", "\xf0\x9f\x98\xb3"=>"\xf3\xbe\x8c\xaf",
- "\xf0\x9f\x98\x83"=>"\xf3\xbe\x8c\xb0", "\xf0\x9f\x98\x85"=>"\xf3\xbe\x8c\xb1", "\xf0\x9f\x98\x86"=>"\xf3\xbe\x8c\xb2", "\xf0\x9f\x98\x81"=>"\xf3\xbe\x8c\xb3", "\xf0\x9f\x98\x82"=>"\xf3\xbe\x8c\xb4",
- "\xf0\x9f\x98\x8a"=>"\xf3\xbe\x8c\xb5", "\xe2\x98\xba"=>"\xf3\xbe\x8c\xb6", "\xf0\x9f\x98\x84"=>"\xf3\xbe\x8c\xb8", "\xf0\x9f\x98\xa2"=>"\xf3\xbe\x8c\xb9", "\xf0\x9f\x98\xad"=>"\xf3\xbe\x8c\xba",
- "\xf0\x9f\x98\xa8"=>"\xf3\xbe\x8c\xbb", "\xf0\x9f\x98\xa3"=>"\xf3\xbe\x8c\xbc", "\xf0\x9f\x98\xa1"=>"\xf3\xbe\x8c\xbd", "\xf0\x9f\x98\x8c"=>"\xf3\xbe\x8c\xbe", "\xf0\x9f\x98\x96"=>"\xf3\xbe\x8c\xbf",
- "\xf0\x9f\x98\x94"=>"\xf3\xbe\x8d\x80", "\xf0\x9f\x98\xb1"=>"\xf3\xbe\x8d\x81", "\xf0\x9f\x98\xaa"=>"\xf3\xbe\x8d\x82", "\xf0\x9f\x98\x8f"=>"\xf3\xbe\x8d\x83", "\xf0\x9f\x98\x93"=>"\xf3\xbe\x8d\x84",
- "\xf0\x9f\x98\xa5"=>"\xf3\xbe\x8d\x85", "\xf0\x9f\x98\xab"=>"\xf3\xbe\x8d\x86", "\xf0\x9f\x98\x89"=>"\xf3\xbe\x8d\x87", "\xf0\x9f\x98\xba"=>"\xf3\xbe\x8d\x88", "\xf0\x9f\x98\xb8"=>"\xf3\xbe\x8d\x89",
- "\xf0\x9f\x98\xb9"=>"\xf3\xbe\x8d\x8a", "\xf0\x9f\x98\xbd"=>"\xf3\xbe\x8d\x8b", "\xf0\x9f\x98\xbb"=>"\xf3\xbe\x8d\x8c", "\xf0\x9f\x98\xbf"=>"\xf3\xbe\x8d\x8d", "\xf0\x9f\x98\xbe"=>"\xf3\xbe\x8d\x8e",
- "\xf0\x9f\x98\xbc"=>"\xf3\xbe\x8d\x8f", "\xf0\x9f\x99\x80"=>"\xf3\xbe\x8d\x90", "\xf0\x9f\x99\x85"=>"\xf3\xbe\x8d\x91", "\xf0\x9f\x99\x86"=>"\xf3\xbe\x8d\x92", "\xf0\x9f\x99\x87"=>"\xf3\xbe\x8d\x93",
- "\xf0\x9f\x99\x88"=>"\xf3\xbe\x8d\x94", "\xf0\x9f\x99\x8a"=>"\xf3\xbe\x8d\x95", "\xf0\x9f\x99\x89"=>"\xf3\xbe\x8d\x96", "\xf0\x9f\x99\x8b"=>"\xf3\xbe\x8d\x97", "\xf0\x9f\x99\x8c"=>"\xf3\xbe\x8d\x98",
- "\xf0\x9f\x99\x8d"=>"\xf3\xbe\x8d\x99", "\xf0\x9f\x99\x8e"=>"\xf3\xbe\x8d\x9a", "\xf0\x9f\x99\x8f"=>"\xf3\xbe\x8d\x9b", "\xf0\x9f\x8f\xa0"=>"\xf3\xbe\x92\xb0", "\xf0\x9f\x8f\xa1"=>"\xf3\xbe\x92\xb1",
- "\xf0\x9f\x8f\xa2"=>"\xf3\xbe\x92\xb2", "\xf0\x9f\x8f\xa3"=>"\xf3\xbe\x92\xb3", "\xf0\x9f\x8f\xa5"=>"\xf3\xbe\x92\xb4", "\xf0\x9f\x8f\xa6"=>"\xf3\xbe\x92\xb5", "\xf0\x9f\x8f\xa7"=>"\xf3\xbe\x92\xb6",
- "\xf0\x9f\x8f\xa8"=>"\xf3\xbe\x92\xb7", "\xf0\x9f\x8f\xa9"=>"\xf3\xbe\x92\xb8", "\xf0\x9f\x8f\xaa"=>"\xf3\xbe\x92\xb9", "\xf0\x9f\x8f\xab"=>"\xf3\xbe\x92\xba", "\xe2\x9b\xaa"=>"\xf3\xbe\x92\xbb",
- "\xe2\x9b\xb2"=>"\xf3\xbe\x92\xbc", "\xf0\x9f\x8f\xac"=>"\xf3\xbe\x92\xbd", "\xf0\x9f\x8f\xaf"=>"\xf3\xbe\x92\xbe", "\xf0\x9f\x8f\xb0"=>"\xf3\xbe\x92\xbf", "\xf0\x9f\x8f\xad"=>"\xf3\xbe\x93\x80",
- "\xe2\x9a\x93"=>"\xf3\xbe\x93\x81", "\xf0\x9f\x8f\xae"=>"\xf3\xbe\x93\x82", "\xf0\x9f\x97\xbb"=>"\xf3\xbe\x93\x83", "\xf0\x9f\x97\xbc"=>"\xf3\xbe\x93\x84", "\xf0\x9f\x97\xbd"=>"\xf3\xbe\x93\x86",
- "\xf0\x9f\x97\xbe"=>"\xf3\xbe\x93\x87", "\xf0\x9f\x97\xbf"=>"\xf3\xbe\x93\x88", "\xf0\x9f\x91\x9e"=>"\xf3\xbe\x93\x8c", "\xf0\x9f\x91\x9f"=>"\xf3\xbe\x93\x8d", "\xf0\x9f\x91\xa0"=>"\xf3\xbe\x93\x96",
- "\xf0\x9f\x91\xa1"=>"\xf3\xbe\x93\x97", "\xf0\x9f\x91\xa2"=>"\xf3\xbe\x93\x98", "\xf0\x9f\x91\xa3"=>"\xf3\xbe\x95\x93", "\xf0\x9f\x91\x93"=>"\xf3\xbe\x93\x8e", "\xf0\x9f\x91\x95"=>"\xf3\xbe\x93\x8f",
- "\xf0\x9f\x91\x96"=>"\xf3\xbe\x93\x90", "\xf0\x9f\x91\x91"=>"\xf3\xbe\x93\x91", "\xf0\x9f\x91\x94"=>"\xf3\xbe\x93\x93", "\xf0\x9f\x91\x92"=>"\xf3\xbe\x93\x94", "\xf0\x9f\x91\x97"=>"\xf3\xbe\x93\x95",
- "\xf0\x9f\x91\x98"=>"\xf3\xbe\x93\x99", "\xf0\x9f\x91\x99"=>"\xf3\xbe\x93\x9a", "\xf0\x9f\x91\x9a"=>"\xf3\xbe\x93\x9b", "\xf0\x9f\x91\x9b"=>"\xf3\xbe\x93\x9c", "\xf0\x9f\x91\x9c"=>"\xf3\xbe\x93\xb0",
- "\xf0\x9f\x91\x9d"=>"\xf3\xbe\x93\xb1", "\xf0\x9f\x92\xb0"=>"\xf3\xbe\x93\x9d", "\xf0\x9f\x92\xb1"=>"\xf3\xbe\x93\x9e", "\xf0\x9f\x92\xb9"=>"\xf3\xbe\x93\x9f", "\xf0\x9f\x92\xb2"=>"\xf3\xbe\x93\xa0",
- "\xf0\x9f\x92\xb3"=>"\xf3\xbe\x93\xa1", "\xf0\x9f\x92\xb4"=>"\xf3\xbe\x93\xa2", "\xf0\x9f\x92\xb5"=>"\xf3\xbe\x93\xa3", "\xf0\x9f\x92\xb8"=>"\xf3\xbe\x93\xa4", "\xf0\x9f\x87\xa8\xf0\x9f\x87\xb3"=>"\xf3\xbe\x93\xad",
- "\xf0\x9f\x87\xa9\xf0\x9f\x87\xaa"=>"\xf3\xbe\x93\xa8", "\xf0\x9f\x87\xaa\xf0\x9f\x87\xb8"=>"\xf3\xbe\x93\xab", "\xf0\x9f\x87\xab\xf0\x9f\x87\xb7"=>"\xf3\xbe\x93\xa7", "\xf0\x9f\x87\xac\xf0\x9f\x87\xa7"=>"\xf3\xbe\x93\xaa", "\xf0\x9f\x87\xae\xf0\x9f\x87\xb9"=>"\xf3\xbe\x93\xa9",
- "\xf0\x9f\x87\xaf\xf0\x9f\x87\xb5"=>"\xf3\xbe\x93\xa5", "\xf0\x9f\x87\xb0\xf0\x9f\x87\xb7"=>"\xf3\xbe\x93\xae", "\xf0\x9f\x87\xb7\xf0\x9f\x87\xba"=>"\xf3\xbe\x93\xac", "\xf0\x9f\x87\xba\xf0\x9f\x87\xb8"=>"\xf3\xbe\x93\xa6", "\xf0\x9f\x94\xa5"=>"\xf3\xbe\x93\xb6",
- "\xf0\x9f\x94\xa6"=>"\xf3\xbe\x93\xbb", "\xf0\x9f\x94\xa7"=>"\xf3\xbe\x93\x89", "\xf0\x9f\x94\xa8"=>"\xf3\xbe\x93\x8a", "\xf0\x9f\x94\xa9"=>"\xf3\xbe\x93\x8b", "\xf0\x9f\x94\xaa"=>"\xf3\xbe\x93\xba",
- "\xf0\x9f\x94\xab"=>"\xf3\xbe\x93\xb5", "\xf0\x9f\x94\xae"=>"\xf3\xbe\x93\xb7", "\xf0\x9f\x94\xaf"=>"\xf3\xbe\x93\xb8", "\xf0\x9f\x94\xb0"=>"\xf3\xbe\x81\x84", "\xf0\x9f\x94\xb1"=>"\xf3\xbe\x93\x92",
- "\xf0\x9f\x92\x89"=>"\xf3\xbe\x94\x89", "\xf0\x9f\x92\x8a"=>"\xf3\xbe\x94\x8a", "\xf0\x9f\x85\xb0"=>"\xf3\xbe\x94\x8b", "\xf0\x9f\x85\xb1"=>"\xf3\xbe\x94\x8c", "\xf0\x9f\x86\x8e"=>"\xf3\xbe\x94\x8d",
- "\xf0\x9f\x85\xbe"=>"\xf3\xbe\x94\x8e", "\xf0\x9f\x8e\x80"=>"\xf3\xbe\x94\x8f", "\xf0\x9f\x8e\x81"=>"\xf3\xbe\x94\x90", "\xf0\x9f\x8e\x82"=>"\xf3\xbe\x94\x91", "\xf0\x9f\x8e\x84"=>"\xf3\xbe\x94\x92",
- "\xf0\x9f\x8e\x85"=>"\xf3\xbe\x94\x93", "\xf0\x9f\x8e\x8c"=>"\xf3\xbe\x94\x94", "\xf0\x9f\x8e\x86"=>"\xf3\xbe\x94\x95", "\xf0\x9f\x8e\x88"=>"\xf3\xbe\x94\x96", "\xf0\x9f\x8e\x89"=>"\xf3\xbe\x94\x97",
- "\xf0\x9f\x8e\x8d"=>"\xf3\xbe\x94\x98", "\xf0\x9f\x8e\x8e"=>"\xf3\xbe\x94\x99", "\xf0\x9f\x8e\x93"=>"\xf3\xbe\x94\x9a", "\xf0\x9f\x8e\x92"=>"\xf3\xbe\x94\x9b", "\xf0\x9f\x8e\x8f"=>"\xf3\xbe\x94\x9c",
- "\xf0\x9f\x8e\x87"=>"\xf3\xbe\x94\x9d", "\xf0\x9f\x8e\x90"=>"\xf3\xbe\x94\x9e", "\xf0\x9f\x8e\x83"=>"\xf3\xbe\x94\x9f", "\xf0\x9f\x8e\x8a"=>"\xf3\xbe\x94\xa0", "\xf0\x9f\x8e\x8b"=>"\xf3\xbe\x94\xa1",
- "\xf0\x9f\x8e\x91"=>"\xf3\xbe\x80\x97", "\xf0\x9f\x93\x9f"=>"\xf3\xbe\x94\xa2", "\xe2\x98\x8e"=>"\xf3\xbe\x94\xa3", "\xf0\x9f\x93\x9e"=>"\xf3\xbe\x94\xa4", "\xf0\x9f\x93\xb1"=>"\xf3\xbe\x94\xa5",
- "\xf0\x9f\x93\xb2"=>"\xf3\xbe\x94\xa6", "\xf0\x9f\x93\x9d"=>"\xf3\xbe\x94\xa7", "\xf0\x9f\x93\xa0"=>"\xf3\xbe\x94\xa8", "\xe2\x9c\x89"=>"\xf3\xbe\x94\xa9", "\xf0\x9f\x93\xa8"=>"\xf3\xbe\x94\xaa",
- "\xf0\x9f\x93\xa9"=>"\xf3\xbe\x94\xab", "\xf0\x9f\x93\xaa"=>"\xf3\xbe\x94\xac", "\xf0\x9f\x93\xab"=>"\xf3\xbe\x94\xad", "\xf0\x9f\x93\xae"=>"\xf3\xbe\x94\xae", "\xf0\x9f\x93\xb0"=>"\xf3\xbe\xa0\xa2",
- "\xf0\x9f\x93\xa2"=>"\xf3\xbe\x94\xaf", "\xf0\x9f\x93\xa3"=>"\xf3\xbe\x94\xb0", "\xf0\x9f\x93\xa1"=>"\xf3\xbe\x94\xb1", "\xf0\x9f\x93\xa4"=>"\xf3\xbe\x94\xb3", "\xf0\x9f\x93\xa5"=>"\xf3\xbe\x94\xb4",
- "\xf0\x9f\x93\xa6"=>"\xf3\xbe\x94\xb5", "\xf0\x9f\x93\xa7"=>"\xf3\xbe\xae\x92", "\xf0\x9f\x94\xa0"=>"\xf3\xbe\xad\xbc", "\xf0\x9f\x94\xa1"=>"\xf3\xbe\xad\xbd", "\xf0\x9f\x94\xa2"=>"\xf3\xbe\xad\xbe",
- "\xf0\x9f\x94\xa3"=>"\xf3\xbe\xad\xbf", "\xf0\x9f\x94\xa4"=>"\xf3\xbe\xae\x80", "\xe2\x9c\x92"=>"\xf3\xbe\x94\xb6", "\xf0\x9f\x92\xba"=>"\xf3\xbe\x94\xb7", "\xf0\x9f\x92\xbb"=>"\xf3\xbe\x94\xb8",
- "\xe2\x9c\x8f"=>"\xf3\xbe\x94\xb9", "\xf0\x9f\x93\x8e"=>"\xf3\xbe\x94\xba", "\xf0\x9f\x92\xbc"=>"\xf3\xbe\x94\xbb", "\xf0\x9f\x92\xbd"=>"\xf3\xbe\x94\xbc", "\xf0\x9f\x92\xbe"=>"\xf3\xbe\x94\xbd",
- "\xf0\x9f\x92\xbf"=>"\xf3\xbe\xa0\x9d", "\xf0\x9f\x93\x80"=>"\xf3\xbe\xa0\x9e", "\xe2\x9c\x82"=>"\xf3\xbe\x94\xbe", "\xf0\x9f\x93\x8d"=>"\xf3\xbe\x94\xbf", "\xf0\x9f\x93\x83"=>"\xf3\xbe\x95\x80",
- "\xf0\x9f\x93\x84"=>"\xf3\xbe\x95\x81", "\xf0\x9f\x93\x85"=>"\xf3\xbe\x95\x82", "\xf0\x9f\x93\x81"=>"\xf3\xbe\x95\x83", "\xf0\x9f\x93\x82"=>"\xf3\xbe\x95\x84", "\xf0\x9f\x93\x93"=>"\xf3\xbe\x95\x85",
- "\xf0\x9f\x93\x96"=>"\xf3\xbe\x95\x86", "\xf0\x9f\x93\x94"=>"\xf3\xbe\x95\x87", "\xf0\x9f\x93\x95"=>"\xf3\xbe\x94\x82", "\xf0\x9f\x93\x97"=>"\xf3\xbe\x93\xbf", "\xf0\x9f\x93\x98"=>"\xf3\xbe\x94\x80",
- "\xf0\x9f\x93\x99"=>"\xf3\xbe\x94\x81", "\xf0\x9f\x93\x9a"=>"\xf3\xbe\x94\x83", "\xf0\x9f\x93\x9b"=>"\xf3\xbe\x94\x84", "\xf0\x9f\x93\x9c"=>"\xf3\xbe\x93\xbd", "\xf0\x9f\x93\x8b"=>"\xf3\xbe\x95\x88",
- "\xf0\x9f\x93\x86"=>"\xf3\xbe\x95\x89", "\xf0\x9f\x93\x8a"=>"\xf3\xbe\x95\x8a", "\xf0\x9f\x93\x88"=>"\xf3\xbe\x95\x8b", "\xf0\x9f\x93\x89"=>"\xf3\xbe\x95\x8c", "\xf0\x9f\x93\x87"=>"\xf3\xbe\x95\x8d",
- "\xf0\x9f\x93\x8c"=>"\xf3\xbe\x95\x8e", "\xf0\x9f\x93\x92"=>"\xf3\xbe\x95\x8f", "\xf0\x9f\x93\x8f"=>"\xf3\xbe\x95\x90", "\xf0\x9f\x93\x90"=>"\xf3\xbe\x95\x91", "\xf0\x9f\x93\x91"=>"\xf3\xbe\x95\x92",
- "\xf0\x9f\x8e\xbd"=>"\xf3\xbe\x9f\x90", "\xe2\x9a\xbe"=>"\xf3\xbe\x9f\x91", "\xe2\x9b\xb3"=>"\xf3\xbe\x9f\x92", "\xf0\x9f\x8e\xbe"=>"\xf3\xbe\x9f\x93", "\xe2\x9a\xbd"=>"\xf3\xbe\x9f\x94",
- "\xf0\x9f\x8e\xbf"=>"\xf3\xbe\x9f\x95", "\xf0\x9f\x8f\x80"=>"\xf3\xbe\x9f\x96", "\xf0\x9f\x8f\x81"=>"\xf3\xbe\x9f\x97", "\xf0\x9f\x8f\x82"=>"\xf3\xbe\x9f\x98", "\xf0\x9f\x8f\x83"=>"\xf3\xbe\x9f\x99",
- "\xf0\x9f\x8f\x84"=>"\xf3\xbe\x9f\x9a", "\xf0\x9f\x8f\x86"=>"\xf3\xbe\x9f\x9b", "\xf0\x9f\x8f\x88"=>"\xf3\xbe\x9f\x9d", "\xf0\x9f\x8f\x8a"=>"\xf3\xbe\x9f\x9e", "\xf0\x9f\x9a\x83"=>"\xf3\xbe\x9f\x9f",
- "\xf0\x9f\x9a\x87"=>"\xf3\xbe\x9f\xa0", "\xe2\x93\x82"=>"\xf3\xbe\x9f\xa1", "\xf0\x9f\x9a\x84"=>"\xf3\xbe\x9f\xa2", "\xf0\x9f\x9a\x85"=>"\xf3\xbe\x9f\xa3", "\xf0\x9f\x9a\x97"=>"\xf3\xbe\x9f\xa4",
- "\xf0\x9f\x9a\x99"=>"\xf3\xbe\x9f\xa5", "\xf0\x9f\x9a\x8c"=>"\xf3\xbe\x9f\xa6", "\xf0\x9f\x9a\x8f"=>"\xf3\xbe\x9f\xa7", "\xf0\x9f\x9a\xa2"=>"\xf3\xbe\x9f\xa8", "\xe2\x9c\x88"=>"\xf3\xbe\x9f\xa9",
- "\xe2\x9b\xb5"=>"\xf3\xbe\x9f\xaa", "\xf0\x9f\x9a\x89"=>"\xf3\xbe\x9f\xac", "\xf0\x9f\x9a\x80"=>"\xf3\xbe\x9f\xad", "\xf0\x9f\x9a\xa4"=>"\xf3\xbe\x9f\xae", "\xf0\x9f\x9a\x95"=>"\xf3\xbe\x9f\xaf",
- "\xf0\x9f\x9a\x9a"=>"\xf3\xbe\x9f\xb1", "\xf0\x9f\x9a\x92"=>"\xf3\xbe\x9f\xb2", "\xf0\x9f\x9a\x91"=>"\xf3\xbe\x9f\xb3", "\xf0\x9f\x9a\x93"=>"\xf3\xbe\x9f\xb4", "\xe2\x9b\xbd"=>"\xf3\xbe\x9f\xb5",
- "\xf0\x9f\x85\xbf"=>"\xf3\xbe\x9f\xb6", "\xf0\x9f\x9a\xa5"=>"\xf3\xbe\x9f\xb7", "\xf0\x9f\x9a\xa7"=>"\xf3\xbe\x9f\xb8", "\xf0\x9f\x9a\xa8"=>"\xf3\xbe\x9f\xb9", "\xe2\x99\xa8"=>"\xf3\xbe\x9f\xba",
- "\xe2\x9b\xba"=>"\xf3\xbe\x9f\xbb", "\xf0\x9f\x8e\xa0"=>"\xf3\xbe\x9f\xbc", "\xf0\x9f\x8e\xa1"=>"\xf3\xbe\x9f\xbd", "\xf0\x9f\x8e\xa2"=>"\xf3\xbe\x9f\xbe", "\xf0\x9f\x8e\xa3"=>"\xf3\xbe\x9f\xbf",
- "\xf0\x9f\x8e\xa4"=>"\xf3\xbe\xa0\x80", "\xf0\x9f\x8e\xa5"=>"\xf3\xbe\xa0\x81", "\xf0\x9f\x8e\xa6"=>"\xf3\xbe\xa0\x82", "\xf0\x9f\x8e\xa7"=>"\xf3\xbe\xa0\x83", "\xf0\x9f\x8e\xa8"=>"\xf3\xbe\xa0\x84",
- "\xf0\x9f\x8e\xa9"=>"\xf3\xbe\xa0\x85", "\xf0\x9f\x8e\xaa"=>"\xf3\xbe\xa0\x86", "\xf0\x9f\x8e\xab"=>"\xf3\xbe\xa0\x87", "\xf0\x9f\x8e\xac"=>"\xf3\xbe\xa0\x88", "\xf0\x9f\x8e\xad"=>"\xf3\xbe\xa0\x89",
- "\xf0\x9f\x8e\xae"=>"\xf3\xbe\xa0\x8a", "\xf0\x9f\x80\x84"=>"\xf3\xbe\xa0\x8b", "\xf0\x9f\x8e\xaf"=>"\xf3\xbe\xa0\x8c", "\xf0\x9f\x8e\xb0"=>"\xf3\xbe\xa0\x8d", "\xf0\x9f\x8e\xb1"=>"\xf3\xbe\xa0\x8e",
- "\xf0\x9f\x8e\xb2"=>"\xf3\xbe\xa0\x8f", "\xf0\x9f\x8e\xb3"=>"\xf3\xbe\xa0\x90", "\xf0\x9f\x8e\xb4"=>"\xf3\xbe\xa0\x91", "\xf0\x9f\x83\x8f"=>"\xf3\xbe\xa0\x92", "\xf0\x9f\x8e\xb5"=>"\xf3\xbe\xa0\x93",
- "\xf0\x9f\x8e\xb6"=>"\xf3\xbe\xa0\x94", "\xf0\x9f\x8e\xb7"=>"\xf3\xbe\xa0\x95", "\xf0\x9f\x8e\xb8"=>"\xf3\xbe\xa0\x96", "\xf0\x9f\x8e\xb9"=>"\xf3\xbe\xa0\x97", "\xf0\x9f\x8e\xba"=>"\xf3\xbe\xa0\x98",
- "\xf0\x9f\x8e\xbb"=>"\xf3\xbe\xa0\x99", "\xf0\x9f\x8e\xbc"=>"\xf3\xbe\xa0\x9a", "\xe3\x80\xbd"=>"\xf3\xbe\xa0\x9b", "\xf0\x9f\x93\xb7"=>"\xf3\xbe\x93\xaf", "\xf0\x9f\x93\xb9"=>"\xf3\xbe\x93\xb9",
- "\xf0\x9f\x93\xba"=>"\xf3\xbe\xa0\x9c", "\xf0\x9f\x93\xbb"=>"\xf3\xbe\xa0\x9f", "\xf0\x9f\x93\xbc"=>"\xf3\xbe\xa0\xa0", "\xf0\x9f\x92\x8b"=>"\xf3\xbe\xa0\xa3", "\xf0\x9f\x92\x8c"=>"\xf3\xbe\xa0\xa4",
- "\xf0\x9f\x92\x8d"=>"\xf3\xbe\xa0\xa5", "\xf0\x9f\x92\x8e"=>"\xf3\xbe\xa0\xa6", "\xf0\x9f\x92\x8f"=>"\xf3\xbe\xa0\xa7", "\xf0\x9f\x92\x90"=>"\xf3\xbe\xa0\xa8", "\xf0\x9f\x92\x91"=>"\xf3\xbe\xa0\xa9",
- "\xf0\x9f\x92\x92"=>"\xf3\xbe\xa0\xaa", "\xf0\x9f\x94\x9e"=>"\xf3\xbe\xac\xa5", "\xc2\xa9"=>"\xf3\xbe\xac\xa9", "\xc2\xae"=>"\xf3\xbe\xac\xad", "\xe2\x84\xa2"=>"\xf3\xbe\xac\xaa",
- "\xe2\x84\xb9"=>"\xf3\xbe\xad\x87", "#\xe2\x83\xa3"=>"\xf3\xbe\xa0\xac", "1\xe2\x83\xa3"=>"\xf3\xbe\xa0\xae", "2\xe2\x83\xa3"=>"\xf3\xbe\xa0\xaf", "3\xe2\x83\xa3"=>"\xf3\xbe\xa0\xb0",
- "4\xe2\x83\xa3"=>"\xf3\xbe\xa0\xb1", "5\xe2\x83\xa3"=>"\xf3\xbe\xa0\xb2", "6\xe2\x83\xa3"=>"\xf3\xbe\xa0\xb3", "7\xe2\x83\xa3"=>"\xf3\xbe\xa0\xb4", "8\xe2\x83\xa3"=>"\xf3\xbe\xa0\xb5",
- "9\xe2\x83\xa3"=>"\xf3\xbe\xa0\xb6", "0\xe2\x83\xa3"=>"\xf3\xbe\xa0\xb7", "\xf0\x9f\x94\x9f"=>"\xf3\xbe\xa0\xbb", "\xf0\x9f\x93\xb6"=>"\xf3\xbe\xa0\xb8", "\xf0\x9f\x93\xb3"=>"\xf3\xbe\xa0\xb9",
- "\xf0\x9f\x93\xb4"=>"\xf3\xbe\xa0\xba", "\xf0\x9f\x8d\x94"=>"\xf3\xbe\xa5\xa0", "\xf0\x9f\x8d\x99"=>"\xf3\xbe\xa5\xa1", "\xf0\x9f\x8d\xb0"=>"\xf3\xbe\xa5\xa2", "\xf0\x9f\x8d\x9c"=>"\xf3\xbe\xa5\xa3",
- "\xf0\x9f\x8d\x9e"=>"\xf3\xbe\xa5\xa4", "\xf0\x9f\x8d\xb3"=>"\xf3\xbe\xa5\xa5", "\xf0\x9f\x8d\xa6"=>"\xf3\xbe\xa5\xa6", "\xf0\x9f\x8d\x9f"=>"\xf3\xbe\xa5\xa7", "\xf0\x9f\x8d\xa1"=>"\xf3\xbe\xa5\xa8",
- "\xf0\x9f\x8d\x98"=>"\xf3\xbe\xa5\xa9", "\xf0\x9f\x8d\x9a"=>"\xf3\xbe\xa5\xaa", "\xf0\x9f\x8d\x9d"=>"\xf3\xbe\xa5\xab", "\xf0\x9f\x8d\x9b"=>"\xf3\xbe\xa5\xac", "\xf0\x9f\x8d\xa2"=>"\xf3\xbe\xa5\xad",
- "\xf0\x9f\x8d\xa3"=>"\xf3\xbe\xa5\xae", "\xf0\x9f\x8d\xb1"=>"\xf3\xbe\xa5\xaf", "\xf0\x9f\x8d\xb2"=>"\xf3\xbe\xa5\xb0", "\xf0\x9f\x8d\xa7"=>"\xf3\xbe\xa5\xb1", "\xf0\x9f\x8d\x96"=>"\xf3\xbe\xa5\xb2",
- "\xf0\x9f\x8d\xa5"=>"\xf3\xbe\xa5\xb3", "\xf0\x9f\x8d\xa0"=>"\xf3\xbe\xa5\xb4", "\xf0\x9f\x8d\x95"=>"\xf3\xbe\xa5\xb5", "\xf0\x9f\x8d\x97"=>"\xf3\xbe\xa5\xb6", "\xf0\x9f\x8d\xa8"=>"\xf3\xbe\xa5\xb7",
- "\xf0\x9f\x8d\xa9"=>"\xf3\xbe\xa5\xb8", "\xf0\x9f\x8d\xaa"=>"\xf3\xbe\xa5\xb9", "\xf0\x9f\x8d\xab"=>"\xf3\xbe\xa5\xba", "\xf0\x9f\x8d\xac"=>"\xf3\xbe\xa5\xbb", "\xf0\x9f\x8d\xad"=>"\xf3\xbe\xa5\xbc",
- "\xf0\x9f\x8d\xae"=>"\xf3\xbe\xa5\xbd", "\xf0\x9f\x8d\xaf"=>"\xf3\xbe\xa5\xbe", "\xf0\x9f\x8d\xa4"=>"\xf3\xbe\xa5\xbf", "\xf0\x9f\x8d\xb4"=>"\xf3\xbe\xa6\x80", "\xe2\x98\x95"=>"\xf3\xbe\xa6\x81",
- "\xf0\x9f\x8d\xb8"=>"\xf3\xbe\xa6\x82", "\xf0\x9f\x8d\xba"=>"\xf3\xbe\xa6\x83", "\xf0\x9f\x8d\xb5"=>"\xf3\xbe\xa6\x84", "\xf0\x9f\x8d\xb6"=>"\xf3\xbe\xa6\x85", "\xf0\x9f\x8d\xb7"=>"\xf3\xbe\xa6\x86",
- "\xf0\x9f\x8d\xbb"=>"\xf3\xbe\xa6\x87", "\xf0\x9f\x8d\xb9"=>"\xf3\xbe\xa6\x88", "\xe2\x86\x97"=>"\xf3\xbe\xab\xb0", "\xe2\x86\x98"=>"\xf3\xbe\xab\xb1", "\xe2\x86\x96"=>"\xf3\xbe\xab\xb2",
- "\xe2\x86\x99"=>"\xf3\xbe\xab\xb3", "\xe2\xa4\xb4"=>"\xf3\xbe\xab\xb4", "\xe2\xa4\xb5"=>"\xf3\xbe\xab\xb5", "\xe2\x86\x94"=>"\xf3\xbe\xab\xb6", "\xe2\x86\x95"=>"\xf3\xbe\xab\xb7",
- "\xe2\xac\x86"=>"\xf3\xbe\xab\xb8", "\xe2\xac\x87"=>"\xf3\xbe\xab\xb9", "\xe2\x9e\xa1"=>"\xf3\xbe\xab\xba", "\xe2\xac\x85"=>"\xf3\xbe\xab\xbb", "\xe2\x96\xb6"=>"\xf3\xbe\xab\xbc",
- "\xe2\x97\x80"=>"\xf3\xbe\xab\xbd", "\xe2\x8f\xa9"=>"\xf3\xbe\xab\xbe", "\xe2\x8f\xaa"=>"\xf3\xbe\xab\xbf", "\xe2\x8f\xab"=>"\xf3\xbe\xac\x83", "\xe2\x8f\xac"=>"\xf3\xbe\xac\x82",
- "\xf0\x9f\x94\xba"=>"\xf3\xbe\xad\xb8", "\xf0\x9f\x94\xbb"=>"\xf3\xbe\xad\xb9", "\xf0\x9f\x94\xbc"=>"\xf3\xbe\xac\x81", "\xf0\x9f\x94\xbd"=>"\xf3\xbe\xac\x80", "\xe2\xad\x95"=>"\xf3\xbe\xad\x84",
- "\xe2\x9d\x8c"=>"\xf3\xbe\xad\x85", "\xe2\x9d\x8e"=>"\xf3\xbe\xad\x86", "\xe2\x9d\x97"=>"\xf3\xbe\xac\x84", "\xe2\x81\x89"=>"\xf3\xbe\xac\x85", "\xe2\x80\xbc"=>"\xf3\xbe\xac\x86",
- "\xe2\x9d\x93"=>"\xf3\xbe\xac\x89", "\xe2\x9d\x94"=>"\xf3\xbe\xac\x8a", "\xe2\x9d\x95"=>"\xf3\xbe\xac\x8b", "\xe3\x80\xb0"=>"\xf3\xbe\xac\x87", "\xe2\x9e\xb0"=>"\xf3\xbe\xac\x88",
- "\xe2\x9e\xbf"=>"\xf3\xbe\xa0\xab", "\xe2\x9d\xa4"=>"\xf3\xbe\xac\x8c", "\xf0\x9f\x92\x93"=>"\xf3\xbe\xac\x8d", "\xf0\x9f\x92\x94"=>"\xf3\xbe\xac\x8e", "\xf0\x9f\x92\x95"=>"\xf3\xbe\xac\x8f",
- "\xf0\x9f\x92\x96"=>"\xf3\xbe\xac\x90", "\xf0\x9f\x92\x97"=>"\xf3\xbe\xac\x91", "\xf0\x9f\x92\x98"=>"\xf3\xbe\xac\x92", "\xf0\x9f\x92\x99"=>"\xf3\xbe\xac\x93", "\xf0\x9f\x92\x9a"=>"\xf3\xbe\xac\x94",
- "\xf0\x9f\x92\x9b"=>"\xf3\xbe\xac\x95", "\xf0\x9f\x92\x9c"=>"\xf3\xbe\xac\x96", "\xf0\x9f\x92\x9d"=>"\xf3\xbe\xac\x97", "\xf0\x9f\x92\x9e"=>"\xf3\xbe\xac\x98", "\xf0\x9f\x92\x9f"=>"\xf3\xbe\xac\x99",
- "\xe2\x99\xa5"=>"\xf3\xbe\xac\x9a", "\xe2\x99\xa0"=>"\xf3\xbe\xac\x9b", "\xe2\x99\xa6"=>"\xf3\xbe\xac\x9c", "\xe2\x99\xa3"=>"\xf3\xbe\xac\x9d", "\xf0\x9f\x9a\xac"=>"\xf3\xbe\xac\x9e",
- "\xf0\x9f\x9a\xad"=>"\xf3\xbe\xac\x9f", "\xe2\x99\xbf"=>"\xf3\xbe\xac\xa0", "\xf0\x9f\x9a\xa9"=>"\xf3\xbe\xac\xa2", "\xe2\x9a\xa0"=>"\xf3\xbe\xac\xa3", "\xe2\x9b\x94"=>"\xf3\xbe\xac\xa6",
- "\xe2\x99\xbb"=>"\xf3\xbe\xac\xac", "\xf0\x9f\x9a\xb2"=>"\xf3\xbe\x9f\xab", "\xf0\x9f\x9a\xb6"=>"\xf3\xbe\x9f\xb0", "\xf0\x9f\x9a\xb9"=>"\xf3\xbe\xac\xb3", "\xf0\x9f\x9a\xba"=>"\xf3\xbe\xac\xb4",
- "\xf0\x9f\x9b\x80"=>"\xf3\xbe\x94\x85", "\xf0\x9f\x9a\xbb"=>"\xf3\xbe\x94\x86", "\xf0\x9f\x9a\xbd"=>"\xf3\xbe\x94\x87", "\xf0\x9f\x9a\xbe"=>"\xf3\xbe\x94\x88", "\xf0\x9f\x9a\xbc"=>"\xf3\xbe\xac\xb5",
- "\xf0\x9f\x9a\xaa"=>"\xf3\xbe\x93\xb3", "\xf0\x9f\x9a\xab"=>"\xf3\xbe\xad\x88", "\xe2\x9c\x94"=>"\xf3\xbe\xad\x89", "\xf0\x9f\x86\x91"=>"\xf3\xbe\xae\x84", "\xf0\x9f\x86\x92"=>"\xf3\xbe\xac\xb8",
- "\xf0\x9f\x86\x93"=>"\xf3\xbe\xac\xa1", "\xf0\x9f\x86\x94"=>"\xf3\xbe\xae\x81", "\xf0\x9f\x86\x95"=>"\xf3\xbe\xac\xb6", "\xf0\x9f\x86\x96"=>"\xf3\xbe\xac\xa8", "\xf0\x9f\x86\x97"=>"\xf3\xbe\xac\xa7",
- "\xf0\x9f\x86\x98"=>"\xf3\xbe\xad\x8f", "\xf0\x9f\x86\x99"=>"\xf3\xbe\xac\xb7", "\xf0\x9f\x86\x9a"=>"\xf3\xbe\xac\xb2", "\xf0\x9f\x88\x81"=>"\xf3\xbe\xac\xa4", "\xf0\x9f\x88\x82"=>"\xf3\xbe\xac\xbf",
- "\xf0\x9f\x88\xb2"=>"\xf3\xbe\xac\xae", "\xf0\x9f\x88\xb3"=>"\xf3\xbe\xac\xaf", "\xf0\x9f\x88\xb4"=>"\xf3\xbe\xac\xb0", "\xf0\x9f\x88\xb5"=>"\xf3\xbe\xac\xb1", "\xf0\x9f\x88\xb6"=>"\xf3\xbe\xac\xb9",
- "\xf0\x9f\x88\x9a"=>"\xf3\xbe\xac\xba", "\xf0\x9f\x88\xb7"=>"\xf3\xbe\xac\xbb", "\xf0\x9f\x88\xb8"=>"\xf3\xbe\xac\xbc", "\xf0\x9f\x88\xb9"=>"\xf3\xbe\xac\xbe", "\xf0\x9f\x88\xaf"=>"\xf3\xbe\xad\x80",
- "\xf0\x9f\x88\xba"=>"\xf3\xbe\xad\x81", "\xe3\x8a\x99"=>"\xf3\xbe\xac\xab", "\xe3\x8a\x97"=>"\xf3\xbe\xad\x83", "\xf0\x9f\x89\x90"=>"\xf3\xbe\xac\xbd", "\xf0\x9f\x89\x91"=>"\xf3\xbe\xad\x90",
- "\xe2\x9e\x95"=>"\xf3\xbe\xad\x91", "\xe2\x9e\x96"=>"\xf3\xbe\xad\x92", "\xe2\x9c\x96"=>"\xf3\xbe\xad\x93", "\xe2\x9e\x97"=>"\xf3\xbe\xad\x94", "\xf0\x9f\x92\xa0"=>"\xf3\xbe\xad\x95",
- "\xf0\x9f\x92\xa1"=>"\xf3\xbe\xad\x96", "\xf0\x9f\x92\xa2"=>"\xf3\xbe\xad\x97", "\xf0\x9f\x92\xa3"=>"\xf3\xbe\xad\x98", "\xf0\x9f\x92\xa4"=>"\xf3\xbe\xad\x99", "\xf0\x9f\x92\xa5"=>"\xf3\xbe\xad\x9a",
- "\xf0\x9f\x92\xa6"=>"\xf3\xbe\xad\x9b", "\xf0\x9f\x92\xa7"=>"\xf3\xbe\xad\x9c", "\xf0\x9f\x92\xa8"=>"\xf3\xbe\xad\x9d", "\xf0\x9f\x92\xa9"=>"\xf3\xbe\x93\xb4", "\xf0\x9f\x92\xaa"=>"\xf3\xbe\xad\x9e",
- "\xf0\x9f\x92\xab"=>"\xf3\xbe\xad\x9f", "\xf0\x9f\x92\xac"=>"\xf3\xbe\x94\xb2", "\xe2\x9c\xa8"=>"\xf3\xbe\xad\xa0", "\xe2\x9c\xb4"=>"\xf3\xbe\xad\xa1", "\xe2\x9c\xb3"=>"\xf3\xbe\xad\xa2",
- "\xe2\x9a\xaa"=>"\xf3\xbe\xad\xa5", "\xe2\x9a\xab"=>"\xf3\xbe\xad\xa6", "\xf0\x9f\x94\xb4"=>"\xf3\xbe\xad\xa3", "\xf0\x9f\x94\xb5"=>"\xf3\xbe\xad\xa4", "\xf0\x9f\x94\xb2"=>"\xf3\xbe\xad\xa4",
- "\xf0\x9f\x94\xb3"=>"\xf3\xbe\xad\xa7", "\xe2\xad\x90"=>"\xf3\xbe\xad\xa8", "\xe2\xac\x9c"=>"\xf3\xbe\xad\xab", "\xe2\xac\x9b"=>"\xf3\xbe\xad\xac", "\xe2\x96\xab"=>"\xf3\xbe\xad\xad",
- "\xe2\x96\xaa"=>"\xf3\xbe\xad\xae", "\xe2\x97\xbd"=>"\xf3\xbe\xad\xaf", "\xe2\x97\xbe"=>"\xf3\xbe\xad\xb0", "\xe2\x97\xbb"=>"\xf3\xbe\xad\xb1", "\xe2\x97\xbc"=>"\xf3\xbe\xad\xb2",
- "\xf0\x9f\x94\xb6"=>"\xf3\xbe\xad\xb3", "\xf0\x9f\x94\xb7"=>"\xf3\xbe\xad\xb4", "\xf0\x9f\x94\xb8"=>"\xf3\xbe\xad\xb5", "\xf0\x9f\x94\xb9"=>"\xf3\xbe\xad\xb6", "\xe2\x9d\x87"=>"\xf3\xbe\xad\xb7",
- "\xf0\x9f\x92\xae"=>"\xf3\xbe\xad\xba", "\xf0\x9f\x92\xaf"=>"\xf3\xbe\xad\xbb", "\xe2\x86\xa9"=>"\xf3\xbe\xae\x83", "\xe2\x86\xaa"=>"\xf3\xbe\xae\x88", "\xf0\x9f\x94\x83"=>"\xf3\xbe\xae\x91",
- "\xf0\x9f\x94\x8a"=>"\xf3\xbe\xa0\xa1", "\xf0\x9f\x94\x8b"=>"\xf3\xbe\x93\xbc", "\xf0\x9f\x94\x8c"=>"\xf3\xbe\x93\xbe", "\xf0\x9f\x94\x8d"=>"\xf3\xbe\xae\x85", "\xf0\x9f\x94\x8e"=>"\xf3\xbe\xae\x8d",
- "\xf0\x9f\x94\x92"=>"\xf3\xbe\xae\x86", "\xf0\x9f\x94\x93"=>"\xf3\xbe\xae\x87", "\xf0\x9f\x94\x8f"=>"\xf3\xbe\xae\x90", "\xf0\x9f\x94\x90"=>"\xf3\xbe\xae\x8a", "\xf0\x9f\x94\x91"=>"\xf3\xbe\xae\x82",
- "\xf0\x9f\x94\x94"=>"\xf3\xbe\x93\xb2", "\xe2\x98\x91"=>"\xf3\xbe\xae\x8b", "\xf0\x9f\x94\x98"=>"\xf3\xbe\xae\x8c", "\xf0\x9f\x94\x96"=>"\xf3\xbe\xae\x8f", "\xf0\x9f\x94\x97"=>"\xf3\xbe\xad\x8b",
- "\xf0\x9f\x94\x99"=>"\xf3\xbe\xae\x8e", "\xf0\x9f\x94\x9a"=>"\xf3\xbe\x80\x9a", "\xf0\x9f\x94\x9b"=>"\xf3\xbe\x80\x99", "\xf0\x9f\x94\x9c"=>"\xf3\xbe\x80\x98", "\xf0\x9f\x94\x9d"=>"\xf3\xbe\xad\x82",
- "\xe2\x9c\x85"=>"\xf3\xbe\xad\x8a", "\xe2\x9c\x8a"=>"\xf3\xbe\xae\x93", "\xe2\x9c\x8b"=>"\xf3\xbe\xae\x95", "\xe2\x9c\x8c"=>"\xf3\xbe\xae\x94", "\xf0\x9f\x91\x8a"=>"\xf3\xbe\xae\x96",
- "\xf0\x9f\x91\x8d"=>"\xf3\xbe\xae\x97", "\xe2\x98\x9d"=>"\xf3\xbe\xae\x98", "\xf0\x9f\x91\x86"=>"\xf3\xbe\xae\x99", "\xf0\x9f\x91\x87"=>"\xf3\xbe\xae\x9a", "\xf0\x9f\x91\x88"=>"\xf3\xbe\xae\x9b",
- "\xf0\x9f\x91\x89"=>"\xf3\xbe\xae\x9c", "\xf0\x9f\x91\x8b"=>"\xf3\xbe\xae\x9d", "\xf0\x9f\x91\x8f"=>"\xf3\xbe\xae\x9e", "\xf0\x9f\x91\x8c"=>"\xf3\xbe\xae\x9f", "\xf0\x9f\x91\x8e"=>"\xf3\xbe\xae\xa0",
- "\xf0\x9f\x91\x90"=>"\xf3\xbe\xae\xa1",
- ),
- 'docomo_to_unified' => array(
- "\xee\x98\xbe"=>"\xf0\x9f\x8c\x87", "\xee\x98\xbf"=>"\xe2\x98\x81", "\xee\x99\x80"=>"\xe2\x98\x94", "\xee\x99\x81"=>"\xe2\x9b\x84",
- "\xee\x99\x82"=>"\xe2\x9a\xa1", "\xee\x99\x83"=>"\xf0\x9f\x8d\xa5", "\xee\x99\x84"=>"\xf0\x9f\x8c\x81", "\xee\x99\x85"=>"\xf0\x9f\x8c\x82", "\xee\x9a\xb3"=>"\xf0\x9f\x8c\x8c",
- "[\xe5\xa4\x95\xe7\x84\xbc\xe3\x81\x91]"=>"\xf0\x9f\x8c\x86", "[\xe8\x99\xb9]"=>"\xf0\x9f\x8c\x88", "[\xe9\x9b\xaa\xe7\xb5\x90\xe6\x99\xb6]"=>"\xe2\x9d\x84", "\xee\x98\xbe\xee\x98\xbf"=>"\xe2\x9b\x85", "\xee\x9c\xbf"=>"\xf0\x9f\x8c\x8a",
- "[\xe7\x81\xab\xe5\xb1\xb1]"=>"\xf0\x9f\x8c\x8b", "[\xe5\x9c\xb0\xe7\x90\x83]"=>"\xf0\x9f\x8c\x8f", "\xee\x9a\x9c"=>"\xf0\x9f\x94\xb3", "\xee\x9a\x9d"=>"\xf0\x9f\x8c\x94", "\xee\x9a\x9e"=>"\xf0\x9f\x8c\x9b",
- "\xee\x9a\x9f"=>"\xf0\x9f\x8c\x99", "\xee\x9a\xa0"=>"\xe2\xad\x95", "[\xe2\x98\x86]"=>"\xe2\xad\x90", "\xe2\x98\x86\xe5\xbd\xa1"=>"\xf0\x9f\x8c\xa0", "\xee\x9a\xba"=>"\xe2\x8f\xb0",
- "\xee\x9c\x9f"=>"\xe2\x8c\x9a", "\xee\x9c\x9c"=>"\xe2\x8f\xb3", "\xee\x99\x86"=>"\xe2\x99\x88", "\xee\x99\x87"=>"\xe2\x99\x89", "\xee\x99\x88"=>"\xe2\x99\x8a",
- "\xee\x99\x89"=>"\xe2\x99\x8b", "\xee\x99\x8a"=>"\xe2\x99\x8c", "\xee\x99\x8b"=>"\xe2\x99\x8d", "\xee\x99\x8c"=>"\xe2\x99\x8e", "\xee\x99\x8d"=>"\xe2\x99\x8f",
- "\xee\x99\x8e"=>"\xe2\x99\x90", "\xee\x99\x8f"=>"\xe2\x99\x91", "\xee\x99\x90"=>"\xe2\x99\x92", "\xee\x99\x91"=>"\xe2\x99\x93", "[\xe8\x9b\x87\xe4\xbd\xbf\xe5\xba\xa7]"=>"\xe2\x9b\x8e",
- "\xee\x9d\x81"=>"\xf0\x9f\x8c\xbf", "\xee\x9d\x83"=>"\xf0\x9f\x8c\xb7", "\xee\x9d\x86"=>"\xf0\x9f\x8c\xb1", "\xee\x9d\x87"=>"\xf0\x9f\x8d\x82", "\xee\x9d\x88"=>"\xf0\x9f\x8c\xb8",
- "[\xe3\x83\x90\xe3\x83\xa9]"=>"\xf0\x9f\x8c\xb9", "[\xe9\xa2\xa8\xe3\x81\xab\xe8\x88\x9e\xe3\x81\x86\xe8\x91\x89]"=>"\xf0\x9f\x8d\x83", "[\xe3\x83\x8f\xe3\x82\xa4\xe3\x83\x93\xe3\x82\xb9\xe3\x82\xab\xe3\x82\xb9]"=>"\xf0\x9f\x8c\xba", "[\xe3\x81\xb2\xe3\x81\xbe\xe3\x82\x8f\xe3\x82\x8a]"=>"\xf0\x9f\x8c\xbb", "[\xe3\x83\xa4\xe3\x82\xb7]"=>"\xf0\x9f\x8c\xb4",
- "[\xe3\x82\xb5\xe3\x83\x9c\xe3\x83\x86\xe3\x83\xb3]"=>"\xf0\x9f\x8c\xb5", "[\xe7\xa8\xb2\xe7\xa9\x82]"=>"\xf0\x9f\x8c\xbe", "[\xe3\x81\xa8\xe3\x81\x86\xe3\x82\x82\xe3\x82\x8d\xe3\x81\x93\xe3\x81\x97]"=>"\xf0\x9f\x8c\xbd", "[\xe3\x82\xad\xe3\x83\x8e\xe3\x82\xb3]"=>"\xf0\x9f\x8d\x84", "[\xe6\xa0\x97]"=>"\xf0\x9f\x8c\xb0",
- "[\xe8\x8a\xb1]"=>"\xf0\x9f\x8c\xbc", "\xee\x9d\x82"=>"\xf0\x9f\x8d\x92", "\xee\x9d\x84"=>"\xf0\x9f\x8d\x8c", "\xee\x9d\x85"=>"\xf0\x9f\x8d\x8f", "[\xe3\x81\xbf\xe3\x81\x8b\xe3\x82\x93]"=>"\xf0\x9f\x8d\x8a",
- "[\xe3\x82\xa4\xe3\x83\x81\xe3\x82\xb4]"=>"\xf0\x9f\x8d\x93", "[\xe3\x82\xb9\xe3\x82\xa4\xe3\x82\xab]"=>"\xf0\x9f\x8d\x89", "[\xe3\x83\x88\xe3\x83\x9e\xe3\x83\x88]"=>"\xf0\x9f\x8d\x85", "[\xe3\x83\x8a\xe3\x82\xb9]"=>"\xf0\x9f\x8d\x86", "[\xe3\x83\xa1\xe3\x83\xad\xe3\x83\xb3]"=>"\xf0\x9f\x8d\x88",
- "[\xe3\x83\x91\xe3\x82\xa4\xe3\x83\x8a\xe3\x83\x83\xe3\x83\x97\xe3\x83\xab]"=>"\xf0\x9f\x8d\x8d", "[\xe3\x83\x96\xe3\x83\x89\xe3\x82\xa6]"=>"\xf0\x9f\x8d\x87", "[\xe3\x83\xa2\xe3\x83\xa2]"=>"\xf0\x9f\x8d\x91", "\xee\x9a\x91"=>"\xf0\x9f\x91\x80", "\xee\x9a\x92"=>"\xf0\x9f\x91\x82",
- "[\xe9\xbc\xbb]"=>"\xf0\x9f\x91\x83", "\xee\x9b\xb9"=>"\xf0\x9f\x92\x8f", "\xee\x9c\xa8"=>"\xf0\x9f\x98\x9d", "\xee\x9c\x90"=>"\xf0\x9f\x92\x84", "[\xe3\x83\x9e\xe3\x83\x8b\xe3\x82\xad\xe3\x83\xa5\xe3\x82\xa2]"=>"\xf0\x9f\x92\x85",
- "[\xe3\x82\xa8\xe3\x82\xb9\xe3\x83\x86]"=>"\xf0\x9f\x92\x86", "\xee\x99\xb5"=>"\xe2\x9c\x82", "[\xe5\xba\x8a\xe5\xb1\x8b]"=>"\xf0\x9f\x92\x88", "\xee\x9a\xb1"=>"\xf0\x9f\x91\xa4", "\xee\x9b\xb0"=>"\xf0\x9f\x98\xba",
- "[\xe5\xae\xb6\xe6\x97\x8f]"=>"\xf0\x9f\x91\xaa", "[\xe3\x82\xab\xe3\x83\x83\xe3\x83\x97\xe3\x83\xab]"=>"\xf0\x9f\x91\xab", "[\xe8\xad\xa6\xe5\xae\x98]"=>"\xf0\x9f\x91\xae", "[\xe3\x83\x90\xe3\x83\x8b\xe3\x83\xbc]"=>"\xf0\x9f\x91\xaf", "[\xe8\x8a\xb1\xe5\xab\x81]"=>"\xf0\x9f\x91\xb0",
- "[\xe7\x99\xbd\xe4\xba\xba]"=>"\xf0\x9f\x91\xb1", "[\xe4\xb8\xad\xe5\x9b\xbd\xe4\xba\xba]"=>"\xf0\x9f\x91\xb2", "[\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x89\xe4\xba\xba]"=>"\xf0\x9f\x91\xb3", "[\xe3\x81\x8a\xe3\x81\x98\xe3\x81\x84\xe3\x81\x95\xe3\x82\x93]"=>"\xf0\x9f\x91\xb4", "[\xe3\x81\x8a\xe3\x81\xb0\xe3\x81\x82\xe3\x81\x95\xe3\x82\x93]"=>"\xf0\x9f\x91\xb5",
- "[\xe8\xb5\xa4\xe3\x81\xa1\xe3\x82\x83\xe3\x82\x93]"=>"\xf0\x9f\x9a\xbc", "[\xe5\xb7\xa5\xe4\xba\x8b\xe7\x8f\xbe\xe5\xa0\xb4\xe3\x81\xae\xe4\xba\xba]"=>"\xf0\x9f\x91\xb7", "[\xe3\x81\x8a\xe5\xa7\xab\xe6\xa7\x98]"=>"\xf0\x9f\x91\xb8", "[\xe3\x81\xaa\xe3\x81\xbe\xe3\x81\xaf\xe3\x81\x92]"=>"\xf0\x9f\x91\xb9", "[\xe5\xa4\xa9\xe7\x8b\x97]"=>"\xf0\x9f\x91\xba",
- "[\xe3\x81\x8a\xe5\x8c\x96\xe3\x81\x91]"=>"\xf0\x9f\x91\xbb", "[\xe5\xa4\xa9\xe4\xbd\xbf]"=>"\xf0\x9f\x91\xbc", "[UFO]"=>"\xf0\x9f\x91\xbd", "[\xe5\xae\x87\xe5\xae\x99\xe4\xba\xba]"=>"\xf0\x9f\x91\xbe", "[\xe3\x82\xa2\xe3\x82\xaf\xe3\x83\x9e]"=>"\xf0\x9f\x91\xbf",
- "[\xe3\x83\x89\xe3\x82\xaf\xe3\x83\xad]"=>"\xf0\x9f\x92\x80", "[\xe6\xa1\x88\xe5\x86\x85]"=>"\xf0\x9f\x92\x81", "[\xe8\xa1\x9b\xe5\x85\xb5]"=>"\xf0\x9f\x92\x82", "[\xe3\x83\x80\xe3\x83\xb3\xe3\x82\xb9]"=>"\xf0\x9f\x92\x83", "\xee\x9d\x8e"=>"\xf0\x9f\x90\x8c",
- "[\xe3\x83\x98\xe3\x83\x93]"=>"\xf0\x9f\x90\x8d", "\xee\x9d\x94"=>"\xf0\x9f\x90\xb4", "[\xe3\x83\x8b\xe3\x83\xaf\xe3\x83\x88\xe3\x83\xaa]"=>"\xf0\x9f\x90\x94", "[\xe3\x82\xa4\xe3\x83\x8e\xe3\x82\xb7\xe3\x82\xb7]"=>"\xf0\x9f\x90\x97", "[\xe3\x83\xa9\xe3\x82\xaf\xe3\x83\x80]"=>"\xf0\x9f\x90\xab",
- "[\xe3\x82\xbe\xe3\x82\xa6]"=>"\xf0\x9f\x90\x98", "[\xe3\x82\xb3\xe3\x82\xa2\xe3\x83\xa9]"=>"\xf0\x9f\x90\xa8", "[\xe3\x82\xb5\xe3\x83\xab]"=>"\xf0\x9f\x90\xb5", "[\xe3\x83\x92\xe3\x83\x84\xe3\x82\xb8]"=>"\xf0\x9f\x90\x91", "[\xe3\x82\xbf\xe3\x82\xb3]"=>"\xf0\x9f\x90\x99",
- "[\xe5\xb7\xbb\xe8\xb2\x9d]"=>"\xf0\x9f\x90\x9a", "[\xe3\x82\xb2\xe3\x82\xb8\xe3\x82\xb2\xe3\x82\xb8]"=>"\xf0\x9f\x90\x9b", "[\xe3\x82\xa2\xe3\x83\xaa]"=>"\xf0\x9f\x90\x9c", "[\xe3\x83\x9f\xe3\x83\x84\xe3\x83\x90\xe3\x83\x81]"=>"\xf0\x9f\x90\x9d", "[\xe3\x81\xa6\xe3\x82\x93\xe3\x81\xa8\xe3\x81\x86\xe8\x99\xab]"=>"\xf0\x9f\x90\x9e",
- "\xee\x9d\x91"=>"\xf0\x9f\x8e\xa3", "[\xe3\x82\xab\xe3\x83\xa1]"=>"\xf0\x9f\x90\xa2", "\xee\x9d\x8f"=>"\xf0\x9f\x90\xa3", "\xee\x9d\x90"=>"\xf0\x9f\x90\xa7", "\xee\x9a\xa1"=>"\xf0\x9f\x90\xba",
- "[\xe3\x82\xa4\xe3\x83\xab\xe3\x82\xab]"=>"\xf0\x9f\x90\xac", "[\xe3\x83\x8d\xe3\x82\xba\xe3\x83\x9f]"=>"\xf0\x9f\x90\xad", "[\xe3\x83\x88\xe3\x83\xa9]"=>"\xf0\x9f\x90\xaf", "\xee\x9a\xa2"=>"\xf0\x9f\x90\xb1", "[\xe3\x82\xaf\xe3\x82\xb8\xe3\x83\xa9]"=>"\xf0\x9f\x90\xb3",
- "\xee\x9d\x95"=>"\xf0\x9f\x90\xbd", "[\xe3\x82\xaf\xe3\x83\x9e]"=>"\xf0\x9f\x90\xbb", "[\xe3\x83\x8f\xe3\x83\xa0\xe3\x82\xb9\xe3\x82\xbf\xe3\x83\xbc]"=>"\xf0\x9f\x90\xb9", "[\xe7\x89\x9b]"=>"\xf0\x9f\x90\xae", "[\xe3\x82\xa6\xe3\x82\xb5\xe3\x82\xae]"=>"\xf0\x9f\x90\xb0",
- "[\xe3\x82\xab\xe3\x82\xa8\xe3\x83\xab]"=>"\xf0\x9f\x90\xb8", "\xee\x9a\x98"=>"\xf0\x9f\x91\xa3", "[\xe8\xbe\xb0]"=>"\xf0\x9f\x90\xb2", "[\xe3\x83\x91\xe3\x83\xb3\xe3\x83\x80]"=>"\xf0\x9f\x90\xbc", "\xee\x9b\xb1"=>"\xf0\x9f\x99\x8e",
- "\xee\x9b\xb3"=>"\xf0\x9f\x99\x8d", "\xee\x9b\xb4"=>"\xf0\x9f\x98\xb5", "\xee\x9b\xb2"=>"\xf0\x9f\x98\x9e", "\xee\x9c\xa3"=>"\xf0\x9f\x98\xa5", "\xee\x9c\xa5"=>"\xf0\x9f\x98\x92",
- "\xee\x9c\xa6"=>"\xf0\x9f\x98\xbb", "\xee\x9d\x93"=>"\xf0\x9f\x98\xbc", "\xee\x9d\x92"=>"\xf0\x9f\x98\x8b", "[\xe9\xa2\xa8\xe9\x82\xaa\xe3\x81\xb2\xe3\x81\x8d]"=>"\xf0\x9f\x98\xb7", "\xee\x9c\xaa"=>"\xf0\x9f\x98\xb9",
- "\xee\x9c\xa2"=>"\xf0\x9f\x98\x85", "\xee\x9c\xae"=>"\xf0\x9f\x98\xbf", "\xee\x9c\xad"=>"\xf0\x9f\x98\xad", "\xee\x9d\x97"=>"\xf0\x9f\x98\xb1", "\xee\x9c\xab"=>"\xf0\x9f\x98\xab",
- "\xee\x9c\xa4"=>"\xf0\x9f\x98\xbe", "\xee\x9c\xa1"=>"\xf0\x9f\x98\x8c", "\xee\x9c\xa0"=>"\xf0\x9f\x98\x94", "\xee\x9c\x81"=>"\xf0\x9f\x92\xa4", "\xee\x9c\xac"=>"\xf0\x9f\x98\x8f",
- "\xee\x9c\xa9"=>"\xf0\x9f\x98\x89", "\xee\x9c\xaf"=>"\xf0\x9f\x86\x96", "\xee\x9c\x8b"=>"\xf0\x9f\x91\x8c", "m(_ _)m"=>"\xf0\x9f\x99\x87", "(/_\xef\xbc\xbc)"=>"\xf0\x9f\x99\x88",
- "(\xe3\x83\xbb\xc3\x97\xe3\x83\xbb)"=>"\xf0\x9f\x99\x8a", "|(\xe3\x83\xbb\xc3\x97\xe3\x83\xbb)|"=>"\xf0\x9f\x99\x89", "(^-^)/"=>"\xf0\x9f\x99\x8b", "\xef\xbc\xbc(^o^)\xef\xbc\x8f"=>"\xf0\x9f\x99\x8c", "(>\xe4\xba\xba<)"=>"\xf0\x9f\x99\x8f",
- "\xee\x99\xa3"=>"\xf0\x9f\x8f\xa1", "\xee\x99\xa4"=>"\xf0\x9f\x8f\xa2", "\xee\x99\xa5"=>"\xf0\x9f\x93\xae", "\xee\x99\xa6"=>"\xf0\x9f\x8f\xa5", "\xee\x99\xa7"=>"\xf0\x9f\x8f\xa6",
- "\xee\x99\xa8"=>"\xf0\x9f\x8f\xa7", "\xee\x99\xa9"=>"\xf0\x9f\x8f\xa8", "\xee\x99\xa9\xee\x9b\xaf"=>"\xf0\x9f\x8f\xa9", "\xee\x99\xaa"=>"\xf0\x9f\x8f\xaa", "\xee\x9c\xbe"=>"\xf0\x9f\x8f\xab",
- "[\xe6\x95\x99\xe4\xbc\x9a]"=>"\xe2\x9b\xaa", "[\xe5\x99\xb4\xe6\xb0\xb4]"=>"\xe2\x9b\xb2", "[\xe3\x83\x87\xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88]"=>"\xf0\x9f\x8f\xac", "[\xe5\x9f\x8e]"=>"\xf0\x9f\x8f\xb0", "[\xe5\xb7\xa5\xe5\xa0\xb4]"=>"\xf0\x9f\x8f\xad",
- "\xee\x99\xa1"=>"\xf0\x9f\x9a\xa2", "\xee\x9d\x8b"=>"\xf0\x9f\x8d\xb6", "\xee\x9d\x80"=>"\xf0\x9f\x97\xbb", "[\xe6\x9d\xb1\xe4\xba\xac\xe3\x82\xbf\xe3\x83\xaf\xe3\x83\xbc]"=>"\xf0\x9f\x97\xbc", "[\xe8\x87\xaa\xe7\x94\xb1\xe3\x81\xae\xe5\xa5\xb3\xe7\xa5\x9e]"=>"\xf0\x9f\x97\xbd",
- "[\xe6\x97\xa5\xe6\x9c\xac\xe5\x9c\xb0\xe5\x9b\xb3]"=>"\xf0\x9f\x97\xbe", "[\xe3\x83\xa2\xe3\x82\xa2\xe3\x82\xa4]"=>"\xf0\x9f\x97\xbf", "\xee\x9a\x99"=>"\xf0\x9f\x91\x9f", "\xee\x99\xb4"=>"\xf0\x9f\x91\xa1", "[\xe3\x83\x96\xe3\x83\xbc\xe3\x83\x84]"=>"\xf0\x9f\x91\xa2",
- "\xee\x9a\x9a"=>"\xf0\x9f\x91\x93", "\xee\x9c\x8e"=>"\xf0\x9f\x91\x9a", "\xee\x9c\x91"=>"\xf0\x9f\x91\x96", "\xee\x9c\x9a"=>"\xf0\x9f\x94\xb1", "[\xe3\x83\x8d\xe3\x82\xaf\xe3\x82\xbf\xe3\x82\xa4]"=>"\xf0\x9f\x91\x94",
- "[\xe5\xb8\xbd\xe5\xad\x90]"=>"\xf0\x9f\x91\x92", "[\xe3\x83\x89\xe3\x83\xac\xe3\x82\xb9]"=>"\xf0\x9f\x91\x97", "[\xe7\x9d\x80\xe7\x89\xa9]"=>"\xf0\x9f\x91\x98", "[\xe3\x83\x93\xe3\x82\xad\xe3\x83\x8b]"=>"\xf0\x9f\x91\x99", "\xee\x9c\x8f"=>"\xf0\x9f\x91\x9b",
- "\xee\x9a\x82"=>"\xf0\x9f\x92\xbc", "\xee\x9a\xad"=>"\xf0\x9f\x91\x9d", "\xee\x9c\x95"=>"\xf0\x9f\x92\xb5", "[$\xef\xbf\xa5]"=>"\xf0\x9f\x92\xb1", "[\xe6\xa0\xaa\xe4\xbe\xa1]"=>"\xf0\x9f\x92\xb9",
- "[\xe3\x82\xab\xe3\x83\xbc\xe3\x83\x89]"=>"\xf0\x9f\x92\xb3", "\xee\x9b\x96"=>"\xf0\x9f\x92\xb4", "[\xe9\xa3\x9b\xe3\x82\x93\xe3\x81\xa7\xe3\x81\x84\xe3\x81\x8f\xe3\x81\x8a\xe9\x87\x91]"=>"\xf0\x9f\x92\xb8", "[\xe4\xb8\xad\xe5\x9b\xbd]"=>"\xf0\x9f\x87\xa8\xf0\x9f\x87\xb3", "[\xe3\x83\x89\xe3\x82\xa4\xe3\x83\x84]"=>"\xf0\x9f\x87\xa9\xf0\x9f\x87\xaa",
- "[\xe3\x82\xb9\xe3\x83\x9a\xe3\x82\xa4\xe3\x83\xb3]"=>"\xf0\x9f\x87\xaa\xf0\x9f\x87\xb8", "[\xe3\x83\x95\xe3\x83\xa9\xe3\x83\xb3\xe3\x82\xb9]"=>"\xf0\x9f\x87\xab\xf0\x9f\x87\xb7", "[\xe3\x82\xa4\xe3\x82\xae\xe3\x83\xaa\xe3\x82\xb9]"=>"\xf0\x9f\x87\xac\xf0\x9f\x87\xa7", "[\xe3\x82\xa4\xe3\x82\xbf\xe3\x83\xaa\xe3\x82\xa2]"=>"\xf0\x9f\x87\xae\xf0\x9f\x87\xb9", "[\xe6\x97\xa5\xe3\x81\xae\xe4\xb8\xb8]"=>"\xf0\x9f\x87\xaf\xf0\x9f\x87\xb5",
- "[\xe9\x9f\x93\xe5\x9b\xbd]"=>"\xf0\x9f\x87\xb0\xf0\x9f\x87\xb7", "[\xe3\x83\xad\xe3\x82\xb7\xe3\x82\xa2]"=>"\xf0\x9f\x87\xb7\xf0\x9f\x87\xba", "[USA]"=>"\xf0\x9f\x87\xba\xf0\x9f\x87\xb8", "[\xe7\x82\x8e]"=>"\xf0\x9f\x94\xa5", "\xee\x9b\xbb"=>"\xf0\x9f\x92\xa1",
- "\xee\x9c\x98"=>"\xf0\x9f\x94\xa7", "[\xe3\x83\x8f\xe3\x83\xb3\xe3\x83\x9e\xe3\x83\xbc]"=>"\xf0\x9f\x94\xa8", "[\xe3\x83\x8d\xe3\x82\xb8]"=>"\xf0\x9f\x94\xa9", "[\xe5\x8c\x85\xe4\xb8\x81]"=>"\xf0\x9f\x94\xaa", "[\xe3\x83\x94\xe3\x82\xb9\xe3\x83\x88\xe3\x83\xab]"=>"\xf0\x9f\x94\xab",
- "[\xe5\x8d\xa0\xe3\x81\x84]"=>"\xf0\x9f\x94\xaf", "[\xe8\x8b\xa5\xe8\x91\x89\xe3\x83\x9e\xe3\x83\xbc\xe3\x82\xaf]"=>"\xf0\x9f\x94\xb0", "[\xe6\xb3\xa8\xe5\xb0\x84]"=>"\xf0\x9f\x92\x89", "[\xe8\x96\xac]"=>"\xf0\x9f\x92\x8a", "[A]"=>"\xf0\x9f\x85\xb0",
- "[B]"=>"\xf0\x9f\x85\xb1", "[AB]"=>"\xf0\x9f\x86\x8e", "[O]"=>"\xf0\x9f\x85\xbe", "\xee\x9a\x84"=>"\xf0\x9f\x8e\x80", "\xee\x9a\x85"=>"\xf0\x9f\x93\xa6",
- "\xee\x9a\x86"=>"\xf0\x9f\x8e\x82", "\xee\x9a\xa4"=>"\xf0\x9f\x8e\x84", "[\xe3\x82\xb5\xe3\x83\xb3\xe3\x82\xbf]"=>"\xf0\x9f\x8e\x85", "[\xe7\xa5\x9d\xe6\x97\xa5]"=>"\xf0\x9f\x8e\x8c", "[\xe8\x8a\xb1\xe7\x81\xab]"=>"\xf0\x9f\x8e\x86",
- "[\xe9\xa2\xa8\xe8\x88\xb9]"=>"\xf0\x9f\x8e\x88", "[\xe3\x82\xaf\xe3\x83\xa9\xe3\x83\x83\xe3\x82\xab\xe3\x83\xbc]"=>"\xf0\x9f\x8e\x89", "[\xe9\x96\x80\xe6\x9d\xbe]"=>"\xf0\x9f\x8e\x8d", "[\xe3\x81\xb2\xe3\x81\xaa\xe7\xa5\xad\xe3\x82\x8a]"=>"\xf0\x9f\x8e\x8e", "[\xe5\x8d\x92\xe6\xa5\xad\xe5\xbc\x8f]"=>"\xf0\x9f\x8e\x93",
- "[\xe3\x83\xa9\xe3\x83\xb3\xe3\x83\x89\xe3\x82\xbb\xe3\x83\xab]"=>"\xf0\x9f\x8e\x92", "[\xe3\x81\x93\xe3\x81\x84\xe3\x81\xae\xe3\x81\xbc\xe3\x82\x8a]"=>"\xf0\x9f\x8e\x8f", "[\xe7\xb7\x9a\xe9\xa6\x99\xe8\x8a\xb1\xe7\x81\xab]"=>"\xf0\x9f\x8e\x87", "[\xe9\xa2\xa8\xe9\x88\xb4]"=>"\xf0\x9f\x8e\x90", "[\xe3\x83\x8f\xe3\x83\xad\xe3\x82\xa6\xe3\x82\xa3\xe3\x83\xb3]"=>"\xf0\x9f\x8e\x83",
- "[\xe3\x82\xaa\xe3\x83\xa1\xe3\x83\x87\xe3\x83\x88\xe3\x82\xa6]"=>"\xf0\x9f\x8e\x8a", "[\xe4\xb8\x83\xe5\xa4\x95]"=>"\xf0\x9f\x8e\x8b", "[\xe3\x81\x8a\xe6\x9c\x88\xe8\xa6\x8b]"=>"\xf0\x9f\x8e\x91", "\xee\x99\x9a"=>"\xf0\x9f\x93\x9f", "\xee\x9a\x87"=>"\xf0\x9f\x93\x9e",
- "\xee\x9a\x88"=>"\xf0\x9f\x93\xb1", "\xee\x9b\x8e"=>"\xf0\x9f\x93\xb2", "\xee\x9a\x89"=>"\xf0\x9f\x93\x91", "\xee\x9b\x90"=>"\xf0\x9f\x93\xa0", "\xee\x9b\x93"=>"\xf0\x9f\x93\xa7",
- "\xee\x9b\x8f"=>"\xf0\x9f\x93\xa9", "[\xe6\x96\xb0\xe8\x81\x9e]"=>"\xf0\x9f\x93\xb0", "[\xe3\x82\xb9\xe3\x83\x94\xe3\x83\xbc\xe3\x82\xab]"=>"\xf0\x9f\x94\x8a", "[\xe3\x83\xa1\xe3\x82\xac\xe3\x83\x9b\xe3\x83\xb3]"=>"\xf0\x9f\x93\xa3", "[\xe3\x82\xa2\xe3\x83\xb3\xe3\x83\x86\xe3\x83\x8a]"=>"\xf0\x9f\x93\xa1",
- "[\xe9\x80\x81\xe4\xbf\xa1BOX]"=>"\xf0\x9f\x93\xa4", "[\xe5\x8f\x97\xe4\xbf\xa1BOX]"=>"\xf0\x9f\x93\xa5", "[ABCD]"=>"\xf0\x9f\x94\xa0", "[abcd]"=>"\xf0\x9f\x94\xa1", "[1234]"=>"\xf0\x9f\x94\xa2",
- "[\xe8\xa8\x98\xe5\x8f\xb7]"=>"\xf0\x9f\x94\xa3", "[ABC]"=>"\xf0\x9f\x94\xa4", "\xee\x9a\xae"=>"\xe2\x9c\x92", "\xee\x9a\xb2"=>"\xf0\x9f\x92\xba", "\xee\x9c\x96"=>"\xf0\x9f\x92\xbb",
- "\xee\x9c\x99"=>"\xe2\x9c\x8f", "\xee\x9c\xb0"=>"\xf0\x9f\x93\x8e", "[MD]"=>"\xf0\x9f\x92\xbd", "[\xe3\x83\x95\xe3\x83\xad\xe3\x83\x83\xe3\x83\x94\xe3\x83\xbc]"=>"\xf0\x9f\x92\xbe", "\xee\x9a\x8c"=>"\xf0\x9f\x93\x80",
- "[\xe7\x94\xbb\xe3\x81\xb3\xe3\x82\x87\xe3\x81\x86]"=>"\xf0\x9f\x93\x8c", "[\xe3\x82\xab\xe3\x83\xac\xe3\x83\xb3\xe3\x83\x80\xe3\x83\xbc]"=>"\xf0\x9f\x93\x86", "[\xe3\x83\x95\xe3\x82\xa9\xe3\x83\xab\xe3\x83\x80]"=>"\xf0\x9f\x93\x82", "\xee\x9a\x83"=>"\xf0\x9f\x93\x92", "[\xe5\x90\x8d\xe6\x9c\xad]"=>"\xf0\x9f\x93\x9b",
- "\xee\x9c\x8a"=>"\xe2\x9e\xb0", "[\xe3\x82\xb0\xe3\x83\xa9\xe3\x83\x95]"=>"\xf0\x9f\x93\x89", "[\xe5\xae\x9a\xe8\xa6\x8f]"=>"\xf0\x9f\x93\x8f", "[\xe4\xb8\x89\xe8\xa7\x92\xe5\xae\x9a\xe8\xa6\x8f]"=>"\xf0\x9f\x93\x90", "\xee\x99\x92"=>"\xf0\x9f\x8e\xbd",
- "\xee\x99\x93"=>"\xe2\x9a\xbe", "\xee\x99\x94"=>"\xe2\x9b\xb3", "\xee\x99\x95"=>"\xf0\x9f\x8e\xbe", "\xee\x99\x96"=>"\xe2\x9a\xbd", "\xee\x99\x97"=>"\xf0\x9f\x8e\xbf",
- "\xee\x99\x98"=>"\xf0\x9f\x8f\x80", "\xee\x99\x99"=>"\xf0\x9f\x8f\x81", "\xee\x9c\x92"=>"\xf0\x9f\x8f\x84", "\xee\x9c\xb3"=>"\xf0\x9f\x9a\xb6", "[\xe3\x83\x88\xe3\x83\xad\xe3\x83\x95\xe3\x82\xa3\xe3\x83\xbc]"=>"\xf0\x9f\x8f\x86",
- "[\xe3\x83\x95\xe3\x83\x83\xe3\x83\x88\xe3\x83\x9c\xe3\x83\xbc\xe3\x83\xab]"=>"\xf0\x9f\x8f\x88", "[\xe6\xb0\xb4\xe6\xb3\xb3]"=>"\xf0\x9f\x8f\x8a", "\xee\x99\x9b"=>"\xf0\x9f\x9a\x83", "\xee\x99\x9c"=>"\xe2\x93\x82", "\xee\x99\x9d"=>"\xf0\x9f\x9a\x85",
- "\xee\x99\x9e"=>"\xf0\x9f\x9a\x95", "\xee\x99\x9f"=>"\xf0\x9f\x9a\x99", "\xee\x99\xa0"=>"\xf0\x9f\x9a\x8c", "[\xe3\x83\x90\xe3\x82\xb9\xe5\x81\x9c]"=>"\xf0\x9f\x9a\x8f", "\xee\x99\xa2"=>"\xe2\x9c\x88",
- "\xee\x9a\xa3"=>"\xf0\x9f\x9a\xa4", "[\xe9\xa7\x85]"=>"\xf0\x9f\x9a\x89", "[\xe3\x83\xad\xe3\x82\xb1\xe3\x83\x83\xe3\x83\x88]"=>"\xf0\x9f\x9a\x80", "[\xe3\x83\x88\xe3\x83\xa9\xe3\x83\x83\xe3\x82\xaf]"=>"\xf0\x9f\x9a\x9a", "[\xe6\xb6\x88\xe9\x98\xb2\xe8\xbb\x8a]"=>"\xf0\x9f\x9a\x92",
- "[\xe6\x95\x91\xe6\x80\xa5\xe8\xbb\x8a]"=>"\xf0\x9f\x9a\x91", "[\xe3\x83\x91\xe3\x83\x88\xe3\x82\xab\xe3\x83\xbc]"=>"\xf0\x9f\x9a\xa8", "\xee\x99\xab"=>"\xe2\x9b\xbd", "\xee\x99\xac"=>"\xf0\x9f\x85\xbf", "\xee\x99\xad"=>"\xf0\x9f\x9a\xa5",
- "[\xe5\xb7\xa5\xe4\xba\x8b\xe4\xb8\xad]"=>"\xf0\x9f\x9a\xa7", "\xee\x9b\xb7"=>"\xf0\x9f\x9b\x80", "[\xe3\x82\xad\xe3\x83\xa3\xe3\x83\xb3\xe3\x83\x97]"=>"\xe2\x9b\xba", "\xee\x99\xb9"=>"\xf0\x9f\x8e\xa0", "[\xe8\xa6\xb3\xe8\xa6\xa7\xe8\xbb\x8a]"=>"\xf0\x9f\x8e\xa1",
- "[\xe3\x82\xb8\xe3\x82\xa7\xe3\x83\x83\xe3\x83\x88\xe3\x82\xb3\xe3\x83\xbc\xe3\x82\xb9\xe3\x82\xbf\xe3\x83\xbc]"=>"\xf0\x9f\x8e\xa2", "\xee\x99\xb6"=>"\xf0\x9f\x8e\xa4", "\xee\x99\xb7"=>"\xf0\x9f\x93\xb9", "\xee\x99\xba"=>"\xf0\x9f\x8e\xa7", "\xee\x99\xbb"=>"\xf0\x9f\x8e\xa8",
- "\xee\x99\xbc"=>"\xf0\x9f\x8e\xa9", "\xee\x99\xbd"=>"\xf0\x9f\x8e\xaa", "\xee\x99\xbe"=>"\xf0\x9f\x8e\xab", "\xee\x9a\xac"=>"\xf0\x9f\x8e\xac", "[\xe6\xbc\x94\xe5\x8a\x87]"=>"\xf0\x9f\x8e\xad",
- "\xee\x9a\x8b"=>"\xf0\x9f\x8e\xae", "[\xe9\xba\xbb\xe9\x9b\x80]"=>"\xf0\x9f\x80\x84", "[\xe7\x9a\x84\xe4\xb8\xad]"=>"\xf0\x9f\x8e\xaf", "[777]"=>"\xf0\x9f\x8e\xb0", "[\xe3\x83\x93\xe3\x83\xaa\xe3\x83\xa4\xe3\x83\xbc\xe3\x83\x89]"=>"\xf0\x9f\x8e\xb1",
- "[\xe3\x82\xb5\xe3\x82\xa4\xe3\x82\xb3\xe3\x83\xad]"=>"\xf0\x9f\x8e\xb2", "[\xe3\x83\x9c\xe3\x83\xbc\xe3\x83\xaa\xe3\x83\xb3\xe3\x82\xb0]"=>"\xf0\x9f\x8e\xb3", "[\xe8\x8a\xb1\xe6\x9c\xad]"=>"\xf0\x9f\x8e\xb4", "[\xe3\x82\xb8\xe3\x83\xa7\xe3\x83\xbc\xe3\x82\xab\xe3\x83\xbc]"=>"\xf0\x9f\x83\x8f", "\xee\x9b\xb6"=>"\xf0\x9f\x8e\xb5",
- "\xee\x9b\xbf"=>"\xf0\x9f\x8e\xbc", "[\xe3\x82\xb5\xe3\x83\x83\xe3\x82\xaf\xe3\x82\xb9]"=>"\xf0\x9f\x8e\xb7", "[\xe3\x82\xae\xe3\x82\xbf\xe3\x83\xbc]"=>"\xf0\x9f\x8e\xb8", "[\xe3\x83\x94\xe3\x82\xa2\xe3\x83\x8e]"=>"\xf0\x9f\x8e\xb9", "[\xe3\x83\x88\xe3\x83\xa9\xe3\x83\xb3\xe3\x83\x9a\xe3\x83\x83\xe3\x83\x88]"=>"\xf0\x9f\x8e\xba",
- "[\xe3\x83\x90\xe3\x82\xa4\xe3\x82\xaa\xe3\x83\xaa\xe3\x83\xb3]"=>"\xf0\x9f\x8e\xbb", "[\xe6\xad\x8c\xe8\xa8\x98\xe5\x8f\xb7]"=>"\xe3\x80\xbd", "\xee\x9a\x81"=>"\xf0\x9f\x93\xb7", "\xee\x9a\x8a"=>"\xf0\x9f\x93\xba", "[\xe3\x83\xa9\xe3\x82\xb8\xe3\x82\xaa]"=>"\xf0\x9f\x93\xbb",
- "[\xe3\x83\x93\xe3\x83\x87\xe3\x82\xaa]"=>"\xf0\x9f\x93\xbc", "\xee\x9c\x97"=>"\xf0\x9f\x92\x8c", "\xee\x9c\x9b"=>"\xf0\x9f\x92\x8e", "[\xe8\x8a\xb1\xe6\x9d\x9f]"=>"\xf0\x9f\x92\x90", "\xee\x9b\xad"=>"\xf0\x9f\x92\x9e",
- "[\xe7\xb5\x90\xe5\xa9\x9a\xe5\xbc\x8f]"=>"\xf0\x9f\x92\x92", "[18\xe7\xa6\x81]"=>"\xf0\x9f\x94\x9e", "\xee\x9c\xb1"=>"\xc2\xa9", "\xee\x9c\xb6"=>"\xc2\xae", "\xee\x9c\xb2"=>"\xe2\x84\xa2",
- "[\xef\xbd\x89]"=>"\xe2\x84\xb9", "\xee\x9b\xa0"=>"#\xe2\x83\xa3", "\xee\x9b\xa2"=>"1\xe2\x83\xa3", "\xee\x9b\xa3"=>"2\xe2\x83\xa3", "\xee\x9b\xa4"=>"3\xe2\x83\xa3",
- "\xee\x9b\xa5"=>"4\xe2\x83\xa3", "\xee\x9b\xa6"=>"5\xe2\x83\xa3", "\xee\x9b\xa7"=>"6\xe2\x83\xa3", "\xee\x9b\xa8"=>"7\xe2\x83\xa3", "\xee\x9b\xa9"=>"8\xe2\x83\xa3",
- "\xee\x9b\xaa"=>"9\xe2\x83\xa3", "\xee\x9b\xab"=>"0\xe2\x83\xa3", "[10]"=>"\xf0\x9f\x94\x9f", "[\xe3\x83\x90\xe3\x83\xaa3]"=>"\xf0\x9f\x93\xb6", "[\xe3\x83\x9e\xe3\x83\x8a\xe3\x83\xbc\xe3\x83\xa2\xe3\x83\xbc\xe3\x83\x89]"=>"\xf0\x9f\x93\xb3",
- "[\xe3\x82\xb1\xe3\x83\xbc\xe3\x82\xbf\xe3\x82\xa4OFF]"=>"\xf0\x9f\x93\xb4", "\xee\x99\xb3"=>"\xf0\x9f\x8d\x94", "\xee\x9d\x89"=>"\xf0\x9f\x8d\x99", "\xee\x9d\x8a"=>"\xf0\x9f\x8d\xb0", "\xee\x9d\x8c"=>"\xf0\x9f\x8d\x9a",
- "\xee\x9d\x8d"=>"\xf0\x9f\x8d\x9e", "[\xe3\x83\x95\xe3\x83\xa9\xe3\x82\xa4\xe3\x83\x91\xe3\x83\xb3]"=>"\xf0\x9f\x8d\xb3", "[\xe3\x82\xbd\xe3\x83\x95\xe3\x83\x88\xe3\x82\xaf\xe3\x83\xaa\xe3\x83\xbc\xe3\x83\xa0]"=>"\xf0\x9f\x8d\xa6", "[\xe3\x83\x9d\xe3\x83\x86\xe3\x83\x88]"=>"\xf0\x9f\x8d\x9f", "[\xe3\x81\xa0\xe3\x82\x93\xe3\x81\x94]"=>"\xf0\x9f\x8d\xa1",
- "[\xe3\x81\x9b\xe3\x82\x93\xe3\x81\xb9\xe3\x81\x84]"=>"\xf0\x9f\x8d\x98", "[\xe3\x83\x91\xe3\x82\xb9\xe3\x82\xbf]"=>"\xf0\x9f\x8d\x9d", "[\xe3\x82\xab\xe3\x83\xac\xe3\x83\xbc]"=>"\xf0\x9f\x8d\x9b", "[\xe3\x81\x8a\xe3\x81\xa7\xe3\x82\x93]"=>"\xf0\x9f\x8d\xa2", "[\xe3\x81\x99\xe3\x81\x97]"=>"\xf0\x9f\x8d\xa3",
- "[\xe5\xbc\x81\xe5\xbd\x93]"=>"\xf0\x9f\x8d\xb1", "[\xe9\x8d\x8b]"=>"\xf0\x9f\x8d\xb2", "[\xe3\x82\xab\xe3\x82\xad\xe6\xb0\xb7]"=>"\xf0\x9f\x8d\xa7", "[\xe8\x82\x89]"=>"\xf0\x9f\x8d\x96", "[\xe3\x82\x84\xe3\x81\x8d\xe3\x81\x84\xe3\x82\x82]"=>"\xf0\x9f\x8d\xa0",
- "[\xe3\x83\x94\xe3\x82\xb6]"=>"\xf0\x9f\x8d\x95", "[\xe3\x83\x81\xe3\x82\xad\xe3\x83\xb3]"=>"\xf0\x9f\x8d\x97", "[\xe3\x82\xa2\xe3\x82\xa4\xe3\x82\xb9\xe3\x82\xaf\xe3\x83\xaa\xe3\x83\xbc\xe3\x83\xa0]"=>"\xf0\x9f\x8d\xa8", "[\xe3\x83\x89\xe3\x83\xbc\xe3\x83\x8a\xe3\x83\x84]"=>"\xf0\x9f\x8d\xa9", "[\xe3\x82\xaf\xe3\x83\x83\xe3\x82\xad\xe3\x83\xbc]"=>"\xf0\x9f\x8d\xaa",
- "[\xe3\x83\x81\xe3\x83\xa7\xe3\x82\xb3]"=>"\xf0\x9f\x8d\xab", "[\xe3\x82\xad\xe3\x83\xa3\xe3\x83\xb3\xe3\x83\x87\xe3\x82\xa3]"=>"\xf0\x9f\x8d\xad", "[\xe3\x83\x97\xe3\x83\xaa\xe3\x83\xb3]"=>"\xf0\x9f\x8d\xae", "[\xe3\x83\x8f\xe3\x83\x81\xe3\x83\x9f\xe3\x83\x84]"=>"\xf0\x9f\x8d\xaf", "[\xe3\x82\xa8\xe3\x83\x93\xe3\x83\x95\xe3\x83\xa9\xe3\x82\xa4]"=>"\xf0\x9f\x8d\xa4",
- "\xee\x99\xaf"=>"\xf0\x9f\x8d\xb4", "\xee\x99\xb0"=>"\xe2\x98\x95", "\xee\x99\xb1"=>"\xf0\x9f\x8d\xb9", "\xee\x99\xb2"=>"\xf0\x9f\x8d\xbb", "\xee\x9c\x9e"=>"\xf0\x9f\x8d\xb5",
- "\xee\x9d\x96"=>"\xf0\x9f\x8d\xb7", "\xee\x99\xb8"=>"\xe2\x86\x97", "\xee\x9a\x96"=>"\xe2\x86\x98", "\xee\x9a\x97"=>"\xe2\x86\x96", "\xee\x9a\xa5"=>"\xe2\x86\x99",
- "\xee\x9b\xb5"=>"\xe2\xa4\xb4", "\xee\x9c\x80"=>"\xf0\x9f\x91\x8e", "\xee\x9c\xbc"=>"\xe2\x86\x94", "\xee\x9c\xbd"=>"\xe2\x86\x95", "[\xe2\x86\x91]"=>"\xf0\x9f\x91\x86",
- "[\xe2\x86\x93]"=>"\xf0\x9f\x91\x87", "[\xe2\x86\x92]"=>"\xf0\x9f\x91\x89", "[\xe2\x86\x90]"=>"\xf0\x9f\x91\x88", "[>]"=>"\xe2\x96\xb6", "[<]"=>"\xe2\x97\x80",
- "[>>]"=>"\xe2\x8f\xa9", "[<<]"=>"\xe2\x8f\xaa", "\xe2\x96\xb2"=>"\xf0\x9f\x94\xbc", "\xe2\x96\xbc"=>"\xf0\x9f\x94\xbd", "[\xc3\x97]"=>"\xe2\x9c\x96",
- "\xee\x9c\x82"=>"\xe2\x9d\x95", "\xee\x9c\x83"=>"\xe2\x81\x89", "\xee\x9c\x84"=>"\xe2\x80\xbc", "[\xef\xbc\x9f]"=>"\xe2\x9d\x94", "\xee\x9c\x89"=>"\xe3\x80\xb0",
- "\xee\x9b\x9f"=>"\xe2\x9e\xbf", "\xee\x9b\xac"=>"\xf0\x9f\x92\x9d", "\xee\x9b\xae"=>"\xf0\x9f\x92\x94", "\xee\x9b\xaf"=>"\xf0\x9f\x92\x95", "\xee\x9b\xb8"=>"\xe2\x9c\xb3",
- "\xee\x9a\x8d"=>"\xe2\x99\xa5", "\xee\x9a\x8e"=>"\xe2\x99\xa0", "\xee\x9a\x8f"=>"\xe2\x99\xa6", "\xee\x9a\x90"=>"\xe2\x99\xa3", "\xee\x99\xbf"=>"\xf0\x9f\x9a\xac",
- "\xee\x9a\x80"=>"\xf0\x9f\x9a\xad", "\xee\x9a\x9b"=>"\xe2\x99\xbf", "\xee\x9b\x9e"=>"\xf0\x9f\x9a\xa9", "\xee\x9c\xb7"=>"\xe2\x9a\xa0", "\xee\x9c\xb5"=>"\xf0\x9f\x94\x83",
- "\xee\x9c\x9d"=>"\xf0\x9f\x9a\xb2", "[\xe2\x99\x82]"=>"\xf0\x9f\x9a\xb9", "[\xe2\x99\x80]"=>"\xf0\x9f\x9a\xba", "\xee\x99\xae"=>"\xf0\x9f\x9a\xbe", "\xee\x9c\x94"=>"\xf0\x9f\x9a\xaa",
- "\xee\x9c\xb8"=>"\xf0\x9f\x88\xb2", "[\xe3\x83\x81\xe3\x82\xa7\xe3\x83\x83\xe3\x82\xaf\xe3\x83\x9e\xe3\x83\xbc\xe3\x82\xaf]"=>"\xe2\x9c\x85", "\xee\x9b\x9b"=>"\xf0\x9f\x86\x91", "[COOL]"=>"\xf0\x9f\x86\x92", "\xee\x9b\x97"=>"\xf0\x9f\x86\x93",
- "\xee\x9b\x98"=>"\xf0\x9f\x86\x94", "\xee\x9b\x9d"=>"\xf0\x9f\x86\x95", "[SOS]"=>"\xf0\x9f\x86\x98", "[UP!]"=>"\xf0\x9f\x86\x99", "[VS]"=>"\xf0\x9f\x86\x9a",
- "[\xe3\x82\xb3\xe3\x82\xb3]"=>"\xf0\x9f\x88\x81", "[\xe3\x82\xb5\xe3\x83\xbc\xe3\x83\x93\xe3\x82\xb9]"=>"\xf0\x9f\x88\x82", "\xee\x9c\xb9"=>"\xf0\x9f\x88\xb3", "\xee\x9c\xba"=>"\xf0\x9f\x88\xb4", "\xee\x9c\xbb"=>"\xf0\x9f\x88\xb5",
- "[\xe6\x9c\x89]"=>"\xf0\x9f\x88\xb6", "[\xe7\x84\xa1]"=>"\xf0\x9f\x88\x9a", "[\xe6\x9c\x88]"=>"\xf0\x9f\x88\xb7", "[\xe7\x94\xb3]"=>"\xf0\x9f\x88\xb8", "[\xe5\x89\xb2]"=>"\xf0\x9f\x88\xb9",
- "[\xe6\x8c\x87]"=>"\xf0\x9f\x88\xaf", "[\xe5\x96\xb6]"=>"\xf0\x9f\x88\xba", "\xee\x9c\xb4"=>"\xe3\x8a\x99", "[\xe7\xa5\x9d]"=>"\xe3\x8a\x97", "[\xe5\xbe\x97]"=>"\xf0\x9f\x89\x90",
- "[\xe5\x8f\xaf]"=>"\xf0\x9f\x89\x91", "[\xef\xbc\x8b]"=>"\xe2\x9e\x95", "[\xef\xbc\x8d]"=>"\xe2\x9e\x96", "[\xc3\xb7]"=>"\xe2\x9e\x97", "\xee\x9b\xbc"=>"\xf0\x9f\x92\xa2",
- "\xee\x9b\xbe"=>"\xf0\x9f\x92\xa3", "\xee\x9c\x85"=>"\xf0\x9f\x92\xa5", "\xee\x9c\x86"=>"\xf0\x9f\x92\xa6", "\xee\x9c\x87"=>"\xf0\x9f\x92\xa7", "\xee\x9c\x88"=>"\xf0\x9f\x92\xa8",
- "[\xe3\x82\xa6\xe3\x83\xb3\xe3\x83\x81]"=>"\xf0\x9f\x92\xa9", "[\xe5\x8a\x9b\xe3\x81\x93\xe3\x81\xb6]"=>"\xf0\x9f\x92\xaa", "[\xe3\x82\xaf\xe3\x83\xa9\xe3\x82\xaf\xe3\x83\xa9]"=>"\xf0\x9f\x92\xab", "[\xe3\x83\x95\xe3\x82\xad\xe3\x83\x80\xe3\x82\xb7]"=>"\xf0\x9f\x92\xac", "\xee\x9b\xba"=>"\xe2\x9d\x87",
- "\xe2\x96\xa0"=>"\xe2\x97\xbc", "\xe2\x97\x86"=>"\xf0\x9f\x94\xb9", "[\xe8\x8a\xb1\xe4\xb8\xb8]"=>"\xf0\x9f\x92\xae", "[100\xe7\x82\xb9]"=>"\xf0\x9f\x92\xaf", "\xee\x9b\x9a"=>"\xe2\x86\xa9",
- "\xe2\x94\x94\xe2\x86\x92"=>"\xe2\x86\xaa", "[\xe9\x9b\xbb\xe6\xb1\xa0]"=>"\xf0\x9f\x94\x8b", "[\xe3\x82\xb3\xe3\x83\xb3\xe3\x82\xbb\xe3\x83\xb3\xe3\x83\x88]"=>"\xf0\x9f\x94\x8c", "\xee\x9b\x9c"=>"\xf0\x9f\x94\x8e", "\xee\x9b\x99"=>"\xf0\x9f\x94\x91",
- "\xee\x9c\x93"=>"\xf0\x9f\x94\x94", "[\xe3\x83\xa9\xe3\x82\xb8\xe3\x82\xaa\xe3\x83\x9c\xe3\x82\xbf\xe3\x83\xb3]"=>"\xf0\x9f\x94\x98", "[\xe3\x83\x96\xe3\x83\x83\xe3\x82\xaf\xe3\x83\x9e\xe3\x83\xbc\xe3\x82\xaf]"=>"\xf0\x9f\x94\x96", "[\xe3\x83\xaa\xe3\x83\xb3\xe3\x82\xaf]"=>"\xf0\x9f\x94\x97", "[\xe2\x86\x90BACK]"=>"\xf0\x9f\x94\x99",
- "\xee\x9a\xb9"=>"\xf0\x9f\x94\x9a", "\xee\x9a\xb8"=>"\xf0\x9f\x94\x9b", "\xee\x9a\xb7"=>"\xf0\x9f\x94\x9c", "[TOP]"=>"\xf0\x9f\x94\x9d", "\xee\x9a\x93"=>"\xe2\x9c\x8a",
- "\xee\x9a\x95"=>"\xf0\x9f\x91\x90", "\xee\x9a\x94"=>"\xe2\x9c\x8c", "\xee\x9b\xbd"=>"\xf0\x9f\x91\x8a", "\xee\x9c\xa7"=>"\xf0\x9f\x91\x8d", "[\xe4\xba\xba\xe5\xb7\xae\xe3\x81\x97\xe6\x8c\x87]"=>"\xe2\x98\x9d",
- "[\xe6\x8b\x8d\xe6\x89\x8b]"=>"\xf0\x9f\x91\x8f",
- ),
- 'kddi_to_unified' => array(
- "\xee\x92\x88"=>"\xe2\x98\x80", "\xee\x92\x8d"=>"\xe2\x98\x81", "\xee\x92\x8c"=>"\xe2\x98\x94", "\xee\x92\x85"=>"\xe2\x9b\x84",
- "\xee\x92\x87"=>"\xe2\x9a\xa1", "\xee\x91\xa9"=>"\xf0\x9f\x8c\x80", "\xee\x96\x98"=>"\xf0\x9f\x8c\x81", "\xee\xab\xa8"=>"\xf0\x9f\x8c\x82", "\xee\xab\xb1"=>"\xf0\x9f\x8c\x83",
- "\xee\xab\xb4"=>"\xf0\x9f\x8c\x85", "\xee\x97\x9a"=>"\xf0\x9f\x8c\x87", "\xee\xab\xb2"=>"\xf0\x9f\x8c\x88", "\xee\x92\x8a"=>"\xe2\x9d\x84", "\xee\x92\x8e"=>"\xe2\x9b\x85",
- "\xee\x92\xbf"=>"\xf0\x9f\x8c\x89", "\xee\xad\xbc"=>"\xf0\x9f\x8c\x8a", "\xee\xad\x93"=>"\xf0\x9f\x8c\x8b", "\xee\xad\x9f"=>"\xf0\x9f\x8c\x8c", "\xee\x96\xb3"=>"\xf0\x9f\x8c\x8f",
- "\xee\x96\xa8"=>"\xf0\x9f\x8c\x91", "\xee\x96\xa9"=>"\xf0\x9f\x8c\x94", "\xee\x96\xaa"=>"\xf0\x9f\x8c\x93", "\xee\x92\x86"=>"\xf0\x9f\x8c\x99", "\xe2\x97\x8b"=>"\xf0\x9f\x8c\x95",
- "\xee\x92\x89"=>"\xf0\x9f\x8c\x9b", "\xee\x92\x8b"=>"\xe2\xad\x90", "\xee\x91\xa8"=>"\xf0\x9f\x8c\xa0", "\xee\x96\x94"=>"\xe2\x8f\xb0", "\xee\x95\xba"=>"\xe2\x8c\x9a",
- "\xee\x95\xbb"=>"\xe2\x8c\x9b", "\xee\x91\xbc"=>"\xe2\x8f\xb3", "\xee\x92\x8f"=>"\xf0\x9f\x90\x91", "\xee\x92\x90"=>"\xe2\x99\x89", "\xee\x92\x91"=>"\xe2\x99\x8a",
- "\xee\x92\x92"=>"\xe2\x99\x8b", "\xee\x92\x93"=>"\xe2\x99\x8c", "\xee\x92\x94"=>"\xe2\x99\x8d", "\xee\x92\x95"=>"\xe2\x99\x8e", "\xee\x92\x96"=>"\xe2\x99\x8f",
- "\xee\x92\x97"=>"\xe2\x99\x90", "\xee\x92\x98"=>"\xe2\x99\x91", "\xee\x92\x99"=>"\xe2\x99\x92", "\xee\x92\x9a"=>"\xf0\x9f\x90\x9f", "\xee\x92\x9b"=>"\xe2\x9b\x8e",
- "\xee\x94\x93"=>"\xf0\x9f\x8d\x80", "\xee\x93\xa4"=>"\xf0\x9f\x8c\xb7", "\xee\xad\xbd"=>"\xf0\x9f\x8c\xb1", "\xee\x93\x8e"=>"\xf0\x9f\x8d\x81", "\xee\x93\x8a"=>"\xf0\x9f\x8c\xb8",
- "\xee\x96\xba"=>"\xf0\x9f\x8c\xb9", "\xee\x97\x8d"=>"\xf0\x9f\x8d\x83", "\xee\xaa\x94"=>"\xf0\x9f\x8c\xba", "\xee\x93\xa3"=>"\xf0\x9f\x8c\xbb", "\xee\x93\xa2"=>"\xf0\x9f\x8c\xb4",
- "\xee\xaa\x96"=>"\xf0\x9f\x8c\xb5", "[\xe7\xa8\xb2\xe7\xa9\x82]"=>"\xf0\x9f\x8c\xbe", "\xee\xac\xb6"=>"\xf0\x9f\x8c\xbd", "\xee\xac\xb7"=>"\xf0\x9f\x8d\x84", "\xee\xac\xb8"=>"\xf0\x9f\x8c\xb0",
- "\xee\xad\x89"=>"\xf0\x9f\x8c\xbc", "\xee\xae\x82"=>"\xf0\x9f\x8c\xbf", "\xee\x93\x92"=>"\xf0\x9f\x8d\x92", "\xee\xac\xb5"=>"\xf0\x9f\x8d\x8c", "\xee\xaa\xb9"=>"\xf0\x9f\x8d\x8e",
- "\xee\xaa\xba"=>"\xf0\x9f\x8d\x8a", "\xee\x93\x94"=>"\xf0\x9f\x8d\x93", "\xee\x93\x8d"=>"\xf0\x9f\x8d\x89", "\xee\xaa\xbb"=>"\xf0\x9f\x8d\x85", "\xee\xaa\xbc"=>"\xf0\x9f\x8d\x86",
- "\xee\xac\xb2"=>"\xf0\x9f\x8d\x88", "\xee\xac\xb3"=>"\xf0\x9f\x8d\x8d", "\xee\xac\xb4"=>"\xf0\x9f\x8d\x87", "\xee\xac\xb9"=>"\xf0\x9f\x8d\x91", "\xee\xad\x9a"=>"\xf0\x9f\x8d\x8f",
- "\xee\x96\xa4"=>"\xf0\x9f\x91\x80", "\xee\x96\xa5"=>"\xf0\x9f\x91\x82", "\xee\xab\x90"=>"\xf0\x9f\x91\x83", "\xee\xab\x91"=>"\xf0\x9f\x91\x84", "\xee\xad\x87"=>"\xf0\x9f\x91\x85",
- "\xee\x94\x89"=>"\xf0\x9f\x92\x84", "\xee\xaa\xa0"=>"\xf0\x9f\x92\x85", "\xee\x94\x8b"=>"\xf0\x9f\x92\x86", "\xee\xaa\xa1"=>"\xf0\x9f\x92\x87", "\xee\xaa\xa2"=>"\xf0\x9f\x92\x88",
- "\xe3\x80\x93"=>"\xf0\x9f\x92\xa0", "\xee\x93\xbc"=>"\xf0\x9f\x91\xa8", "\xee\x93\xba"=>"\xf0\x9f\x91\xa9", "\xee\x94\x81"=>"\xf0\x9f\x91\xaa", "[\xe3\x82\xab\xe3\x83\x83\xe3\x83\x97\xe3\x83\xab]"=>"\xf0\x9f\x91\xab",
- "\xee\x97\x9d"=>"\xf0\x9f\x91\xae", "\xee\xab\x9b"=>"\xf0\x9f\x91\xaf", "\xee\xab\xa9"=>"\xf0\x9f\x91\xb0", "\xee\xac\x93"=>"\xf0\x9f\x91\xb1", "\xee\xac\x94"=>"\xf0\x9f\x91\xb2",
- "\xee\xac\x95"=>"\xf0\x9f\x91\xb3", "\xee\xac\x96"=>"\xf0\x9f\x91\xb4", "\xee\xac\x97"=>"\xf0\x9f\x91\xb5", "\xee\xac\x98"=>"\xf0\x9f\x9a\xbc", "\xee\xac\x99"=>"\xf0\x9f\x91\xb7",
- "\xee\xac\x9a"=>"\xf0\x9f\x91\xb8", "\xee\xad\x84"=>"\xf0\x9f\x91\xb9", "\xee\xad\x85"=>"\xf0\x9f\x91\xba", "\xee\x93\x8b"=>"\xf0\x9f\x91\xbb", "\xee\x96\xbf"=>"\xf0\x9f\x91\xbc",
- "\xee\x94\x8e"=>"\xf0\x9f\x91\xbd", "\xee\x93\xac"=>"\xf0\x9f\x91\xbe", "\xee\x93\xaf"=>"\xf0\x9f\x91\xbf", "\xee\x93\xb8"=>"\xf0\x9f\x92\x80", "[\xe6\xa1\x88\xe5\x86\x85]"=>"\xf0\x9f\x92\x81",
- "[\xe8\xa1\x9b\xe5\x85\xb5]"=>"\xf0\x9f\x92\x82", "\xee\xac\x9c"=>"\xf0\x9f\x92\x83", "\xee\xad\xbe"=>"\xf0\x9f\x90\x8c", "\xee\xac\xa2"=>"\xf0\x9f\x90\x8d", "\xee\x93\x98"=>"\xf0\x9f\x90\xb4",
- "\xee\xac\xa3"=>"\xf0\x9f\x90\x94", "\xee\xac\xa4"=>"\xf0\x9f\x90\x97", "\xee\xac\xa5"=>"\xf0\x9f\x90\xab", "\xee\xac\x9f"=>"\xf0\x9f\x90\x98", "\xee\xac\xa0"=>"\xf0\x9f\x90\xa8",
- "\xee\x93\x99"=>"\xf0\x9f\x90\xb5", "\xee\x97\x87"=>"\xf0\x9f\x90\x99", "\xee\xab\xac"=>"\xf0\x9f\x90\x9a", "\xee\xac\x9e"=>"\xf0\x9f\x90\x9b", "\xee\x93\x9d"=>"\xf0\x9f\x90\x9c",
- "\xee\xad\x97"=>"\xf0\x9f\x90\x9d", "\xee\xad\x98"=>"\xf0\x9f\x90\x9e", "\xee\xac\x9d"=>"\xf0\x9f\x90\xa0", "\xee\x93\x93"=>"\xf0\x9f\x90\xa1", "\xee\x97\x94"=>"\xf0\x9f\x90\xa2",
- "\xee\x93\xa0"=>"\xf0\x9f\x90\xa6", "\xee\xad\xb6"=>"\xf0\x9f\x90\xa5", "\xee\x97\x9b"=>"\xf0\x9f\x90\xa3", "\xee\x93\x9c"=>"\xf0\x9f\x90\xa7", "\xee\x93\x9f"=>"\xf0\x9f\x90\xa9",
- "\xee\xac\x9b"=>"\xf0\x9f\x90\xac", "\xee\x97\x82"=>"\xf0\x9f\x90\xad", "\xee\x97\x80"=>"\xf0\x9f\x90\xaf", "\xee\x93\x9b"=>"\xf0\x9f\x90\xb1", "\xee\x91\xb0"=>"\xf0\x9f\x90\xb3",
- "\xee\x93\xa1"=>"\xf0\x9f\x90\xba", "\xee\x93\x9e"=>"\xf0\x9f\x90\xb7", "\xee\x97\x81"=>"\xf0\x9f\x90\xbb", "[\xe3\x83\x8f\xe3\x83\xa0\xe3\x82\xb9\xe3\x82\xbf\xe3\x83\xbc]"=>"\xf0\x9f\x90\xb9", "\xee\xac\xa1"=>"\xf0\x9f\x90\xae",
- "\xee\x93\x97"=>"\xf0\x9f\x90\xb0", "\xee\x93\x9a"=>"\xf0\x9f\x90\xb8", "\xee\x93\xae"=>"\xf0\x9f\x90\xbe", "\xee\xac\xbf"=>"\xf0\x9f\x90\xb2", "\xee\xad\x86"=>"\xf0\x9f\x90\xbc",
- "\xee\xad\x88"=>"\xf0\x9f\x90\xbd", "\xee\x91\xb2"=>"\xf0\x9f\x98\xa0", "\xee\xad\xa7"=>"\xf0\x9f\x98\xa9", "\xee\xab\x8a"=>"\xf0\x9f\x98\xb2", "\xee\xab\x80"=>"\xf0\x9f\x98\x94",
- "\xee\x96\xae"=>"\xf0\x9f\x98\xb5", "\xee\xab\x8b"=>"\xf0\x9f\x98\xb0", "\xee\xab\x89"=>"\xf0\x9f\x98\x92", "\xee\x97\x84"=>"\xf0\x9f\x98\x8d", "\xee\xab\x81"=>"\xf0\x9f\x98\xa4",
- "\xee\x93\xa7"=>"\xf0\x9f\x98\x9d", "\xee\xab\x8d"=>"\xf0\x9f\x98\x8a", "\xee\xab\x8f"=>"\xf0\x9f\x98\x98", "\xee\xab\x8e"=>"\xf0\x9f\x98\x9a", "\xee\xab\x87"=>"\xf0\x9f\x98\xb7",
- "\xee\xab\x88"=>"\xf0\x9f\x98\xb3", "\xee\x91\xb1"=>"\xf0\x9f\x98\x84", "\xee\x91\xb1\xee\x96\xb1"=>"\xf0\x9f\x98\x85", "\xee\xab\x85"=>"\xf0\x9f\x98\x8c", "\xee\xae\x80"=>"\xf0\x9f\x98\x81",
- "\xee\xad\xa4"=>"\xf0\x9f\x98\x82", "\xee\x93\xbb"=>"\xe2\x98\xba", "\xee\xad\xa9"=>"\xf0\x9f\x98\xa2", "\xee\x91\xb3"=>"\xf0\x9f\x98\xad", "\xee\xab\x86"=>"\xf0\x9f\x98\xa8",
- "\xee\xab\x82"=>"\xf0\x9f\x98\xa3", "\xee\xad\x9d"=>"\xf0\x9f\x98\xa1", "\xee\xab\x83"=>"\xf0\x9f\x98\x96", "\xee\x97\x85"=>"\xf0\x9f\x98\xb1", "\xee\xab\x84"=>"\xf0\x9f\x98\xaa",
- "\xee\xaa\xbf"=>"\xf0\x9f\x98\x8f", "\xee\x97\x86"=>"\xf0\x9f\x98\xa5", "\xee\x91\xb4"=>"\xf0\x9f\x98\xab", "\xee\x97\x83"=>"\xf0\x9f\x98\x89", "\xee\xad\xa1"=>"\xf0\x9f\x98\xba",
- "\xee\xad\xbf"=>"\xf0\x9f\x98\xb8", "\xee\xad\xa3"=>"\xf0\x9f\x98\xb9", "\xee\xad\xa0"=>"\xf0\x9f\x98\xbd", "\xee\xad\xa5"=>"\xf0\x9f\x98\xbb", "\xee\xad\xa8"=>"\xf0\x9f\x98\xbf",
- "\xee\xad\x9e"=>"\xf0\x9f\x98\xbe", "\xee\xad\xaa"=>"\xf0\x9f\x98\xbc", "\xee\xad\xa6"=>"\xf0\x9f\x99\x80", "\xee\xab\x97"=>"\xf0\x9f\x99\x85", "\xee\xab\x98"=>"\xf0\x9f\x99\x86",
- "\xee\xab\x99"=>"\xf0\x9f\x99\x87", "\xee\xad\x90"=>"\xf0\x9f\x99\x88", "\xee\xad\x91"=>"\xf0\x9f\x99\x8a", "\xee\xad\x92"=>"\xf0\x9f\x99\x89", "\xee\xae\x85"=>"\xf0\x9f\x99\x8b",
- "\xee\xae\x86"=>"\xf0\x9f\x99\x8c", "\xee\xae\x87"=>"\xf0\x9f\x99\x8d", "\xee\xae\x88"=>"\xf0\x9f\x99\x8e", "\xee\xab\x92"=>"\xf0\x9f\x99\x8f", "\xee\x92\xab"=>"\xf0\x9f\x8f\xa0",
- "\xee\xac\x89"=>"\xf0\x9f\x8f\xa1", "\xee\x92\xad"=>"\xf0\x9f\x8f\xa2", "\xee\x97\x9e"=>"\xf0\x9f\x8f\xa3", "\xee\x97\x9f"=>"\xf0\x9f\x8f\xa5", "\xee\x92\xaa"=>"\xf0\x9f\x8f\xa6",
- "\xee\x92\xa3"=>"\xf0\x9f\x8f\xa7", "\xee\xaa\x81"=>"\xf0\x9f\x8f\xa8", "\xee\xab\xb3"=>"\xf0\x9f\x8f\xa9", "\xee\x92\xa4"=>"\xf0\x9f\x8f\xaa", "\xee\xaa\x80"=>"\xf0\x9f\x8f\xab",
- "\xee\x96\xbb"=>"\xf0\x9f\x92\x92", "\xee\x97\x8f"=>"\xe2\x9b\xb2", "\xee\xab\xb6"=>"\xf0\x9f\x8f\xac", "\xee\xab\xb7"=>"\xf0\x9f\x8f\xaf", "\xee\xab\xb8"=>"\xf0\x9f\x8f\xb0",
- "\xee\xab\xb9"=>"\xf0\x9f\x8f\xad", "\xee\x92\xa9"=>"\xe2\x9a\x93", "\xee\x92\xbd"=>"\xf0\x9f\x8f\xae", "\xee\x96\xbd"=>"\xf0\x9f\x97\xbb", "\xee\x93\x80"=>"\xf0\x9f\x97\xbc",
- "[\xe8\x87\xaa\xe7\x94\xb1\xe3\x81\xae\xe5\xa5\xb3\xe7\xa5\x9e]"=>"\xf0\x9f\x97\xbd", "\xee\x95\xb2"=>"\xf0\x9f\x97\xbe", "\xee\xad\xac"=>"\xf0\x9f\x97\xbf", "\xee\x96\xb7"=>"\xf0\x9f\x91\x9e", "\xee\xac\xab"=>"\xf0\x9f\x91\x9f",
- "\xee\x94\x9a"=>"\xf0\x9f\x91\xa1", "\xee\xaa\x9f"=>"\xf0\x9f\x91\xa2", "\xee\xac\xaa"=>"\xf0\x9f\x91\xa3", "\xee\x93\xbe"=>"\xf0\x9f\x91\x93", "\xee\x96\xb6"=>"\xf0\x9f\x91\x95",
- "\xee\xad\xb7"=>"\xf0\x9f\x91\x96", "\xee\x97\x89"=>"\xf0\x9f\x94\xb1", "\xee\xaa\x93"=>"\xf0\x9f\x91\x94", "\xee\xaa\x9e"=>"\xf0\x9f\x91\x92", "\xee\xad\xab"=>"\xf0\x9f\x91\x97",
- "\xee\xaa\xa3"=>"\xf0\x9f\x91\x98", "\xee\xaa\xa4"=>"\xf0\x9f\x91\x99", "\xee\x94\x8d"=>"\xf0\x9f\x91\x9a", "\xee\x94\x84"=>"\xf0\x9f\x91\x9b", "\xee\x92\x9c"=>"\xf0\x9f\x91\x9c",
- "[\xe3\x81\xb5\xe3\x81\x8f\xe3\x82\x8d]"=>"\xf0\x9f\x91\x9d", "\xee\x93\x87"=>"\xf0\x9f\x92\xb0", "[$\xef\xbf\xa5]"=>"\xf0\x9f\x92\xb1", "\xee\x97\x9c"=>"\xf0\x9f\x92\xb9", "\xee\x95\xb9"=>"\xf0\x9f\x92\xb2",
- "\xee\x95\xbc"=>"\xf0\x9f\x92\xb3", "\xee\x95\xbd"=>"\xf0\x9f\x92\xb4", "\xee\x96\x85"=>"\xf0\x9f\x92\xb5", "\xee\xad\x9b"=>"\xf0\x9f\x92\xb8", "\xee\xac\x91"=>"\xf0\x9f\x87\xa8\xf0\x9f\x87\xb3",
- "\xee\xac\x8e"=>"\xf0\x9f\x87\xa9\xf0\x9f\x87\xaa", "\xee\x97\x95"=>"\xf0\x9f\x87\xaa\xf0\x9f\x87\xb8", "\xee\xab\xba"=>"\xf0\x9f\x87\xab\xf0\x9f\x87\xb7", "\xee\xac\x90"=>"\xf0\x9f\x87\xac\xf0\x9f\x87\xa7", "\xee\xac\x8f"=>"\xf0\x9f\x87\xae\xf0\x9f\x87\xb9",
- "\xee\x93\x8c"=>"\xf0\x9f\x87\xaf\xf0\x9f\x87\xb5", "\xee\xac\x92"=>"\xf0\x9f\x87\xb0\xf0\x9f\x87\xb7", "\xee\x97\x96"=>"\xf0\x9f\x87\xb7\xf0\x9f\x87\xba", "\xee\x95\xb3"=>"\xf0\x9f\x87\xba\xf0\x9f\x87\xb8", "\xee\x91\xbb"=>"\xf0\x9f\x94\xa5",
- "\xee\x96\x83"=>"\xf0\x9f\x94\xa6", "\xee\x96\x87"=>"\xf0\x9f\x94\xa7", "\xee\x97\x8b"=>"\xf0\x9f\x94\xa8", "\xee\x96\x81"=>"\xf0\x9f\x94\xa9", "\xee\x95\xbf"=>"\xf0\x9f\x94\xaa",
- "\xee\x94\x8a"=>"\xf0\x9f\x94\xab", "\xee\xaa\x8f"=>"\xf0\x9f\x94\xaf", "\xee\x92\x80"=>"\xf0\x9f\x94\xb0", "\xee\x94\x90"=>"\xf0\x9f\x92\x89", "\xee\xaa\x9a"=>"\xf0\x9f\x92\x8a",
- "\xee\xac\xa6"=>"\xf0\x9f\x85\xb0", "\xee\xac\xa7"=>"\xf0\x9f\x85\xb1", "\xee\xac\xa9"=>"\xf0\x9f\x86\x8e", "\xee\xac\xa8"=>"\xf0\x9f\x85\xbe", "\xee\x96\x9f"=>"\xf0\x9f\x8e\x80",
- "\xee\x93\x8f"=>"\xf0\x9f\x8e\x81", "\xee\x96\xa0"=>"\xf0\x9f\x8e\x82", "\xee\x93\x89"=>"\xf0\x9f\x8e\x84", "\xee\xab\xb0"=>"\xf0\x9f\x8e\x85", "\xee\x97\x99"=>"\xf0\x9f\x8e\x8c",
- "\xee\x97\x8c"=>"\xf0\x9f\x8e\x86", "\xee\xaa\x9b"=>"\xf0\x9f\x8e\x88", "\xee\xaa\x9c"=>"\xf0\x9f\x8e\x89", "\xee\xab\xa3"=>"\xf0\x9f\x8e\x8d", "\xee\xab\xa4"=>"\xf0\x9f\x8e\x8e",
- "\xee\xab\xa5"=>"\xf0\x9f\x8e\x93", "\xee\xab\xa6"=>"\xf0\x9f\x8e\x92", "\xee\xab\xa7"=>"\xf0\x9f\x8e\x8f", "\xee\xab\xab"=>"\xf0\x9f\x8e\x87", "\xee\xab\xad"=>"\xf0\x9f\x8e\x90",
- "\xee\xab\xae"=>"\xf0\x9f\x8e\x83", "\xee\x91\xaf"=>"\xf0\x9f\x8e\x8a", "\xee\xac\xbd"=>"\xf0\x9f\x8e\x8b", "\xee\xab\xaf"=>"\xf0\x9f\x8e\x91", "\xee\x96\x9b"=>"\xf0\x9f\x93\x9f",
- "\xee\x96\x96"=>"\xe2\x98\x8e", "\xee\x94\x9e"=>"\xf0\x9f\x93\x9e", "\xee\x96\x88"=>"\xf0\x9f\x93\xb1", "\xee\xac\x88"=>"\xf0\x9f\x93\xb2", "\xee\xaa\x92"=>"\xf0\x9f\x93\x9d",
- "\xee\x94\xa0"=>"\xf0\x9f\x93\xa0", "\xee\x94\xa1"=>"\xe2\x9c\x89", "\xee\x96\x91"=>"\xf0\x9f\x93\xa8", "\xee\xad\xa2"=>"\xf0\x9f\x93\xa9", "\xee\x94\x9b"=>"\xf0\x9f\x93\xae",
- "\xee\xac\x8a"=>"\xf0\x9f\x93\xab", "\xee\x96\x8b"=>"\xf0\x9f\x93\xb0", "\xee\x94\x91"=>"\xf0\x9f\x94\x8a", "\xee\x92\xa8"=>"\xf0\x9f\x93\xa1", "\xee\x96\x92"=>"\xf0\x9f\x93\xa4",
- "\xee\x96\x93"=>"\xf0\x9f\x93\xa5", "\xee\x94\x9f"=>"\xf0\x9f\x93\xa6", "\xee\xad\xb1"=>"\xf0\x9f\x93\xa7", "\xee\xab\xbd"=>"\xf0\x9f\x94\xa0", "\xee\xab\xbe"=>"\xf0\x9f\x94\xa1",
- "\xee\xab\xbf"=>"\xf0\x9f\x94\xa2", "\xee\xac\x80"=>"\xf0\x9f\x94\xa3", "\xee\xad\x95"=>"\xf0\x9f\x94\xa4", "\xee\xac\x83"=>"\xe2\x9c\x92", "[\xe3\x81\x84\xe3\x81\x99]"=>"\xf0\x9f\x92\xba",
- "\xee\x96\xb8"=>"\xf0\x9f\x92\xbb", "\xee\x92\xa1"=>"\xe2\x9c\x8f", "\xee\x92\xa0"=>"\xf0\x9f\x93\x8e", "\xee\x97\x8e"=>"\xf0\x9f\x92\xbc", "\xee\x96\x82"=>"\xf0\x9f\x92\xbd",
- "\xee\x95\xa2"=>"\xf0\x9f\x92\xbe", "\xee\x94\x8c"=>"\xf0\x9f\x93\x80", "\xee\x94\x96"=>"\xe2\x9c\x82", "\xee\x95\xa0"=>"\xf0\x9f\x93\x8d", "\xee\x95\xa1"=>"\xf0\x9f\x93\x83",
- "\xee\x95\xa9"=>"\xf0\x9f\x93\x84", "\xee\x95\xa3"=>"\xf0\x9f\x93\x85", "\xee\x96\x8f"=>"\xf0\x9f\x93\x81", "\xee\x96\x90"=>"\xf0\x9f\x93\x82", "\xee\x95\xab"=>"\xf0\x9f\x93\x93",
- "\xee\x92\x9f"=>"\xf0\x9f\x93\x96", "\xee\x92\x9d"=>"\xf0\x9f\x93\x94", "\xee\x95\xa8"=>"\xf0\x9f\x93\x95", "\xee\x95\xa5"=>"\xf0\x9f\x93\x97", "\xee\x95\xa6"=>"\xf0\x9f\x93\x98",
- "\xee\x95\xa7"=>"\xf0\x9f\x93\x99", "\xee\x95\xaf"=>"\xf0\x9f\x93\x9a", "\xee\x94\x9d"=>"\xf0\x9f\x93\x9b", "\xee\x95\x9f"=>"\xf0\x9f\x93\x9c", "\xee\x95\xa4"=>"\xf0\x9f\x93\x8b",
- "\xee\x95\xaa"=>"\xf0\x9f\x93\x86", "\xee\x95\xb4"=>"\xf0\x9f\x93\x8a", "\xee\x95\xb5"=>"\xf0\x9f\x93\x88", "\xee\x95\xb6"=>"\xf0\x9f\x93\x89", "\xee\x95\xac"=>"\xf0\x9f\x93\x87",
- "\xee\x95\xad"=>"\xf0\x9f\x93\x8c", "\xee\x95\xae"=>"\xf0\x9f\x93\x92", "\xee\x95\xb0"=>"\xf0\x9f\x93\x8f", "\xee\x92\xa2"=>"\xf0\x9f\x93\x90", "\xee\xac\x8b"=>"\xf0\x9f\x93\x91",
- "\xee\x92\xba"=>"\xe2\x9a\xbe", "\xee\x96\x99"=>"\xe2\x9b\xb3", "\xee\x92\xb7"=>"\xf0\x9f\x8e\xbe", "\xee\x92\xb6"=>"\xe2\x9a\xbd", "\xee\xaa\xac"=>"\xf0\x9f\x8e\xbf",
- "\xee\x96\x9a"=>"\xf0\x9f\x8f\x80", "\xee\x92\xb9"=>"\xf0\x9f\x8f\x81", "\xee\x92\xb8"=>"\xf0\x9f\x8f\x82", "\xee\x91\xab"=>"\xf0\x9f\x8f\x83", "\xee\xad\x81"=>"\xf0\x9f\x8f\x84",
- "\xee\x97\x93"=>"\xf0\x9f\x8f\x86", "\xee\x92\xbb"=>"\xf0\x9f\x8f\x88", "\xee\xab\x9e"=>"\xf0\x9f\x8f\x8a", "\xee\x92\xb5"=>"\xf0\x9f\x9a\x83", "\xee\x96\xbc"=>"\xe2\x93\x82",
- "\xee\x92\xb0"=>"\xf0\x9f\x9a\x85", "\xee\x92\xb1"=>"\xf0\x9f\x9a\x95", "\xee\x92\xaf"=>"\xf0\x9f\x9a\x8c", "\xee\x92\xa7"=>"\xf0\x9f\x9a\x8f", "\xee\xaa\x82"=>"\xf0\x9f\x9a\xa2",
- "\xee\x92\xb3"=>"\xe2\x9c\x88", "\xee\x92\xb4"=>"\xf0\x9f\x9a\xa4", "\xee\xad\xad"=>"\xf0\x9f\x9a\x89", "\xee\x97\x88"=>"\xf0\x9f\x9a\x80", "\xee\x92\xb2"=>"\xf0\x9f\x9a\x9a",
- "\xee\xab\x9f"=>"\xf0\x9f\x9a\x92", "\xee\xab\xa0"=>"\xf0\x9f\x9a\x91", "\xee\xab\xa1"=>"\xf0\x9f\x9a\x93", "\xee\x95\xb1"=>"\xe2\x9b\xbd", "\xee\x92\xa6"=>"\xf0\x9f\x85\xbf",
- "\xee\x91\xaa"=>"\xf0\x9f\x9a\xa5", "\xee\x97\x97"=>"\xf0\x9f\x9a\xa7", "\xee\xad\xb3"=>"\xf0\x9f\x9a\xa8", "\xee\x92\xbc"=>"\xe2\x99\xa8", "\xee\x97\x90"=>"\xe2\x9b\xba",
- "\xee\x91\xad"=>"\xf0\x9f\x8e\xa1", "\xee\xab\xa2"=>"\xf0\x9f\x8e\xa2", "\xee\xad\x82"=>"\xf0\x9f\x8e\xa3", "\xee\x94\x83"=>"\xf0\x9f\x8e\xa4", "\xee\x94\x97"=>"\xf0\x9f\x8e\xa6",
- "\xee\x94\x88"=>"\xf0\x9f\x8e\xa7", "\xee\x96\x9c"=>"\xf0\x9f\x8e\xa8", "\xee\xab\xb5"=>"\xf0\x9f\x8e\xa9", "\xee\x96\x9e"=>"\xf0\x9f\x8e\xaa", "\xee\x92\x9e"=>"\xf0\x9f\x8e\xab",
- "\xee\x92\xbe"=>"\xf0\x9f\x8e\xac", "\xee\x96\x9d"=>"\xf0\x9f\x8e\xad", "\xee\x93\x86"=>"\xf0\x9f\x8e\xae", "\xee\x97\x91"=>"\xf0\x9f\x80\x84", "\xee\x93\x85"=>"\xf0\x9f\x8e\xaf",
- "\xee\x91\xae"=>"\xf0\x9f\x8e\xb0", "\xee\xab\x9d"=>"\xf0\x9f\x8e\xb1", "\xee\x93\x88"=>"\xf0\x9f\x8e\xb2", "\xee\xad\x83"=>"\xf0\x9f\x8e\xb3", "\xee\xad\xae"=>"\xf0\x9f\x8e\xb4",
- "\xee\xad\xaf"=>"\xf0\x9f\x83\x8f", "\xee\x96\xbe"=>"\xf0\x9f\x8e\xb5", "\xee\x94\x85"=>"\xf0\x9f\x8e\xb6", "[\xe3\x82\xb5\xe3\x83\x83\xe3\x82\xaf\xe3\x82\xb9]"=>"\xf0\x9f\x8e\xb7", "\xee\x94\x86"=>"\xf0\x9f\x8e\xb8",
- "\xee\xad\x80"=>"\xf0\x9f\x8e\xb9", "\xee\xab\x9c"=>"\xf0\x9f\x8e\xba", "\xee\x94\x87"=>"\xf0\x9f\x8e\xbb", "\xee\xab\x8c"=>"\xf0\x9f\x8e\xbc", "[\xe6\xad\x8c\xe8\xa8\x98\xe5\x8f\xb7]"=>"\xe3\x80\xbd",
- "\xee\x94\x95"=>"\xf0\x9f\x93\xb7", "\xee\x95\xbe"=>"\xf0\x9f\x93\xb9", "\xee\x94\x82"=>"\xf0\x9f\x93\xba", "\xee\x96\xb9"=>"\xf0\x9f\x93\xbb", "\xee\x96\x80"=>"\xf0\x9f\x93\xbc",
- "\xee\x93\xab"=>"\xf0\x9f\x92\x8b", "\xee\xad\xb8"=>"\xf0\x9f\x92\x8c", "\xee\x94\x94"=>"\xf0\x9f\x92\x8e", "\xee\x97\x8a"=>"\xf0\x9f\x92\x8f", "\xee\xaa\x95"=>"\xf0\x9f\x92\x90",
- "\xee\xab\x9a"=>"\xf0\x9f\x92\x91", "\xee\xaa\x83"=>"\xf0\x9f\x94\x9e", "\xee\x95\x98"=>"\xc2\xa9", "\xee\x95\x99"=>"\xc2\xae", "\xee\x95\x8e"=>"\xe2\x84\xa2",
- "\xee\x94\xb3"=>"\xe2\x84\xb9", "\xee\xae\x84"=>"#\xe2\x83\xa3", "\xee\x94\xa2"=>"1\xe2\x83\xa3", "\xee\x94\xa3"=>"2\xe2\x83\xa3", "\xee\x94\xa4"=>"3\xe2\x83\xa3",
- "\xee\x94\xa5"=>"4\xe2\x83\xa3", "\xee\x94\xa6"=>"5\xe2\x83\xa3", "\xee\x94\xa7"=>"6\xe2\x83\xa3", "\xee\x94\xa8"=>"7\xe2\x83\xa3", "\xee\x94\xa9"=>"8\xe2\x83\xa3",
- "\xee\x94\xaa"=>"9\xe2\x83\xa3", "\xee\x96\xac"=>"0\xe2\x83\xa3", "\xee\x94\xab"=>"\xf0\x9f\x94\x9f", "\xee\xaa\x84"=>"\xf0\x9f\x93\xb6", "\xee\xaa\x90"=>"\xf0\x9f\x93\xb3",
- "\xee\xaa\x91"=>"\xf0\x9f\x93\xb4", "\xee\x93\x96"=>"\xf0\x9f\x8d\x94", "\xee\x93\x95"=>"\xf0\x9f\x8d\x99", "\xee\x93\x90"=>"\xf0\x9f\x8d\xb0", "\xee\x96\xb4"=>"\xf0\x9f\x8d\x9c",
- "\xee\xaa\xaf"=>"\xf0\x9f\x8d\x9e", "\xee\x93\x91"=>"\xf0\x9f\x8d\xb3", "\xee\xaa\xb0"=>"\xf0\x9f\x8d\xa6", "\xee\xaa\xb1"=>"\xf0\x9f\x8d\x9f", "\xee\xaa\xb2"=>"\xf0\x9f\x8d\xa1",
- "\xee\xaa\xb3"=>"\xf0\x9f\x8d\x98", "\xee\xaa\xb4"=>"\xf0\x9f\x8d\x9a", "\xee\xaa\xb5"=>"\xf0\x9f\x8d\x9d", "\xee\xaa\xb6"=>"\xf0\x9f\x8d\x9b", "\xee\xaa\xb7"=>"\xf0\x9f\x8d\xa2",
- "\xee\xaa\xb8"=>"\xf0\x9f\x8d\xa3", "\xee\xaa\xbd"=>"\xf0\x9f\x8d\xb1", "\xee\xaa\xbe"=>"\xf0\x9f\x8d\xb2", "\xee\xab\xaa"=>"\xf0\x9f\x8d\xa7", "\xee\x93\x84"=>"\xf0\x9f\x8d\x96",
- "\xee\x93\xad"=>"\xf0\x9f\x8d\xa5", "\xee\xac\xba"=>"\xf0\x9f\x8d\xa0", "\xee\xac\xbb"=>"\xf0\x9f\x8d\x95", "\xee\xac\xbc"=>"\xf0\x9f\x8d\x97", "\xee\xad\x8a"=>"\xf0\x9f\x8d\xa8",
- "\xee\xad\x8b"=>"\xf0\x9f\x8d\xa9", "\xee\xad\x8c"=>"\xf0\x9f\x8d\xaa", "\xee\xad\x8d"=>"\xf0\x9f\x8d\xab", "\xee\xad\x8e"=>"\xf0\x9f\x8d\xac", "\xee\xad\x8f"=>"\xf0\x9f\x8d\xad",
- "\xee\xad\x96"=>"\xf0\x9f\x8d\xae", "\xee\xad\x99"=>"\xf0\x9f\x8d\xaf", "\xee\xad\xb0"=>"\xf0\x9f\x8d\xa4", "\xee\x92\xac"=>"\xf0\x9f\x8d\xb4", "\xee\x96\x97"=>"\xe2\x98\x95",
- "\xee\x93\x82"=>"\xf0\x9f\x8d\xb8", "\xee\x93\x83"=>"\xf0\x9f\x8d\xba", "\xee\xaa\xae"=>"\xf0\x9f\x8d\xb5", "\xee\xaa\x97"=>"\xf0\x9f\x8d\xb6", "\xee\x93\x81"=>"\xf0\x9f\x8d\xb7",
- "\xee\xaa\x98"=>"\xf0\x9f\x8d\xbb", "\xee\xac\xbe"=>"\xf0\x9f\x8d\xb9", "\xee\x95\x95"=>"\xe2\x86\x97", "\xee\x95\x8d"=>"\xe2\x86\x98", "\xee\x95\x8c"=>"\xe2\x86\x96",
- "\xee\x95\x96"=>"\xe2\x86\x99", "\xee\xac\xad"=>"\xe2\xa4\xb4", "\xee\xac\xae"=>"\xe2\xa4\xb5", "\xee\xad\xba"=>"\xe2\x86\x94", "\xee\xad\xbb"=>"\xe2\x86\x95",
- "\xee\x94\xbf"=>"\xe2\xac\x86", "\xee\x95\x80"=>"\xe2\xac\x87", "\xee\x95\x92"=>"\xe2\x9e\xa1", "\xee\x95\x93"=>"\xe2\xac\x85", "\xee\x94\xae"=>"\xe2\x96\xb6",
- "\xee\x94\xad"=>"\xe2\x97\x80", "\xee\x94\xb0"=>"\xe2\x8f\xa9", "\xee\x94\xaf"=>"\xe2\x8f\xaa", "\xee\x95\x85"=>"\xe2\x8f\xab", "\xee\x95\x84"=>"\xe2\x8f\xac",
- "\xee\x95\x9a"=>"\xf0\x9f\x94\xba", "\xee\x95\x9b"=>"\xf0\x9f\x94\xbb", "\xee\x95\x83"=>"\xf0\x9f\x94\xbc", "\xee\x95\x82"=>"\xf0\x9f\x94\xbd", "\xee\xaa\xad"=>"\xe2\xad\x95",
- "\xee\x95\x90"=>"\xe2\x9d\x8c", "\xee\x95\x91"=>"\xe2\x9d\x8e", "\xee\x92\x82"=>"\xe2\x9d\x95", "\xee\xac\xaf"=>"\xe2\x81\x89", "\xee\xac\xb0"=>"\xe2\x80\xbc",
- "\xee\x92\x83"=>"\xe2\x9d\x94", "\xee\xac\xb1"=>"\xe2\x9e\xb0", "[\xe3\x83\x95\xe3\x83\xaa\xe3\x83\xbc\xe3\x83\x80\xe3\x82\xa4\xe3\x83\xa4\xe3\x83\xab]"=>"\xe2\x9e\xbf", "\xee\x96\x95"=>"\xf0\x9f\x92\x9f", "\xee\xad\xb5"=>"\xf0\x9f\x92\x97",
- "\xee\x91\xb7"=>"\xf0\x9f\x92\x94", "\xee\x91\xb8"=>"\xf0\x9f\x92\x95", "\xee\xaa\xa6"=>"\xf0\x9f\x92\x96", "\xee\x93\xaa"=>"\xf0\x9f\x92\x98", "\xee\xaa\xa7"=>"\xf0\x9f\x92\x99",
- "\xee\xaa\xa8"=>"\xf0\x9f\x92\x9a", "\xee\xaa\xa9"=>"\xf0\x9f\x92\x9b", "\xee\xaa\xaa"=>"\xf0\x9f\x92\x9c", "\xee\xad\x94"=>"\xf0\x9f\x92\x9d", "\xee\x96\xaf"=>"\xf0\x9f\x92\x9e",
- "\xee\xaa\xa5"=>"\xe2\x99\xa5", "\xee\x96\xa1"=>"\xe2\x99\xa0", "\xee\x96\xa2"=>"\xe2\x99\xa6", "\xee\x96\xa3"=>"\xe2\x99\xa3", "\xee\x91\xbd"=>"\xf0\x9f\x9a\xac",
- "\xee\x91\xbe"=>"\xf0\x9f\x9a\xad", "\xee\x91\xbf"=>"\xe2\x99\xbf", "\xee\xac\xac"=>"\xf0\x9f\x9a\xa9", "\xee\x92\x81"=>"\xe2\x9a\xa0", "\xee\x92\x84"=>"\xe2\x9b\x94",
- "\xee\xad\xb9"=>"\xe2\x99\xbb", "\xee\x92\xae"=>"\xf0\x9f\x9a\xb2", "\xee\xad\xb2"=>"\xf0\x9f\x9a\xb6", "[\xe2\x99\x82]"=>"\xf0\x9f\x9a\xb9", "[\xe2\x99\x80]"=>"\xf0\x9f\x9a\xba",
- "\xee\x97\x98"=>"\xf0\x9f\x9b\x80", "\xee\x92\xa5"=>"\xf0\x9f\x9a\xbe", "[\xe3\x83\x89\xe3\x82\xa2]"=>"\xf0\x9f\x9a\xaa", "\xee\x95\x81"=>"\xf0\x9f\x9a\xab", "\xee\x95\x97"=>"\xe2\x9c\x94",
- "\xee\x96\xab"=>"\xf0\x9f\x86\x91", "\xee\xaa\x85"=>"\xf0\x9f\x86\x92", "\xee\x95\xb8"=>"\xf0\x9f\x86\x93", "\xee\xaa\x88"=>"\xf0\x9f\x86\x94", "\xee\x96\xb5"=>"\xf0\x9f\x86\x95",
- "[NG]"=>"\xf0\x9f\x86\x96", "\xee\x96\xad"=>"\xf0\x9f\x86\x97", "\xee\x93\xa8"=>"\xf0\x9f\x86\x98", "\xee\x94\x8f"=>"\xf0\x9f\x86\x99", "\xee\x97\x92"=>"\xf0\x9f\x86\x9a",
- "[\xe3\x82\xb3\xe3\x82\xb3]"=>"\xf0\x9f\x88\x81", "\xee\xaa\x87"=>"\xf0\x9f\x88\x82", "[\xe7\xa6\x81]"=>"\xf0\x9f\x88\xb2", "\xee\xaa\x8a"=>"\xf0\x9f\x88\xb3", "[\xe5\x90\x88]"=>"\xf0\x9f\x88\xb4",
- "\xee\xaa\x89"=>"\xf0\x9f\x88\xb5", "[\xe6\x9c\x89]"=>"\xf0\x9f\x88\xb6", "[\xe7\x84\xa1]"=>"\xf0\x9f\x88\x9a", "[\xe6\x9c\x88]"=>"\xf0\x9f\x88\xb7", "[\xe7\x94\xb3]"=>"\xf0\x9f\x88\xb8",
- "\xee\xaa\x86"=>"\xf0\x9f\x88\xb9", "\xee\xaa\x8b"=>"\xf0\x9f\x88\xaf", "\xee\xaa\x8c"=>"\xf0\x9f\x88\xba", "\xee\x93\xb1"=>"\xe3\x8a\x99", "\xee\xaa\x99"=>"\xe3\x8a\x97",
- "\xee\x93\xb7"=>"\xf0\x9f\x89\x90", "\xee\xac\x81"=>"\xf0\x9f\x89\x91", "\xee\x94\xbc"=>"\xe2\x9e\x95", "\xee\x94\xbd"=>"\xe2\x9e\x96", "\xee\x95\x8f"=>"\xe2\x9c\x96",
- "\xee\x95\x94"=>"\xe2\x9e\x97", "\xee\x91\xb6"=>"\xf0\x9f\x92\xa1", "\xee\x93\xa5"=>"\xf0\x9f\x92\xa2", "\xee\x91\xba"=>"\xf0\x9f\x92\xa3", "\xee\x91\xb5"=>"\xf0\x9f\x92\xa4",
- "\xee\x96\xb0"=>"\xf0\x9f\x92\xa5", "\xee\x96\xb1"=>"\xf0\x9f\x92\xa6", "\xee\x93\xa6"=>"\xf0\x9f\x92\xa7", "\xee\x93\xb4"=>"\xf0\x9f\x92\xa8", "\xee\x93\xb5"=>"\xf0\x9f\x92\xa9",
- "\xee\x93\xa9"=>"\xf0\x9f\x92\xaa", "\xee\xad\x9c"=>"\xf0\x9f\x92\xab", "\xee\x93\xbd"=>"\xf0\x9f\x92\xac", "\xee\xaa\xab"=>"\xe2\x9c\xa8", "\xee\x91\xb9"=>"\xe2\x9c\xb4",
- "\xee\x94\xbe"=>"\xe2\x9c\xb3", "\xee\x94\xba"=>"\xe2\x9a\xaa", "\xee\x94\xbb"=>"\xe2\x9a\xab", "\xee\x95\x8a"=>"\xf0\x9f\x94\xb4", "\xee\x95\x8b"=>"\xf0\x9f\x94\xb3",
- "\xee\x95\x88"=>"\xe2\xac\x9c", "\xee\x95\x89"=>"\xe2\xac\x9b", "\xee\x94\xb1"=>"\xe2\x96\xab", "\xee\x94\xb2"=>"\xe2\x96\xaa", "\xee\x94\xb4"=>"\xe2\x97\xbd",
- "\xee\x94\xb5"=>"\xe2\x97\xbe", "\xee\x94\xb8"=>"\xe2\x97\xbb", "\xee\x94\xb9"=>"\xe2\x97\xbc", "\xee\x95\x86"=>"\xf0\x9f\x94\xb6", "\xee\x95\x87"=>"\xf0\x9f\x94\xb7",
- "\xee\x94\xb6"=>"\xf0\x9f\x94\xb8", "\xee\x94\xb7"=>"\xf0\x9f\x94\xb9", "\xee\x91\xac"=>"\xe2\x9d\x87", "\xee\x93\xb0"=>"\xf0\x9f\x92\xae", "\xee\x93\xb2"=>"\xf0\x9f\x92\xaf",
- "\xee\x95\x9d"=>"\xe2\x86\xa9", "\xee\x95\x9c"=>"\xe2\x86\xaa", "\xee\xac\x8d"=>"\xf0\x9f\x94\x83", "\xee\x96\x84"=>"\xf0\x9f\x94\x8b", "\xee\x96\x89"=>"\xf0\x9f\x94\x8c",
- "\xee\x94\x98"=>"\xf0\x9f\x94\x8d", "\xee\xac\x85"=>"\xf0\x9f\x94\x8e", "\xee\x94\x9c"=>"\xf0\x9f\x94\x93", "\xee\xac\x8c"=>"\xf0\x9f\x94\x8f", "\xee\xab\xbc"=>"\xf0\x9f\x94\x90",
- "\xee\x94\x99"=>"\xf0\x9f\x94\x91", "\xee\x94\x92"=>"\xf0\x9f\x94\x94", "\xee\xac\x82"=>"\xe2\x98\x91", "\xee\xac\x84"=>"\xf0\x9f\x94\x98", "\xee\xac\x87"=>"\xf0\x9f\x94\x96",
- "\xee\x96\x8a"=>"\xf0\x9f\x94\x97", "\xee\xac\x86"=>"\xf0\x9f\x94\x99", "[end]"=>"\xf0\x9f\x94\x9a", "[ON]"=>"\xf0\x9f\x94\x9b", "[SOON]"=>"\xf0\x9f\x94\x9c",
- "[TOP]"=>"\xf0\x9f\x94\x9d", "\xee\x95\x9e"=>"\xe2\x9c\x85", "\xee\xae\x83"=>"\xe2\x9c\x8a", "\xee\x96\xa7"=>"\xe2\x9c\x8b", "\xee\x96\xa6"=>"\xe2\x9c\x8c",
- "\xee\x93\xb3"=>"\xf0\x9f\x91\x8a", "\xee\x93\xb9"=>"\xf0\x9f\x91\x8d", "\xee\x93\xb6"=>"\xe2\x98\x9d", "\xee\xaa\x8d"=>"\xf0\x9f\x91\x86", "\xee\xaa\x8e"=>"\xf0\x9f\x91\x87",
- "\xee\x93\xbf"=>"\xf0\x9f\x91\x88", "\xee\x94\x80"=>"\xf0\x9f\x91\x89", "\xee\xab\x96"=>"\xf0\x9f\x91\x90", "\xee\xab\x93"=>"\xf0\x9f\x91\x8f", "\xee\xab\x94"=>"\xf0\x9f\x91\x8c",
- "\xee\xab\x95"=>"\xf0\x9f\x91\x8e",
- ),
- 'softbank_to_unified' => array(
- "\xee\x81\x8a"=>"\xe2\x98\x80", "\xee\x81\x89"=>"\xe2\x98\x81", "\xee\x81\x8b"=>"\xe2\x98\x94", "\xee\x81\x88"=>"\xe2\x9b\x84",
- "\xee\x84\xbd"=>"\xe2\x9a\xa1", "\xee\x91\x83"=>"\xf0\x9f\x8c\x80", "[\xe9\x9c\xa7]"=>"\xf0\x9f\x8c\x81", "\xee\x90\xbc"=>"\xf0\x9f\x8c\x82", "\xee\x91\x8b"=>"\xf0\x9f\x8c\x8c",
- "\xee\x81\x8d"=>"\xf0\x9f\x8c\x84", "\xee\x91\x89"=>"\xf0\x9f\x8c\x85", "\xee\x85\x86"=>"\xf0\x9f\x8c\x86", "\xee\x91\x8a"=>"\xf0\x9f\x8c\x87", "\xee\x91\x8c"=>"\xf0\x9f\x8c\x88",
- "[\xe9\x9b\xaa\xe7\xb5\x90\xe6\x99\xb6]"=>"\xe2\x9d\x84", "\xee\x81\x8a\xee\x81\x89"=>"\xe2\x9b\x85", "\xee\x90\xbe"=>"\xf0\x9f\x8c\x8a", "[\xe7\x81\xab\xe5\xb1\xb1]"=>"\xf0\x9f\x8c\x8b", "[\xe5\x9c\xb0\xe7\x90\x83]"=>"\xf0\x9f\x8c\x8f",
- "\xe2\x97\x8f"=>"\xf0\x9f\x8c\x91", "\xee\x81\x8c"=>"\xf0\x9f\x8c\x9b", "\xe2\x97\x8b"=>"\xf0\x9f\x8c\x95", "\xee\x8c\xb5"=>"\xf0\x9f\x8c\x9f", "\xe2\x98\x86\xe5\xbd\xa1"=>"\xf0\x9f\x8c\xa0",
- "\xee\x80\xa4"=>"\xf0\x9f\x95\x90", "\xee\x80\xa5"=>"\xf0\x9f\x95\x91", "\xee\x80\xa6"=>"\xf0\x9f\x95\x92", "\xee\x80\xa7"=>"\xf0\x9f\x95\x93", "\xee\x80\xa8"=>"\xf0\x9f\x95\x94",
- "\xee\x80\xa9"=>"\xf0\x9f\x95\x95", "\xee\x80\xaa"=>"\xf0\x9f\x95\x96", "\xee\x80\xab"=>"\xf0\x9f\x95\x97", "\xee\x80\xac"=>"\xf0\x9f\x95\x98", "\xee\x80\xad"=>"\xe2\x8f\xb0",
- "\xee\x80\xae"=>"\xf0\x9f\x95\x9a", "\xee\x80\xaf"=>"\xf0\x9f\x95\x9b", "[\xe8\x85\x95\xe6\x99\x82\xe8\xa8\x88]"=>"\xe2\x8c\x9a", "[\xe7\xa0\x82\xe6\x99\x82\xe8\xa8\x88]"=>"\xe2\x8f\xb3", "\xee\x88\xbf"=>"\xe2\x99\x88",
- "\xee\x89\x80"=>"\xe2\x99\x89", "\xee\x89\x81"=>"\xe2\x99\x8a", "\xee\x89\x82"=>"\xe2\x99\x8b", "\xee\x89\x83"=>"\xe2\x99\x8c", "\xee\x89\x84"=>"\xe2\x99\x8d",
- "\xee\x89\x85"=>"\xe2\x99\x8e", "\xee\x89\x86"=>"\xe2\x99\x8f", "\xee\x89\x87"=>"\xe2\x99\x90", "\xee\x89\x88"=>"\xe2\x99\x91", "\xee\x89\x89"=>"\xe2\x99\x92",
- "\xee\x89\x8a"=>"\xe2\x99\x93", "\xee\x89\x8b"=>"\xe2\x9b\x8e", "\xee\x84\x90"=>"\xf0\x9f\x8c\xbf", "\xee\x8c\x84"=>"\xf0\x9f\x8c\xb7", "\xee\x84\x98"=>"\xf0\x9f\x8d\x81",
- "\xee\x80\xb0"=>"\xf0\x9f\x8c\xb8", "\xee\x80\xb2"=>"\xf0\x9f\x8c\xb9", "\xee\x84\x99"=>"\xf0\x9f\x8d\x82", "\xee\x91\x87"=>"\xf0\x9f\x8d\x83", "\xee\x8c\x83"=>"\xf0\x9f\x8c\xba",
- "\xee\x8c\x85"=>"\xf0\x9f\x8c\xbc", "\xee\x8c\x87"=>"\xf0\x9f\x8c\xb4", "\xee\x8c\x88"=>"\xf0\x9f\x8c\xb5", "\xee\x91\x84"=>"\xf0\x9f\x8c\xbe", "[\xe3\x81\xa8\xe3\x81\x86\xe3\x82\x82\xe3\x82\x8d\xe3\x81\x93\xe3\x81\x97]"=>"\xf0\x9f\x8c\xbd",
- "[\xe3\x82\xad\xe3\x83\x8e\xe3\x82\xb3]"=>"\xf0\x9f\x8d\x84", "[\xe6\xa0\x97]"=>"\xf0\x9f\x8c\xb0", "[\xe3\x81\x95\xe3\x81\x8f\xe3\x82\x89\xe3\x82\x93\xe3\x81\xbc]"=>"\xf0\x9f\x8d\x92", "[\xe3\x83\x90\xe3\x83\x8a\xe3\x83\x8a]"=>"\xf0\x9f\x8d\x8c", "\xee\x8d\x85"=>"\xf0\x9f\x8d\x8f",
- "\xee\x8d\x86"=>"\xf0\x9f\x8d\x8a", "\xee\x8d\x87"=>"\xf0\x9f\x8d\x93", "\xee\x8d\x88"=>"\xf0\x9f\x8d\x89", "\xee\x8d\x89"=>"\xf0\x9f\x8d\x85", "\xee\x8d\x8a"=>"\xf0\x9f\x8d\x86",
- "[\xe3\x83\xa1\xe3\x83\xad\xe3\x83\xb3]"=>"\xf0\x9f\x8d\x88", "[\xe3\x83\x91\xe3\x82\xa4\xe3\x83\x8a\xe3\x83\x83\xe3\x83\x97\xe3\x83\xab]"=>"\xf0\x9f\x8d\x8d", "[\xe3\x83\x96\xe3\x83\x89\xe3\x82\xa6]"=>"\xf0\x9f\x8d\x87", "[\xe3\x83\xa2\xe3\x83\xa2]"=>"\xf0\x9f\x8d\x91", "\xee\x90\x99"=>"\xf0\x9f\x91\x80",
- "\xee\x90\x9b"=>"\xf0\x9f\x91\x82", "\xee\x90\x9a"=>"\xf0\x9f\x91\x83", "\xee\x90\x9c"=>"\xf0\x9f\x91\x84", "\xee\x90\x89"=>"\xf0\x9f\x98\x9d", "\xee\x8c\x9c"=>"\xf0\x9f\x92\x84",
- "\xee\x8c\x9d"=>"\xf0\x9f\x92\x85", "\xee\x8c\x9e"=>"\xf0\x9f\x92\x86", "\xee\x8c\x9f"=>"\xf0\x9f\x92\x87", "\xee\x8c\xa0"=>"\xf0\x9f\x92\x88", "\xe3\x80\x93"=>"\xf0\x9f\x92\xa0",
- "\xee\x80\x81"=>"\xf0\x9f\x91\xa6", "\xee\x80\x82"=>"\xf0\x9f\x91\xa7", "\xee\x80\x84"=>"\xf0\x9f\x91\xa8", "\xee\x80\x85"=>"\xf0\x9f\x91\xa9", "[\xe5\xae\xb6\xe6\x97\x8f]"=>"\xf0\x9f\x91\xaa",
- "\xee\x90\xa8"=>"\xf0\x9f\x91\xab", "\xee\x85\x92"=>"\xf0\x9f\x91\xae", "\xee\x90\xa9"=>"\xf0\x9f\x91\xaf", "[\xe8\x8a\xb1\xe5\xab\x81]"=>"\xf0\x9f\x91\xb0", "\xee\x94\x95"=>"\xf0\x9f\x91\xb1",
- "\xee\x94\x96"=>"\xf0\x9f\x91\xb2", "\xee\x94\x97"=>"\xf0\x9f\x91\xb3", "\xee\x94\x98"=>"\xf0\x9f\x91\xb4", "\xee\x94\x99"=>"\xf0\x9f\x91\xb5", "\xee\x94\x9a"=>"\xf0\x9f\x91\xb6",
- "\xee\x94\x9b"=>"\xf0\x9f\x91\xb7", "\xee\x94\x9c"=>"\xf0\x9f\x91\xb8", "[\xe3\x81\xaa\xe3\x81\xbe\xe3\x81\xaf\xe3\x81\x92]"=>"\xf0\x9f\x91\xb9", "[\xe5\xa4\xa9\xe7\x8b\x97]"=>"\xf0\x9f\x91\xba", "\xee\x84\x9b"=>"\xf0\x9f\x91\xbb",
- "\xee\x81\x8e"=>"\xf0\x9f\x91\xbc", "\xee\x84\x8c"=>"\xf0\x9f\x91\xbd", "\xee\x84\xab"=>"\xf0\x9f\x91\xbe", "\xee\x84\x9a"=>"\xf0\x9f\x91\xbf", "\xee\x84\x9c"=>"\xf0\x9f\x92\x80",
- "\xee\x89\x93"=>"\xf0\x9f\x92\x81", "\xee\x94\x9e"=>"\xf0\x9f\x92\x82", "\xee\x94\x9f"=>"\xf0\x9f\x92\x83", "[\xe3\x82\xab\xe3\x82\xbf\xe3\x83\x84\xe3\x83\xa0\xe3\x83\xaa]"=>"\xf0\x9f\x90\x8c", "\xee\x94\xad"=>"\xf0\x9f\x90\x8d",
- "\xee\x84\xb4"=>"\xf0\x9f\x90\x8e", "\xee\x94\xae"=>"\xf0\x9f\x90\x94", "\xee\x94\xaf"=>"\xf0\x9f\x90\x97", "\xee\x94\xb0"=>"\xf0\x9f\x90\xab", "\xee\x94\xa6"=>"\xf0\x9f\x90\x98",
- "\xee\x94\xa7"=>"\xf0\x9f\x90\xa8", "\xee\x94\xa8"=>"\xf0\x9f\x90\x92", "\xee\x94\xa9"=>"\xf0\x9f\x90\x91", "\xee\x84\x8a"=>"\xf0\x9f\x90\x99", "\xee\x91\x81"=>"\xf0\x9f\x90\x9a",
- "\xee\x94\xa5"=>"\xf0\x9f\x90\x9b", "[\xe3\x82\xa2\xe3\x83\xaa]"=>"\xf0\x9f\x90\x9c", "[\xe3\x83\x9f\xe3\x83\x84\xe3\x83\x90\xe3\x83\x81]"=>"\xf0\x9f\x90\x9d", "[\xe3\x81\xa6\xe3\x82\x93\xe3\x81\xa8\xe3\x81\x86\xe8\x99\xab]"=>"\xf0\x9f\x90\x9e", "\xee\x94\xa2"=>"\xf0\x9f\x90\xa0",
- "\xee\x80\x99"=>"\xf0\x9f\x8e\xa3", "[\xe3\x82\xab\xe3\x83\xa1]"=>"\xf0\x9f\x90\xa2", "\xee\x94\xa3"=>"\xf0\x9f\x90\xa3", "\xee\x94\xa1"=>"\xf0\x9f\x90\xa6", "\xee\x81\x95"=>"\xf0\x9f\x90\xa7",
- "\xee\x81\x92"=>"\xf0\x9f\x90\xb6", "\xee\x94\xa0"=>"\xf0\x9f\x90\xac", "\xee\x81\x93"=>"\xf0\x9f\x90\xad", "\xee\x81\x90"=>"\xf0\x9f\x90\xaf", "\xee\x81\x8f"=>"\xf0\x9f\x90\xb1",
- "\xee\x81\x94"=>"\xf0\x9f\x90\xb3", "\xee\x80\x9a"=>"\xf0\x9f\x90\xb4", "\xee\x84\x89"=>"\xf0\x9f\x90\xb5", "\xee\x84\x8b"=>"\xf0\x9f\x90\xbd", "\xee\x81\x91"=>"\xf0\x9f\x90\xbb",
- "\xee\x94\xa4"=>"\xf0\x9f\x90\xb9", "\xee\x94\xaa"=>"\xf0\x9f\x90\xba", "\xee\x94\xab"=>"\xf0\x9f\x90\xae", "\xee\x94\xac"=>"\xf0\x9f\x90\xb0", "\xee\x94\xb1"=>"\xf0\x9f\x90\xb8",
- "\xee\x94\xb6"=>"\xf0\x9f\x91\xa3", "[\xe8\xbe\xb0]"=>"\xf0\x9f\x90\xb2", "[\xe3\x83\x91\xe3\x83\xb3\xe3\x83\x80]"=>"\xf0\x9f\x90\xbc", "\xee\x81\x99"=>"\xf0\x9f\x98\xa0", "\xee\x90\x83"=>"\xf0\x9f\x99\x8d",
- "\xee\x90\x90"=>"\xf0\x9f\x98\xb2", "\xee\x81\x98"=>"\xf0\x9f\x98\x9e", "\xee\x90\x86"=>"\xf0\x9f\x98\xab", "\xee\x90\x8f"=>"\xf0\x9f\x98\xb0", "\xee\x90\x8e"=>"\xf0\x9f\x98\x92",
- "\xee\x84\x86"=>"\xf0\x9f\x98\xbb", "\xee\x90\x84"=>"\xf0\x9f\x98\xbc", "\xee\x84\x85"=>"\xf0\x9f\x98\x9c", "\xee\x81\x96"=>"\xf0\x9f\x98\x8a", "\xee\x90\x98"=>"\xf0\x9f\x98\xbd",
- "\xee\x90\x97"=>"\xf0\x9f\x98\x9a", "\xee\x90\x8c"=>"\xf0\x9f\x98\xb7", "\xee\x90\x8d"=>"\xf0\x9f\x98\xb3", "\xee\x81\x97"=>"\xf0\x9f\x98\xba", "\xee\x90\x95\xee\x8c\xb1"=>"\xf0\x9f\x98\x85",
- "\xee\x90\x8a"=>"\xf0\x9f\x98\x8c", "\xee\x90\x92"=>"\xf0\x9f\x98\xb9", "\xee\x90\x94"=>"\xe2\x98\xba", "\xee\x90\x95"=>"\xf0\x9f\x98\x84", "\xee\x90\x93"=>"\xf0\x9f\x98\xbf",
- "\xee\x90\x91"=>"\xf0\x9f\x98\xad", "\xee\x90\x8b"=>"\xf0\x9f\x98\xa8", "\xee\x90\x96"=>"\xf0\x9f\x99\x8e", "\xee\x90\x87"=>"\xf0\x9f\x92\xab", "\xee\x84\x87"=>"\xf0\x9f\x98\xb1",
- "\xee\x90\x88"=>"\xf0\x9f\x98\xaa", "\xee\x90\x82"=>"\xf0\x9f\x98\x8f", "\xee\x84\x88"=>"\xf0\x9f\x98\x93", "\xee\x90\x81"=>"\xf0\x9f\x98\xa5", "\xee\x90\x85"=>"\xf0\x9f\x98\x89",
- "\xee\x90\xa3"=>"\xf0\x9f\x99\x85", "\xee\x90\xa4"=>"\xf0\x9f\x99\x86", "\xee\x90\xa6"=>"\xf0\x9f\x99\x87", "(/_\xef\xbc\xbc)"=>"\xf0\x9f\x99\x88", "(\xe3\x83\xbb\xc3\x97\xe3\x83\xbb)"=>"\xf0\x9f\x99\x8a",
- "|(\xe3\x83\xbb\xc3\x97\xe3\x83\xbb)|"=>"\xf0\x9f\x99\x89", "\xee\x80\x92"=>"\xe2\x9c\x8b", "\xee\x90\xa7"=>"\xf0\x9f\x99\x8c", "\xee\x90\x9d"=>"\xf0\x9f\x99\x8f", "\xee\x80\xb6"=>"\xf0\x9f\x8f\xa1",
- "\xee\x80\xb8"=>"\xf0\x9f\x8f\xa2", "\xee\x85\x93"=>"\xf0\x9f\x8f\xa3", "\xee\x85\x95"=>"\xf0\x9f\x8f\xa5", "\xee\x85\x8d"=>"\xf0\x9f\x8f\xa6", "\xee\x85\x94"=>"\xf0\x9f\x8f\xa7",
- "\xee\x85\x98"=>"\xf0\x9f\x8f\xa8", "\xee\x94\x81"=>"\xf0\x9f\x8f\xa9", "\xee\x85\x96"=>"\xf0\x9f\x8f\xaa", "\xee\x85\x97"=>"\xf0\x9f\x8f\xab", "\xee\x80\xb7"=>"\xe2\x9b\xaa",
- "\xee\x84\xa1"=>"\xe2\x9b\xb2", "\xee\x94\x84"=>"\xf0\x9f\x8f\xac", "\xee\x94\x85"=>"\xf0\x9f\x8f\xaf", "\xee\x94\x86"=>"\xf0\x9f\x8f\xb0", "\xee\x94\x88"=>"\xf0\x9f\x8f\xad",
- "\xee\x88\x82"=>"\xf0\x9f\x9a\xa2", "\xee\x8c\x8b"=>"\xf0\x9f\x8d\xb6", "\xee\x80\xbb"=>"\xf0\x9f\x97\xbb", "\xee\x94\x89"=>"\xf0\x9f\x97\xbc", "\xee\x94\x9d"=>"\xf0\x9f\x97\xbd",
- "[\xe6\x97\xa5\xe6\x9c\xac\xe5\x9c\xb0\xe5\x9b\xb3]"=>"\xf0\x9f\x97\xbe", "[\xe3\x83\xa2\xe3\x82\xa2\xe3\x82\xa4]"=>"\xf0\x9f\x97\xbf", "\xee\x80\x87"=>"\xf0\x9f\x91\x9f", "\xee\x84\xbe"=>"\xf0\x9f\x91\xa0", "\xee\x8c\x9a"=>"\xf0\x9f\x91\xa1",
- "\xee\x8c\x9b"=>"\xf0\x9f\x91\xa2", "[\xe3\x83\xa1\xe3\x82\xac\xe3\x83\x8d]"=>"\xf0\x9f\x91\x93", "\xee\x80\x86"=>"\xf0\x9f\x91\x9a", "[\xe3\x82\xb8\xe3\x83\xbc\xe3\x83\xb3\xe3\x82\xba]"=>"\xf0\x9f\x91\x96", "\xee\x84\x8e"=>"\xf0\x9f\x91\x91",
- "\xee\x8c\x82"=>"\xf0\x9f\x91\x94", "\xee\x8c\x98"=>"\xf0\x9f\x91\x92", "\xee\x8c\x99"=>"\xf0\x9f\x91\x97", "\xee\x8c\xa1"=>"\xf0\x9f\x91\x98", "\xee\x8c\xa2"=>"\xf0\x9f\x91\x99",
- "[\xe8\xb2\xa1\xe5\xb8\x83]"=>"\xf0\x9f\x91\x9b", "\xee\x8c\xa3"=>"\xf0\x9f\x91\x9c", "[\xe3\x81\xb5\xe3\x81\x8f\xe3\x82\x8d]"=>"\xf0\x9f\x91\x9d", "\xee\x84\xaf"=>"\xf0\x9f\x92\xb5", "\xee\x85\x89"=>"\xf0\x9f\x92\xb1",
- "\xee\x85\x8a"=>"\xf0\x9f\x93\x88", "[\xe3\x82\xab\xe3\x83\xbc\xe3\x83\x89]"=>"\xf0\x9f\x92\xb3", "\xef\xbf\xa5"=>"\xf0\x9f\x92\xb4", "[\xe9\xa3\x9b\xe3\x82\x93\xe3\x81\xa7\xe3\x81\x84\xe3\x81\x8f\xe3\x81\x8a\xe9\x87\x91]"=>"\xf0\x9f\x92\xb8", "\xee\x94\x93"=>"\xf0\x9f\x87\xa8\xf0\x9f\x87\xb3",
- "\xee\x94\x8e"=>"\xf0\x9f\x87\xa9\xf0\x9f\x87\xaa", "\xee\x94\x91"=>"\xf0\x9f\x87\xaa\xf0\x9f\x87\xb8", "\xee\x94\x8d"=>"\xf0\x9f\x87\xab\xf0\x9f\x87\xb7", "\xee\x94\x90"=>"\xf0\x9f\x87\xac\xf0\x9f\x87\xa7", "\xee\x94\x8f"=>"\xf0\x9f\x87\xae\xf0\x9f\x87\xb9",
- "\xee\x94\x8b"=>"\xf0\x9f\x87\xaf\xf0\x9f\x87\xb5", "\xee\x94\x94"=>"\xf0\x9f\x87\xb0\xf0\x9f\x87\xb7", "\xee\x94\x92"=>"\xf0\x9f\x87\xb7\xf0\x9f\x87\xba", "\xee\x94\x8c"=>"\xf0\x9f\x87\xba\xf0\x9f\x87\xb8", "\xee\x84\x9d"=>"\xf0\x9f\x94\xa5",
- "[\xe6\x87\x90\xe4\xb8\xad\xe9\x9b\xbb\xe7\x81\xaf]"=>"\xf0\x9f\x94\xa6", "[\xe3\x83\xac\xe3\x83\xb3\xe3\x83\x81]"=>"\xf0\x9f\x94\xa7", "\xee\x84\x96"=>"\xf0\x9f\x94\xa8", "[\xe3\x83\x8d\xe3\x82\xb8]"=>"\xf0\x9f\x94\xa9", "[\xe5\x8c\x85\xe4\xb8\x81]"=>"\xf0\x9f\x94\xaa",
- "\xee\x84\x93"=>"\xf0\x9f\x94\xab", "\xee\x88\xbe"=>"\xf0\x9f\x94\xaf", "\xee\x88\x89"=>"\xf0\x9f\x94\xb0", "\xee\x80\xb1"=>"\xf0\x9f\x94\xb1", "\xee\x84\xbb"=>"\xf0\x9f\x92\x89",
- "\xee\x8c\x8f"=>"\xf0\x9f\x92\x8a", "\xee\x94\xb2"=>"\xf0\x9f\x85\xb0", "\xee\x94\xb3"=>"\xf0\x9f\x85\xb1", "\xee\x94\xb4"=>"\xf0\x9f\x86\x8e", "\xee\x94\xb5"=>"\xf0\x9f\x85\xbe",
- "\xee\x8c\x94"=>"\xf0\x9f\x8e\x80", "\xee\x84\x92"=>"\xf0\x9f\x93\xa6", "\xee\x8d\x8b"=>"\xf0\x9f\x8e\x82", "\xee\x80\xb3"=>"\xf0\x9f\x8e\x84", "\xee\x91\x88"=>"\xf0\x9f\x8e\x85",
- "\xee\x85\x83"=>"\xf0\x9f\x8e\x8c", "\xee\x84\x97"=>"\xf0\x9f\x8e\x86", "\xee\x8c\x90"=>"\xf0\x9f\x8e\x88", "\xee\x8c\x92"=>"\xf0\x9f\x8e\x89", "\xee\x90\xb6"=>"\xf0\x9f\x8e\x8d",
- "\xee\x90\xb8"=>"\xf0\x9f\x8e\x8e", "\xee\x90\xb9"=>"\xf0\x9f\x8e\x93", "\xee\x90\xba"=>"\xf0\x9f\x8e\x92", "\xee\x90\xbb"=>"\xf0\x9f\x8e\x8f", "\xee\x91\x80"=>"\xf0\x9f\x8e\x87",
- "\xee\x91\x82"=>"\xf0\x9f\x8e\x90", "\xee\x91\x85"=>"\xf0\x9f\x8e\x83", "[\xe3\x82\xaa\xe3\x83\xa1\xe3\x83\x87\xe3\x83\x88\xe3\x82\xa6]"=>"\xf0\x9f\x8e\x8a", "[\xe4\xb8\x83\xe5\xa4\x95]"=>"\xf0\x9f\x8e\x8b", "\xee\x91\x86"=>"\xf0\x9f\x8e\x91",
- "[\xe3\x83\x9d\xe3\x82\xb1\xe3\x83\x99\xe3\x83\xab]"=>"\xf0\x9f\x93\x9f", "\xee\x80\x89"=>"\xf0\x9f\x93\x9e", "\xee\x80\x8a"=>"\xf0\x9f\x93\xb1", "\xee\x84\x84"=>"\xf0\x9f\x93\xb2", "\xee\x8c\x81"=>"\xf0\x9f\x93\x91",
- "\xee\x80\x8b"=>"\xf0\x9f\x93\xa0", "\xee\x84\x83"=>"\xf0\x9f\x93\xa7", "\xee\x84\x81"=>"\xf0\x9f\x93\xab", "\xee\x84\x82"=>"\xf0\x9f\x93\xae", "[\xe6\x96\xb0\xe8\x81\x9e]"=>"\xf0\x9f\x93\xb0",
- "\xee\x85\x82"=>"\xf0\x9f\x93\xa2", "\xee\x8c\x97"=>"\xf0\x9f\x93\xa3", "\xee\x85\x8b"=>"\xf0\x9f\x93\xa1", "[\xe9\x80\x81\xe4\xbf\xa1BOX]"=>"\xf0\x9f\x93\xa4", "[\xe5\x8f\x97\xe4\xbf\xa1BOX]"=>"\xf0\x9f\x93\xa5",
- "[ABCD]"=>"\xf0\x9f\x94\xa0", "[abcd]"=>"\xf0\x9f\x94\xa1", "[1234]"=>"\xf0\x9f\x94\xa2", "[\xe8\xa8\x98\xe5\x8f\xb7]"=>"\xf0\x9f\x94\xa3", "[ABC]"=>"\xf0\x9f\x94\xa4",
- "[\xe3\x83\x9a\xe3\x83\xb3]"=>"\xe2\x9c\x92", "\xee\x84\x9f"=>"\xf0\x9f\x92\xba", "\xee\x80\x8c"=>"\xf0\x9f\x92\xbb", "[\xe3\x82\xaf\xe3\x83\xaa\xe3\x83\x83\xe3\x83\x97]"=>"\xf0\x9f\x93\x8e", "\xee\x84\x9e"=>"\xf0\x9f\x92\xbc",
- "\xee\x8c\x96"=>"\xf0\x9f\x92\xbe", "\xee\x84\xa6"=>"\xf0\x9f\x92\xbf", "\xee\x84\xa7"=>"\xf0\x9f\x93\x80", "\xee\x8c\x93"=>"\xe2\x9c\x82", "[\xe7\x94\xbb\xe3\x81\xb3\xe3\x82\x87\xe3\x81\x86]"=>"\xf0\x9f\x93\x8c",
- "[\xe3\x82\xab\xe3\x83\xac\xe3\x83\xb3\xe3\x83\x80\xe3\x83\xbc]"=>"\xf0\x9f\x93\x86", "[\xe3\x83\x95\xe3\x82\xa9\xe3\x83\xab\xe3\x83\x80]"=>"\xf0\x9f\x93\x82", "\xee\x85\x88"=>"\xf0\x9f\x93\x92", "[\xe5\x90\x8d\xe6\x9c\xad]"=>"\xf0\x9f\x93\x9b", "[\xe3\x82\xb9\xe3\x82\xaf\xe3\x83\xad\xe3\x83\xbc\xe3\x83\xab]"=>"\xf0\x9f\x93\x9c",
- "[\xe3\x82\xb0\xe3\x83\xa9\xe3\x83\x95]"=>"\xf0\x9f\x93\x89", "[\xe5\xae\x9a\xe8\xa6\x8f]"=>"\xf0\x9f\x93\x8f", "[\xe4\xb8\x89\xe8\xa7\x92\xe5\xae\x9a\xe8\xa6\x8f]"=>"\xf0\x9f\x93\x90", "\xee\x80\x96"=>"\xe2\x9a\xbe", "\xee\x80\x94"=>"\xe2\x9b\xb3",
- "\xee\x80\x95"=>"\xf0\x9f\x8e\xbe", "\xee\x80\x98"=>"\xe2\x9a\xbd", "\xee\x80\x93"=>"\xf0\x9f\x8e\xbf", "\xee\x90\xaa"=>"\xf0\x9f\x8f\x80", "\xee\x84\xb2"=>"\xf0\x9f\x8f\x81",
- "[\xe3\x82\xb9\xe3\x83\x8e\xe3\x83\x9c]"=>"\xf0\x9f\x8f\x82", "\xee\x84\x95"=>"\xf0\x9f\x8f\x83", "\xee\x80\x97"=>"\xf0\x9f\x8f\x84", "\xee\x84\xb1"=>"\xf0\x9f\x8f\x86", "\xee\x90\xab"=>"\xf0\x9f\x8f\x88",
- "\xee\x90\xad"=>"\xf0\x9f\x8f\x8a", "\xee\x80\x9e"=>"\xf0\x9f\x9a\x83", "\xee\x90\xb4"=>"\xe2\x93\x82", "\xee\x90\xb5"=>"\xf0\x9f\x9a\x84", "\xee\x80\x9f"=>"\xf0\x9f\x9a\x85",
- "\xee\x80\x9b"=>"\xf0\x9f\x9a\x97", "\xee\x90\xae"=>"\xf0\x9f\x9a\x99", "\xee\x85\x99"=>"\xf0\x9f\x9a\x8c", "\xee\x85\x90"=>"\xf0\x9f\x9a\x8f", "\xee\x80\x9d"=>"\xe2\x9c\x88",
- "\xee\x80\x9c"=>"\xe2\x9b\xb5", "\xee\x80\xb9"=>"\xf0\x9f\x9a\x89", "\xee\x84\x8d"=>"\xf0\x9f\x9a\x80", "\xee\x84\xb5"=>"\xf0\x9f\x9a\xa4", "\xee\x85\x9a"=>"\xf0\x9f\x9a\x95",
- "\xee\x90\xaf"=>"\xf0\x9f\x9a\x9a", "\xee\x90\xb0"=>"\xf0\x9f\x9a\x92", "\xee\x90\xb1"=>"\xf0\x9f\x9a\x91", "\xee\x90\xb2"=>"\xf0\x9f\x9a\xa8", "\xee\x80\xba"=>"\xe2\x9b\xbd",
- "\xee\x85\x8f"=>"\xf0\x9f\x85\xbf", "\xee\x85\x8e"=>"\xf0\x9f\x9a\xa5", "\xee\x84\xb7"=>"\xe2\x9b\x94", "\xee\x84\xa3"=>"\xe2\x99\xa8", "\xee\x84\xa2"=>"\xe2\x9b\xba",
- "\xee\x84\xa4"=>"\xf0\x9f\x8e\xa1", "\xee\x90\xb3"=>"\xf0\x9f\x8e\xa2", "\xee\x80\xbc"=>"\xf0\x9f\x8e\xa4", "\xee\x80\xbd"=>"\xf0\x9f\x93\xb9", "\xee\x94\x87"=>"\xf0\x9f\x8e\xa6",
- "\xee\x8c\x8a"=>"\xf0\x9f\x8e\xa7", "\xee\x94\x82"=>"\xf0\x9f\x8e\xa8", "\xee\x94\x83"=>"\xf0\x9f\x8e\xad", "[\xe3\x82\xa4\xe3\x83\x99\xe3\x83\xb3\xe3\x83\x88]"=>"\xf0\x9f\x8e\xaa", "\xee\x84\xa5"=>"\xf0\x9f\x8e\xab",
- "\xee\x8c\xa4"=>"\xf0\x9f\x8e\xac", "[\xe3\x82\xb2\xe3\x83\xbc\xe3\x83\xa0]"=>"\xf0\x9f\x8e\xae", "\xee\x84\xad"=>"\xf0\x9f\x80\x84", "\xee\x84\xb0"=>"\xf0\x9f\x8e\xaf", "\xee\x84\xb3"=>"\xf0\x9f\x8e\xb0",
- "\xee\x90\xac"=>"\xf0\x9f\x8e\xb1", "[\xe3\x82\xb5\xe3\x82\xa4\xe3\x82\xb3\xe3\x83\xad]"=>"\xf0\x9f\x8e\xb2", "[\xe3\x83\x9c\xe3\x83\xbc\xe3\x83\xaa\xe3\x83\xb3\xe3\x82\xb0]"=>"\xf0\x9f\x8e\xb3", "[\xe8\x8a\xb1\xe6\x9c\xad]"=>"\xf0\x9f\x8e\xb4", "[\xe3\x82\xb8\xe3\x83\xa7\xe3\x83\xbc\xe3\x82\xab\xe3\x83\xbc]"=>"\xf0\x9f\x83\x8f",
- "\xee\x80\xbe"=>"\xf0\x9f\x8e\xb5", "\xee\x8c\xa6"=>"\xf0\x9f\x8e\xbc", "\xee\x81\x80"=>"\xf0\x9f\x8e\xb7", "\xee\x81\x81"=>"\xf0\x9f\x8e\xb8", "[\xe3\x83\x94\xe3\x82\xa2\xe3\x83\x8e]"=>"\xf0\x9f\x8e\xb9",
- "\xee\x81\x82"=>"\xf0\x9f\x8e\xba", "[\xe3\x83\x90\xe3\x82\xa4\xe3\x82\xaa\xe3\x83\xaa\xe3\x83\xb3]"=>"\xf0\x9f\x8e\xbb", "\xee\x84\xac"=>"\xe3\x80\xbd", "\xee\x80\x88"=>"\xf0\x9f\x93\xb7", "\xee\x84\xaa"=>"\xf0\x9f\x93\xba",
- "\xee\x84\xa8"=>"\xf0\x9f\x93\xbb", "\xee\x84\xa9"=>"\xf0\x9f\x93\xbc", "\xee\x80\x83"=>"\xf0\x9f\x92\x8b", "\xee\x84\x83\xee\x8c\xa8"=>"\xf0\x9f\x92\x8c", "\xee\x80\xb4"=>"\xf0\x9f\x92\x8d",
- "\xee\x80\xb5"=>"\xf0\x9f\x92\x8e", "\xee\x84\x91"=>"\xf0\x9f\x92\x8f", "\xee\x8c\x86"=>"\xf0\x9f\x92\x90", "\xee\x90\xa5"=>"\xf0\x9f\x92\x91", "\xee\x90\xbd"=>"\xf0\x9f\x92\x92",
- "\xee\x88\x87"=>"\xf0\x9f\x94\x9e", "\xee\x89\x8e"=>"\xc2\xa9", "\xee\x89\x8f"=>"\xc2\xae", "\xee\x94\xb7"=>"\xe2\x84\xa2", "[\xef\xbd\x89]"=>"\xe2\x84\xb9",
- "\xee\x88\x90"=>"#\xe2\x83\xa3", "\xee\x88\x9c"=>"1\xe2\x83\xa3", "\xee\x88\x9d"=>"2\xe2\x83\xa3", "\xee\x88\x9e"=>"3\xe2\x83\xa3", "\xee\x88\x9f"=>"4\xe2\x83\xa3",
- "\xee\x88\xa0"=>"5\xe2\x83\xa3", "\xee\x88\xa1"=>"6\xe2\x83\xa3", "\xee\x88\xa2"=>"7\xe2\x83\xa3", "\xee\x88\xa3"=>"8\xe2\x83\xa3", "\xee\x88\xa4"=>"9\xe2\x83\xa3",
- "\xee\x88\xa5"=>"0\xe2\x83\xa3", "[10]"=>"\xf0\x9f\x94\x9f", "\xee\x88\x8b"=>"\xf0\x9f\x93\xb6", "\xee\x89\x90"=>"\xf0\x9f\x93\xb3", "\xee\x89\x91"=>"\xf0\x9f\x93\xb4",
- "\xee\x84\xa0"=>"\xf0\x9f\x8d\x94", "\xee\x8d\x82"=>"\xf0\x9f\x8d\x99", "\xee\x81\x86"=>"\xf0\x9f\x8d\xb0", "\xee\x8d\x80"=>"\xf0\x9f\x8d\x9c", "\xee\x8c\xb9"=>"\xf0\x9f\x8d\x9e",
- "\xee\x85\x87"=>"\xf0\x9f\x8d\xb3", "\xee\x8c\xba"=>"\xf0\x9f\x8d\xa6", "\xee\x8c\xbb"=>"\xf0\x9f\x8d\x9f", "\xee\x8c\xbc"=>"\xf0\x9f\x8d\xa1", "\xee\x8c\xbd"=>"\xf0\x9f\x8d\x98",
- "\xee\x8c\xbe"=>"\xf0\x9f\x8d\x9a", "\xee\x8c\xbf"=>"\xf0\x9f\x8d\x9d", "\xee\x8d\x81"=>"\xf0\x9f\x8d\x9b", "\xee\x8d\x83"=>"\xf0\x9f\x8d\xa2", "\xee\x8d\x84"=>"\xf0\x9f\x8d\xa3",
- "\xee\x8d\x8c"=>"\xf0\x9f\x8d\xb1", "\xee\x8d\x8d"=>"\xf0\x9f\x8d\xb2", "\xee\x90\xbf"=>"\xf0\x9f\x8d\xa7", "[\xe8\x82\x89]"=>"\xf0\x9f\x8d\x96", "[\xe3\x81\xaa\xe3\x82\x8b\xe3\x81\xa8]"=>"\xf0\x9f\x8d\xa5",
- "[\xe3\x82\x84\xe3\x81\x8d\xe3\x81\x84\xe3\x82\x82]"=>"\xf0\x9f\x8d\xa0", "[\xe3\x83\x94\xe3\x82\xb6]"=>"\xf0\x9f\x8d\x95", "[\xe3\x83\x81\xe3\x82\xad\xe3\x83\xb3]"=>"\xf0\x9f\x8d\x97", "[\xe3\x82\xa2\xe3\x82\xa4\xe3\x82\xb9\xe3\x82\xaf\xe3\x83\xaa\xe3\x83\xbc\xe3\x83\xa0]"=>"\xf0\x9f\x8d\xa8", "[\xe3\x83\x89\xe3\x83\xbc\xe3\x83\x8a\xe3\x83\x84]"=>"\xf0\x9f\x8d\xa9",
- "[\xe3\x82\xaf\xe3\x83\x83\xe3\x82\xad\xe3\x83\xbc]"=>"\xf0\x9f\x8d\xaa", "[\xe3\x83\x81\xe3\x83\xa7\xe3\x82\xb3]"=>"\xf0\x9f\x8d\xab", "[\xe3\x82\xad\xe3\x83\xa3\xe3\x83\xb3\xe3\x83\x87\xe3\x82\xa3]"=>"\xf0\x9f\x8d\xad", "[\xe3\x83\x97\xe3\x83\xaa\xe3\x83\xb3]"=>"\xf0\x9f\x8d\xae", "[\xe3\x83\x8f\xe3\x83\x81\xe3\x83\x9f\xe3\x83\x84]"=>"\xf0\x9f\x8d\xaf",
- "[\xe3\x82\xa8\xe3\x83\x93\xe3\x83\x95\xe3\x83\xa9\xe3\x82\xa4]"=>"\xf0\x9f\x8d\xa4", "\xee\x81\x83"=>"\xf0\x9f\x8d\xb4", "\xee\x81\x85"=>"\xe2\x98\x95", "\xee\x81\x84"=>"\xf0\x9f\x8d\xb9", "\xee\x81\x87"=>"\xf0\x9f\x8d\xba",
- "\xee\x8c\xb8"=>"\xf0\x9f\x8d\xb5", "\xee\x8c\x8c"=>"\xf0\x9f\x8d\xbb", "\xee\x88\xb6"=>"\xe2\xa4\xb4", "\xee\x88\xb8"=>"\xe2\xa4\xb5", "\xee\x88\xb7"=>"\xe2\x86\x96",
- "\xee\x88\xb9"=>"\xe2\x86\x99", "\xe2\x87\x94"=>"\xe2\x86\x94", "\xe2\x86\x91\xe2\x86\x93"=>"\xf0\x9f\x94\x83", "\xee\x88\xb2"=>"\xe2\xac\x86", "\xee\x88\xb3"=>"\xe2\xac\x87",
- "\xee\x88\xb4"=>"\xe2\x9e\xa1", "\xee\x88\xb5"=>"\xf0\x9f\x94\x99", "\xee\x88\xba"=>"\xe2\x96\xb6", "\xee\x88\xbb"=>"\xe2\x97\x80", "\xee\x88\xbc"=>"\xe2\x8f\xa9",
- "\xee\x88\xbd"=>"\xe2\x8f\xaa", "\xe2\x96\xb2"=>"\xf0\x9f\x94\xbc", "\xe2\x96\xbc"=>"\xf0\x9f\x94\xbd", "\xee\x8c\xb2"=>"\xe2\xad\x95", "\xee\x8c\xb3"=>"\xe2\x9c\x96",
- "\xee\x80\xa1"=>"\xe2\x9d\x97", "\xef\xbc\x81\xef\xbc\x9f"=>"\xe2\x81\x89", "\xef\xbc\x81\xef\xbc\x81"=>"\xe2\x80\xbc", "\xee\x80\xa0"=>"\xe2\x9d\x93", "\xee\x8c\xb6"=>"\xe2\x9d\x94",
- "\xee\x8c\xb7"=>"\xe2\x9d\x95", "\xef\xbd\x9e"=>"\xe2\x9e\xb0", "\xee\x88\x91"=>"\xe2\x9e\xbf", "\xee\x80\xa2"=>"\xe2\x9d\xa4", "\xee\x8c\xa7"=>"\xf0\x9f\x92\x9e",
- "\xee\x80\xa3"=>"\xf0\x9f\x92\x94", "\xee\x8c\xa8"=>"\xf0\x9f\x92\x97", "\xee\x8c\xa9"=>"\xf0\x9f\x92\x98", "\xee\x8c\xaa"=>"\xf0\x9f\x92\x99", "\xee\x8c\xab"=>"\xf0\x9f\x92\x9a",
- "\xee\x8c\xac"=>"\xf0\x9f\x92\x9b", "\xee\x8c\xad"=>"\xf0\x9f\x92\x9c", "\xee\x90\xb7"=>"\xf0\x9f\x92\x9d", "\xee\x88\x84"=>"\xf0\x9f\x92\x9f", "\xee\x88\x8c"=>"\xe2\x99\xa5",
- "\xee\x88\x8e"=>"\xe2\x99\xa0", "\xee\x88\x8d"=>"\xe2\x99\xa6", "\xee\x88\x8f"=>"\xe2\x99\xa3", "\xee\x8c\x8e"=>"\xf0\x9f\x9a\xac", "\xee\x88\x88"=>"\xf0\x9f\x9a\xad",
- "\xee\x88\x8a"=>"\xe2\x99\xbf", "[\xe6\x97\x97]"=>"\xf0\x9f\x9a\xa9", "\xee\x89\x92"=>"\xe2\x9a\xa0", "\xee\x84\xb6"=>"\xf0\x9f\x9a\xb2", "\xee\x88\x81"=>"\xf0\x9f\x9a\xb6",
- "\xee\x84\xb8"=>"\xf0\x9f\x9a\xb9", "\xee\x84\xb9"=>"\xf0\x9f\x9a\xba", "\xee\x84\xbf"=>"\xf0\x9f\x9b\x80", "\xee\x85\x91"=>"\xf0\x9f\x9a\xbb", "\xee\x85\x80"=>"\xf0\x9f\x9a\xbd",
- "\xee\x8c\x89"=>"\xf0\x9f\x9a\xbe", "\xee\x84\xba"=>"\xf0\x9f\x9a\xbc", "[\xe3\x83\x89\xe3\x82\xa2]"=>"\xf0\x9f\x9a\xaa", "[\xe7\xa6\x81\xe6\xad\xa2]"=>"\xf0\x9f\x9a\xab", "[\xe3\x83\x81\xe3\x82\xa7\xe3\x83\x83\xe3\x82\xaf\xe3\x83\x9e\xe3\x83\xbc\xe3\x82\xaf]"=>"\xe2\x9c\x85",
- "[CL]"=>"\xf0\x9f\x86\x91", "\xee\x88\x94"=>"\xf0\x9f\x86\x92", "[FREE]"=>"\xf0\x9f\x86\x93", "\xee\x88\xa9"=>"\xf0\x9f\x86\x94", "\xee\x88\x92"=>"\xf0\x9f\x86\x95",
- "[NG]"=>"\xf0\x9f\x86\x96", "\xee\x89\x8d"=>"\xf0\x9f\x86\x97", "[SOS]"=>"\xf0\x9f\x86\x98", "\xee\x88\x93"=>"\xf0\x9f\x86\x99", "\xee\x84\xae"=>"\xf0\x9f\x86\x9a",
- "\xee\x88\x83"=>"\xf0\x9f\x88\x81", "\xee\x88\xa8"=>"\xf0\x9f\x88\x82", "[\xe7\xa6\x81]"=>"\xf0\x9f\x88\xb2", "\xee\x88\xab"=>"\xf0\x9f\x88\xb3", "[\xe5\x90\x88]"=>"\xf0\x9f\x88\xb4",
- "\xee\x88\xaa"=>"\xf0\x9f\x88\xb5", "\xee\x88\x95"=>"\xf0\x9f\x88\xb6", "\xee\x88\x96"=>"\xf0\x9f\x88\x9a", "\xee\x88\x97"=>"\xf0\x9f\x88\xb7", "\xee\x88\x98"=>"\xf0\x9f\x88\xb8",
- "\xee\x88\xa7"=>"\xf0\x9f\x88\xb9", "\xee\x88\xac"=>"\xf0\x9f\x88\xaf", "\xee\x88\xad"=>"\xf0\x9f\x88\xba", "\xee\x8c\x95"=>"\xe3\x8a\x99", "\xee\x8c\x8d"=>"\xe3\x8a\x97",
- "\xee\x88\xa6"=>"\xf0\x9f\x89\x90", "[\xe5\x8f\xaf]"=>"\xf0\x9f\x89\x91", "[\xef\xbc\x8b]"=>"\xe2\x9e\x95", "[\xef\xbc\x8d]"=>"\xe2\x9e\x96", "[\xc3\xb7]"=>"\xe2\x9e\x97",
- "\xee\x84\x8f"=>"\xf0\x9f\x92\xa1", "\xee\x8c\xb4"=>"\xf0\x9f\x92\xa2", "\xee\x8c\x91"=>"\xf0\x9f\x92\xa3", "\xee\x84\xbc"=>"\xf0\x9f\x92\xa4", "[\xe3\x83\x89\xe3\x83\xb3\xe3\x83\x83]"=>"\xf0\x9f\x92\xa5",
- "\xee\x8c\xb1"=>"\xf0\x9f\x92\xa7", "\xee\x8c\xb0"=>"\xf0\x9f\x92\xa8", "\xee\x81\x9a"=>"\xf0\x9f\x92\xa9", "\xee\x85\x8c"=>"\xf0\x9f\x92\xaa", "[\xe3\x83\x95\xe3\x82\xad\xe3\x83\x80\xe3\x82\xb7]"=>"\xf0\x9f\x92\xac",
- "\xee\x8c\xae"=>"\xe2\x9d\x87", "\xee\x88\x85"=>"\xe2\x9c\xb4", "\xee\x88\x86"=>"\xe2\x9c\xb3", "\xee\x88\x99"=>"\xf0\x9f\x94\xb4", "\xee\x88\x9a"=>"\xe2\x97\xbc",
- "\xee\x88\x9b"=>"\xf0\x9f\x94\xb9", "\xee\x8c\xaf"=>"\xe2\xad\x90", "[\xe8\x8a\xb1\xe4\xb8\xb8]"=>"\xf0\x9f\x92\xae", "[100\xe7\x82\xb9]"=>"\xf0\x9f\x92\xaf", "\xe2\x86\x90\xe2\x94\x98"=>"\xe2\x86\xa9",
- "\xe2\x94\x94\xe2\x86\x92"=>"\xe2\x86\xaa", "\xee\x85\x81"=>"\xf0\x9f\x94\x8a", "[\xe9\x9b\xbb\xe6\xb1\xa0]"=>"\xf0\x9f\x94\x8b", "[\xe3\x82\xb3\xe3\x83\xb3\xe3\x82\xbb\xe3\x83\xb3\xe3\x83\x88]"=>"\xf0\x9f\x94\x8c", "\xee\x84\x94"=>"\xf0\x9f\x94\x8e",
- "\xee\x85\x84"=>"\xf0\x9f\x94\x90", "\xee\x85\x85"=>"\xf0\x9f\x94\x93", "\xee\x80\xbf"=>"\xf0\x9f\x94\x91", "\xee\x8c\xa5"=>"\xf0\x9f\x94\x94", "[\xe3\x83\xa9\xe3\x82\xb8\xe3\x82\xaa\xe3\x83\x9c\xe3\x82\xbf\xe3\x83\xb3]"=>"\xf0\x9f\x94\x98",
- "[\xe3\x83\x96\xe3\x83\x83\xe3\x82\xaf\xe3\x83\x9e\xe3\x83\xbc\xe3\x82\xaf]"=>"\xf0\x9f\x94\x96", "[\xe3\x83\xaa\xe3\x83\xb3\xe3\x82\xaf]"=>"\xf0\x9f\x94\x97", "[end]"=>"\xf0\x9f\x94\x9a", "[ON]"=>"\xf0\x9f\x94\x9b", "[SOON]"=>"\xf0\x9f\x94\x9c",
- "\xee\x89\x8c"=>"\xf0\x9f\x94\x9d", "\xee\x80\x90"=>"\xe2\x9c\x8a", "\xee\x80\x91"=>"\xe2\x9c\x8c", "\xee\x80\x8d"=>"\xf0\x9f\x91\x8a", "\xee\x80\x8e"=>"\xf0\x9f\x91\x8d",
- "\xee\x80\x8f"=>"\xe2\x98\x9d", "\xee\x88\xae"=>"\xf0\x9f\x91\x86", "\xee\x88\xaf"=>"\xf0\x9f\x91\x87", "\xee\x88\xb0"=>"\xf0\x9f\x91\x88", "\xee\x88\xb1"=>"\xf0\x9f\x91\x89",
- "\xee\x90\x9e"=>"\xf0\x9f\x91\x8b", "\xee\x90\x9f"=>"\xf0\x9f\x91\x8f", "\xee\x90\xa0"=>"\xf0\x9f\x91\x8c", "\xee\x90\xa1"=>"\xf0\x9f\x91\x8e", "\xee\x90\xa2"=>"\xf0\x9f\x91\x90",
- ),
- 'google_to_unified' => array(
- "\xf3\xbe\x80\x80"=>"\xe2\x98\x80", "\xf3\xbe\x80\x81"=>"\xe2\x98\x81", "\xf3\xbe\x80\x82"=>"\xe2\x98\x94", "\xf3\xbe\x80\x83"=>"\xe2\x9b\x84",
- "\xf3\xbe\x80\x84"=>"\xe2\x9a\xa1", "\xf3\xbe\x80\x85"=>"\xf0\x9f\x8c\x80", "\xf3\xbe\x80\x86"=>"\xf0\x9f\x8c\x81", "\xf3\xbe\x80\x87"=>"\xf0\x9f\x8c\x82", "\xf3\xbe\x80\x88"=>"\xf0\x9f\x8c\x83",
- "\xf3\xbe\x80\x89"=>"\xf0\x9f\x8c\x84", "\xf3\xbe\x80\x8a"=>"\xf0\x9f\x8c\x85", "\xf3\xbe\x80\x8b"=>"\xf0\x9f\x8c\x86", "\xf3\xbe\x80\x8c"=>"\xf0\x9f\x8c\x87", "\xf3\xbe\x80\x8d"=>"\xf0\x9f\x8c\x88",
- "\xf3\xbe\x80\x8e"=>"\xe2\x9d\x84", "\xf3\xbe\x80\x8f"=>"\xe2\x9b\x85", "\xf3\xbe\x80\x90"=>"\xf0\x9f\x8c\x89", "\xf3\xbe\x80\xb8"=>"\xf0\x9f\x8c\x8a", "\xf3\xbe\x80\xba"=>"\xf0\x9f\x8c\x8b",
- "\xf3\xbe\x80\xbb"=>"\xf0\x9f\x8c\x8c", "\xf3\xbe\x80\xb9"=>"\xf0\x9f\x8c\x8f", "\xf3\xbe\x80\x91"=>"\xf0\x9f\x8c\x91", "\xf3\xbe\x80\x92"=>"\xf0\x9f\x8c\x94", "\xf3\xbe\x80\x93"=>"\xf0\x9f\x8c\x93",
- "\xf3\xbe\x80\x94"=>"\xf0\x9f\x8c\x99", "\xf3\xbe\x80\x95"=>"\xf0\x9f\x8c\x95", "\xf3\xbe\x80\x96"=>"\xf0\x9f\x8c\x9b", "\xf3\xbe\xad\xa9"=>"\xf0\x9f\x8c\x9f", "\xf3\xbe\xad\xaa"=>"\xf0\x9f\x8c\xa0",
- "\xf3\xbe\x80\x9e"=>"\xf0\x9f\x95\x90", "\xf3\xbe\x80\x9f"=>"\xf0\x9f\x95\x91", "\xf3\xbe\x80\xa0"=>"\xf0\x9f\x95\x92", "\xf3\xbe\x80\xa1"=>"\xf0\x9f\x95\x93", "\xf3\xbe\x80\xa2"=>"\xf0\x9f\x95\x94",
- "\xf3\xbe\x80\xa3"=>"\xf0\x9f\x95\x95", "\xf3\xbe\x80\xa4"=>"\xf0\x9f\x95\x96", "\xf3\xbe\x80\xa5"=>"\xf0\x9f\x95\x97", "\xf3\xbe\x80\xa6"=>"\xf0\x9f\x95\x98", "\xf3\xbe\x80\xa7"=>"\xf0\x9f\x95\x99",
- "\xf3\xbe\x80\xa8"=>"\xf0\x9f\x95\x9a", "\xf3\xbe\x80\xa9"=>"\xf0\x9f\x95\x9b", "\xf3\xbe\x80\x9d"=>"\xe2\x8c\x9a", "\xf3\xbe\x80\x9c"=>"\xe2\x8c\x9b", "\xf3\xbe\x80\xaa"=>"\xe2\x8f\xb0",
- "\xf3\xbe\x80\x9b"=>"\xe2\x8f\xb3", "\xf3\xbe\x80\xab"=>"\xe2\x99\x88", "\xf3\xbe\x80\xac"=>"\xe2\x99\x89", "\xf3\xbe\x80\xad"=>"\xe2\x99\x8a", "\xf3\xbe\x80\xae"=>"\xe2\x99\x8b",
- "\xf3\xbe\x80\xaf"=>"\xe2\x99\x8c", "\xf3\xbe\x80\xb0"=>"\xe2\x99\x8d", "\xf3\xbe\x80\xb1"=>"\xe2\x99\x8e", "\xf3\xbe\x80\xb2"=>"\xe2\x99\x8f", "\xf3\xbe\x80\xb3"=>"\xe2\x99\x90",
- "\xf3\xbe\x80\xb4"=>"\xe2\x99\x91", "\xf3\xbe\x80\xb5"=>"\xe2\x99\x92", "\xf3\xbe\x80\xb6"=>"\xe2\x99\x93", "\xf3\xbe\x80\xb7"=>"\xe2\x9b\x8e", "\xf3\xbe\x80\xbc"=>"\xf0\x9f\x8d\x80",
- "\xf3\xbe\x80\xbd"=>"\xf0\x9f\x8c\xb7", "\xf3\xbe\x80\xbe"=>"\xf0\x9f\x8c\xb1", "\xf3\xbe\x80\xbf"=>"\xf0\x9f\x8d\x81", "\xf3\xbe\x81\x80"=>"\xf0\x9f\x8c\xb8", "\xf3\xbe\x81\x81"=>"\xf0\x9f\x8c\xb9",
- "\xf3\xbe\x81\x82"=>"\xf0\x9f\x8d\x82", "\xf3\xbe\x81\x83"=>"\xf0\x9f\x8d\x83", "\xf3\xbe\x81\x85"=>"\xf0\x9f\x8c\xba", "\xf3\xbe\x81\x86"=>"\xf0\x9f\x8c\xbb", "\xf3\xbe\x81\x87"=>"\xf0\x9f\x8c\xb4",
- "\xf3\xbe\x81\x88"=>"\xf0\x9f\x8c\xb5", "\xf3\xbe\x81\x89"=>"\xf0\x9f\x8c\xbe", "\xf3\xbe\x81\x8a"=>"\xf0\x9f\x8c\xbd", "\xf3\xbe\x81\x8b"=>"\xf0\x9f\x8d\x84", "\xf3\xbe\x81\x8c"=>"\xf0\x9f\x8c\xb0",
- "\xf3\xbe\x81\x8d"=>"\xf0\x9f\x8c\xbc", "\xf3\xbe\x81\x8e"=>"\xf0\x9f\x8c\xbf", "\xf3\xbe\x81\x8f"=>"\xf0\x9f\x8d\x92", "\xf3\xbe\x81\x90"=>"\xf0\x9f\x8d\x8c", "\xf3\xbe\x81\x91"=>"\xf0\x9f\x8d\x8e",
- "\xf3\xbe\x81\x92"=>"\xf0\x9f\x8d\x8a", "\xf3\xbe\x81\x93"=>"\xf0\x9f\x8d\x93", "\xf3\xbe\x81\x94"=>"\xf0\x9f\x8d\x89", "\xf3\xbe\x81\x95"=>"\xf0\x9f\x8d\x85", "\xf3\xbe\x81\x96"=>"\xf0\x9f\x8d\x86",
- "\xf3\xbe\x81\x97"=>"\xf0\x9f\x8d\x88", "\xf3\xbe\x81\x98"=>"\xf0\x9f\x8d\x8d", "\xf3\xbe\x81\x99"=>"\xf0\x9f\x8d\x87", "\xf3\xbe\x81\x9a"=>"\xf0\x9f\x8d\x91", "\xf3\xbe\x81\x9b"=>"\xf0\x9f\x8d\x8f",
- "\xf3\xbe\x86\x90"=>"\xf0\x9f\x91\x80", "\xf3\xbe\x86\x91"=>"\xf0\x9f\x91\x82", "\xf3\xbe\x86\x92"=>"\xf0\x9f\x91\x83", "\xf3\xbe\x86\x93"=>"\xf0\x9f\x91\x84", "\xf3\xbe\x86\x94"=>"\xf0\x9f\x91\x85",
- "\xf3\xbe\x86\x95"=>"\xf0\x9f\x92\x84", "\xf3\xbe\x86\x96"=>"\xf0\x9f\x92\x85", "\xf3\xbe\x86\x97"=>"\xf0\x9f\x92\x86", "\xf3\xbe\x86\x98"=>"\xf0\x9f\x92\x87", "\xf3\xbe\x86\x99"=>"\xf0\x9f\x92\x88",
- "\xf3\xbe\x86\x9a"=>"\xf0\x9f\x91\xa4", "\xf3\xbe\x86\x9b"=>"\xf0\x9f\x91\xa6", "\xf3\xbe\x86\x9c"=>"\xf0\x9f\x91\xa7", "\xf3\xbe\x86\x9d"=>"\xf0\x9f\x91\xa8", "\xf3\xbe\x86\x9e"=>"\xf0\x9f\x91\xa9",
- "\xf3\xbe\x86\x9f"=>"\xf0\x9f\x91\xaa", "\xf3\xbe\x86\xa0"=>"\xf0\x9f\x91\xab", "\xf3\xbe\x86\xa1"=>"\xf0\x9f\x91\xae", "\xf3\xbe\x86\xa2"=>"\xf0\x9f\x91\xaf", "\xf3\xbe\x86\xa3"=>"\xf0\x9f\x91\xb0",
- "\xf3\xbe\x86\xa4"=>"\xf0\x9f\x91\xb1", "\xf3\xbe\x86\xa5"=>"\xf0\x9f\x91\xb2", "\xf3\xbe\x86\xa6"=>"\xf0\x9f\x91\xb3", "\xf3\xbe\x86\xa7"=>"\xf0\x9f\x91\xb4", "\xf3\xbe\x86\xa8"=>"\xf0\x9f\x91\xb5",
- "\xf3\xbe\x86\xa9"=>"\xf0\x9f\x91\xb6", "\xf3\xbe\x86\xaa"=>"\xf0\x9f\x91\xb7", "\xf3\xbe\x86\xab"=>"\xf0\x9f\x91\xb8", "\xf3\xbe\x86\xac"=>"\xf0\x9f\x91\xb9", "\xf3\xbe\x86\xad"=>"\xf0\x9f\x91\xba",
- "\xf3\xbe\x86\xae"=>"\xf0\x9f\x91\xbb", "\xf3\xbe\x86\xaf"=>"\xf0\x9f\x91\xbc", "\xf3\xbe\x86\xb0"=>"\xf0\x9f\x91\xbd", "\xf3\xbe\x86\xb1"=>"\xf0\x9f\x91\xbe", "\xf3\xbe\x86\xb2"=>"\xf0\x9f\x91\xbf",
- "\xf3\xbe\x86\xb3"=>"\xf0\x9f\x92\x80", "\xf3\xbe\x86\xb4"=>"\xf0\x9f\x92\x81", "\xf3\xbe\x86\xb5"=>"\xf0\x9f\x92\x82", "\xf3\xbe\x86\xb6"=>"\xf0\x9f\x92\x83", "\xf3\xbe\x86\xb9"=>"\xf0\x9f\x90\x8c",
- "\xf3\xbe\x87\x93"=>"\xf0\x9f\x90\x8d", "\xf3\xbe\x9f\x9c"=>"\xf0\x9f\x90\x8e", "\xf3\xbe\x87\x94"=>"\xf0\x9f\x90\x94", "\xf3\xbe\x87\x95"=>"\xf0\x9f\x90\x97", "\xf3\xbe\x87\x96"=>"\xf0\x9f\x90\xab",
- "\xf3\xbe\x87\x8c"=>"\xf0\x9f\x90\x98", "\xf3\xbe\x87\x8d"=>"\xf0\x9f\x90\xa8", "\xf3\xbe\x87\x8e"=>"\xf0\x9f\x90\x92", "\xf3\xbe\x87\x8f"=>"\xf0\x9f\x90\x91", "\xf3\xbe\x87\x85"=>"\xf0\x9f\x90\x99",
- "\xf3\xbe\x87\x86"=>"\xf0\x9f\x90\x9a", "\xf3\xbe\x87\x8b"=>"\xf0\x9f\x90\x9b", "\xf3\xbe\x87\x9a"=>"\xf0\x9f\x90\x9c", "\xf3\xbe\x87\xa1"=>"\xf0\x9f\x90\x9d", "\xf3\xbe\x87\xa2"=>"\xf0\x9f\x90\x9e",
- "\xf3\xbe\x87\x89"=>"\xf0\x9f\x90\xa0", "\xf3\xbe\x87\x99"=>"\xf0\x9f\x90\xa1", "\xf3\xbe\x87\x9c"=>"\xf0\x9f\x90\xa2", "\xf3\xbe\x86\xba"=>"\xf0\x9f\x90\xa4", "\xf3\xbe\x86\xbb"=>"\xf0\x9f\x90\xa5",
- "\xf3\xbe\x87\x88"=>"\xf0\x9f\x90\xa6", "\xf3\xbe\x87\x9d"=>"\xf0\x9f\x90\xa3", "\xf3\xbe\x86\xbc"=>"\xf0\x9f\x90\xa7", "\xf3\xbe\x87\x98"=>"\xf0\x9f\x90\xa9", "\xf3\xbe\x86\xbd"=>"\xf0\x9f\x90\x9f",
- "\xf3\xbe\x87\x87"=>"\xf0\x9f\x90\xac", "\xf3\xbe\x87\x82"=>"\xf0\x9f\x90\xad", "\xf3\xbe\x87\x80"=>"\xf0\x9f\x90\xaf", "\xf3\xbe\x86\xb8"=>"\xf0\x9f\x90\xb1", "\xf3\xbe\x87\x83"=>"\xf0\x9f\x90\xb3",
- "\xf3\xbe\x86\xbe"=>"\xf0\x9f\x90\xb4", "\xf3\xbe\x87\x84"=>"\xf0\x9f\x90\xb5", "\xf3\xbe\x86\xb7"=>"\xf0\x9f\x90\xb6", "\xf3\xbe\x86\xbf"=>"\xf0\x9f\x90\xb7", "\xf3\xbe\x87\x81"=>"\xf0\x9f\x90\xbb",
- "\xf3\xbe\x87\x8a"=>"\xf0\x9f\x90\xb9", "\xf3\xbe\x87\x90"=>"\xf0\x9f\x90\xba", "\xf3\xbe\x87\x91"=>"\xf0\x9f\x90\xae", "\xf3\xbe\x87\x92"=>"\xf0\x9f\x90\xb0", "\xf3\xbe\x87\x97"=>"\xf0\x9f\x90\xb8",
- "\xf3\xbe\x87\x9b"=>"\xf0\x9f\x90\xbe", "\xf3\xbe\x87\x9e"=>"\xf0\x9f\x90\xb2", "\xf3\xbe\x87\x9f"=>"\xf0\x9f\x90\xbc", "\xf3\xbe\x87\xa0"=>"\xf0\x9f\x90\xbd", "\xf3\xbe\x8c\xa0"=>"\xf0\x9f\x98\xa0",
- "\xf3\xbe\x8c\xa1"=>"\xf0\x9f\x98\xa9", "\xf3\xbe\x8c\xa2"=>"\xf0\x9f\x98\xb2", "\xf3\xbe\x8c\xa3"=>"\xf0\x9f\x98\x9e", "\xf3\xbe\x8c\xa4"=>"\xf0\x9f\x98\xb5", "\xf3\xbe\x8c\xa5"=>"\xf0\x9f\x98\xb0",
- "\xf3\xbe\x8c\xa6"=>"\xf0\x9f\x98\x92", "\xf3\xbe\x8c\xa7"=>"\xf0\x9f\x98\x8d", "\xf3\xbe\x8c\xa8"=>"\xf0\x9f\x98\xa4", "\xf3\xbe\x8c\xa9"=>"\xf0\x9f\x98\x9c", "\xf3\xbe\x8c\xaa"=>"\xf0\x9f\x98\x9d",
- "\xf3\xbe\x8c\xab"=>"\xf0\x9f\x98\x8b", "\xf3\xbe\x8c\xac"=>"\xf0\x9f\x98\x98", "\xf3\xbe\x8c\xad"=>"\xf0\x9f\x98\x9a", "\xf3\xbe\x8c\xae"=>"\xf0\x9f\x98\xb7", "\xf3\xbe\x8c\xaf"=>"\xf0\x9f\x98\xb3",
- "\xf3\xbe\x8c\xb0"=>"\xf0\x9f\x98\x83", "\xf3\xbe\x8c\xb1"=>"\xf0\x9f\x98\x85", "\xf3\xbe\x8c\xb2"=>"\xf0\x9f\x98\x86", "\xf3\xbe\x8c\xb3"=>"\xf0\x9f\x98\x81", "\xf3\xbe\x8c\xb4"=>"\xf0\x9f\x98\x82",
- "\xf3\xbe\x8c\xb5"=>"\xf0\x9f\x98\x8a", "\xf3\xbe\x8c\xb6"=>"\xe2\x98\xba", "\xf3\xbe\x8c\xb8"=>"\xf0\x9f\x98\x84", "\xf3\xbe\x8c\xb9"=>"\xf0\x9f\x98\xa2", "\xf3\xbe\x8c\xba"=>"\xf0\x9f\x98\xad",
- "\xf3\xbe\x8c\xbb"=>"\xf0\x9f\x98\xa8", "\xf3\xbe\x8c\xbc"=>"\xf0\x9f\x98\xa3", "\xf3\xbe\x8c\xbd"=>"\xf0\x9f\x98\xa1", "\xf3\xbe\x8c\xbe"=>"\xf0\x9f\x98\x8c", "\xf3\xbe\x8c\xbf"=>"\xf0\x9f\x98\x96",
- "\xf3\xbe\x8d\x80"=>"\xf0\x9f\x98\x94", "\xf3\xbe\x8d\x81"=>"\xf0\x9f\x98\xb1", "\xf3\xbe\x8d\x82"=>"\xf0\x9f\x98\xaa", "\xf3\xbe\x8d\x83"=>"\xf0\x9f\x98\x8f", "\xf3\xbe\x8d\x84"=>"\xf0\x9f\x98\x93",
- "\xf3\xbe\x8d\x85"=>"\xf0\x9f\x98\xa5", "\xf3\xbe\x8d\x86"=>"\xf0\x9f\x98\xab", "\xf3\xbe\x8d\x87"=>"\xf0\x9f\x98\x89", "\xf3\xbe\x8d\x88"=>"\xf0\x9f\x98\xba", "\xf3\xbe\x8d\x89"=>"\xf0\x9f\x98\xb8",
- "\xf3\xbe\x8d\x8a"=>"\xf0\x9f\x98\xb9", "\xf3\xbe\x8d\x8b"=>"\xf0\x9f\x98\xbd", "\xf3\xbe\x8d\x8c"=>"\xf0\x9f\x98\xbb", "\xf3\xbe\x8d\x8d"=>"\xf0\x9f\x98\xbf", "\xf3\xbe\x8d\x8e"=>"\xf0\x9f\x98\xbe",
- "\xf3\xbe\x8d\x8f"=>"\xf0\x9f\x98\xbc", "\xf3\xbe\x8d\x90"=>"\xf0\x9f\x99\x80", "\xf3\xbe\x8d\x91"=>"\xf0\x9f\x99\x85", "\xf3\xbe\x8d\x92"=>"\xf0\x9f\x99\x86", "\xf3\xbe\x8d\x93"=>"\xf0\x9f\x99\x87",
- "\xf3\xbe\x8d\x94"=>"\xf0\x9f\x99\x88", "\xf3\xbe\x8d\x95"=>"\xf0\x9f\x99\x8a", "\xf3\xbe\x8d\x96"=>"\xf0\x9f\x99\x89", "\xf3\xbe\x8d\x97"=>"\xf0\x9f\x99\x8b", "\xf3\xbe\x8d\x98"=>"\xf0\x9f\x99\x8c",
- "\xf3\xbe\x8d\x99"=>"\xf0\x9f\x99\x8d", "\xf3\xbe\x8d\x9a"=>"\xf0\x9f\x99\x8e", "\xf3\xbe\x8d\x9b"=>"\xf0\x9f\x99\x8f", "\xf3\xbe\x92\xb0"=>"\xf0\x9f\x8f\xa0", "\xf3\xbe\x92\xb1"=>"\xf0\x9f\x8f\xa1",
- "\xf3\xbe\x92\xb2"=>"\xf0\x9f\x8f\xa2", "\xf3\xbe\x92\xb3"=>"\xf0\x9f\x8f\xa3", "\xf3\xbe\x92\xb4"=>"\xf0\x9f\x8f\xa5", "\xf3\xbe\x92\xb5"=>"\xf0\x9f\x8f\xa6", "\xf3\xbe\x92\xb6"=>"\xf0\x9f\x8f\xa7",
- "\xf3\xbe\x92\xb7"=>"\xf0\x9f\x8f\xa8", "\xf3\xbe\x92\xb8"=>"\xf0\x9f\x8f\xa9", "\xf3\xbe\x92\xb9"=>"\xf0\x9f\x8f\xaa", "\xf3\xbe\x92\xba"=>"\xf0\x9f\x8f\xab", "\xf3\xbe\x92\xbb"=>"\xe2\x9b\xaa",
- "\xf3\xbe\x92\xbc"=>"\xe2\x9b\xb2", "\xf3\xbe\x92\xbd"=>"\xf0\x9f\x8f\xac", "\xf3\xbe\x92\xbe"=>"\xf0\x9f\x8f\xaf", "\xf3\xbe\x92\xbf"=>"\xf0\x9f\x8f\xb0", "\xf3\xbe\x93\x80"=>"\xf0\x9f\x8f\xad",
- "\xf3\xbe\x93\x81"=>"\xe2\x9a\x93", "\xf3\xbe\x93\x82"=>"\xf0\x9f\x8f\xae", "\xf3\xbe\x93\x83"=>"\xf0\x9f\x97\xbb", "\xf3\xbe\x93\x84"=>"\xf0\x9f\x97\xbc", "\xf3\xbe\x93\x86"=>"\xf0\x9f\x97\xbd",
- "\xf3\xbe\x93\x87"=>"\xf0\x9f\x97\xbe", "\xf3\xbe\x93\x88"=>"\xf0\x9f\x97\xbf", "\xf3\xbe\x93\x8c"=>"\xf0\x9f\x91\x9e", "\xf3\xbe\x93\x8d"=>"\xf0\x9f\x91\x9f", "\xf3\xbe\x93\x96"=>"\xf0\x9f\x91\xa0",
- "\xf3\xbe\x93\x97"=>"\xf0\x9f\x91\xa1", "\xf3\xbe\x93\x98"=>"\xf0\x9f\x91\xa2", "\xf3\xbe\x95\x93"=>"\xf0\x9f\x91\xa3", "\xf3\xbe\x93\x8e"=>"\xf0\x9f\x91\x93", "\xf3\xbe\x93\x8f"=>"\xf0\x9f\x91\x95",
- "\xf3\xbe\x93\x90"=>"\xf0\x9f\x91\x96", "\xf3\xbe\x93\x91"=>"\xf0\x9f\x91\x91", "\xf3\xbe\x93\x93"=>"\xf0\x9f\x91\x94", "\xf3\xbe\x93\x94"=>"\xf0\x9f\x91\x92", "\xf3\xbe\x93\x95"=>"\xf0\x9f\x91\x97",
- "\xf3\xbe\x93\x99"=>"\xf0\x9f\x91\x98", "\xf3\xbe\x93\x9a"=>"\xf0\x9f\x91\x99", "\xf3\xbe\x93\x9b"=>"\xf0\x9f\x91\x9a", "\xf3\xbe\x93\x9c"=>"\xf0\x9f\x91\x9b", "\xf3\xbe\x93\xb0"=>"\xf0\x9f\x91\x9c",
- "\xf3\xbe\x93\xb1"=>"\xf0\x9f\x91\x9d", "\xf3\xbe\x93\x9d"=>"\xf0\x9f\x92\xb0", "\xf3\xbe\x93\x9e"=>"\xf0\x9f\x92\xb1", "\xf3\xbe\x93\x9f"=>"\xf0\x9f\x92\xb9", "\xf3\xbe\x93\xa0"=>"\xf0\x9f\x92\xb2",
- "\xf3\xbe\x93\xa1"=>"\xf0\x9f\x92\xb3", "\xf3\xbe\x93\xa2"=>"\xf0\x9f\x92\xb4", "\xf3\xbe\x93\xa3"=>"\xf0\x9f\x92\xb5", "\xf3\xbe\x93\xa4"=>"\xf0\x9f\x92\xb8", "\xf3\xbe\x93\xad"=>"\xf0\x9f\x87\xa8\xf0\x9f\x87\xb3",
- "\xf3\xbe\x93\xa8"=>"\xf0\x9f\x87\xa9\xf0\x9f\x87\xaa", "\xf3\xbe\x93\xab"=>"\xf0\x9f\x87\xaa\xf0\x9f\x87\xb8", "\xf3\xbe\x93\xa7"=>"\xf0\x9f\x87\xab\xf0\x9f\x87\xb7", "\xf3\xbe\x93\xaa"=>"\xf0\x9f\x87\xac\xf0\x9f\x87\xa7", "\xf3\xbe\x93\xa9"=>"\xf0\x9f\x87\xae\xf0\x9f\x87\xb9",
- "\xf3\xbe\x93\xa5"=>"\xf0\x9f\x87\xaf\xf0\x9f\x87\xb5", "\xf3\xbe\x93\xae"=>"\xf0\x9f\x87\xb0\xf0\x9f\x87\xb7", "\xf3\xbe\x93\xac"=>"\xf0\x9f\x87\xb7\xf0\x9f\x87\xba", "\xf3\xbe\x93\xa6"=>"\xf0\x9f\x87\xba\xf0\x9f\x87\xb8", "\xf3\xbe\x93\xb6"=>"\xf0\x9f\x94\xa5",
- "\xf3\xbe\x93\xbb"=>"\xf0\x9f\x94\xa6", "\xf3\xbe\x93\x89"=>"\xf0\x9f\x94\xa7", "\xf3\xbe\x93\x8a"=>"\xf0\x9f\x94\xa8", "\xf3\xbe\x93\x8b"=>"\xf0\x9f\x94\xa9", "\xf3\xbe\x93\xba"=>"\xf0\x9f\x94\xaa",
- "\xf3\xbe\x93\xb5"=>"\xf0\x9f\x94\xab", "\xf3\xbe\x93\xb7"=>"\xf0\x9f\x94\xae", "\xf3\xbe\x93\xb8"=>"\xf0\x9f\x94\xaf", "\xf3\xbe\x81\x84"=>"\xf0\x9f\x94\xb0", "\xf3\xbe\x93\x92"=>"\xf0\x9f\x94\xb1",
- "\xf3\xbe\x94\x89"=>"\xf0\x9f\x92\x89", "\xf3\xbe\x94\x8a"=>"\xf0\x9f\x92\x8a", "\xf3\xbe\x94\x8b"=>"\xf0\x9f\x85\xb0", "\xf3\xbe\x94\x8c"=>"\xf0\x9f\x85\xb1", "\xf3\xbe\x94\x8d"=>"\xf0\x9f\x86\x8e",
- "\xf3\xbe\x94\x8e"=>"\xf0\x9f\x85\xbe", "\xf3\xbe\x94\x8f"=>"\xf0\x9f\x8e\x80", "\xf3\xbe\x94\x90"=>"\xf0\x9f\x8e\x81", "\xf3\xbe\x94\x91"=>"\xf0\x9f\x8e\x82", "\xf3\xbe\x94\x92"=>"\xf0\x9f\x8e\x84",
- "\xf3\xbe\x94\x93"=>"\xf0\x9f\x8e\x85", "\xf3\xbe\x94\x94"=>"\xf0\x9f\x8e\x8c", "\xf3\xbe\x94\x95"=>"\xf0\x9f\x8e\x86", "\xf3\xbe\x94\x96"=>"\xf0\x9f\x8e\x88", "\xf3\xbe\x94\x97"=>"\xf0\x9f\x8e\x89",
- "\xf3\xbe\x94\x98"=>"\xf0\x9f\x8e\x8d", "\xf3\xbe\x94\x99"=>"\xf0\x9f\x8e\x8e", "\xf3\xbe\x94\x9a"=>"\xf0\x9f\x8e\x93", "\xf3\xbe\x94\x9b"=>"\xf0\x9f\x8e\x92", "\xf3\xbe\x94\x9c"=>"\xf0\x9f\x8e\x8f",
- "\xf3\xbe\x94\x9d"=>"\xf0\x9f\x8e\x87", "\xf3\xbe\x94\x9e"=>"\xf0\x9f\x8e\x90", "\xf3\xbe\x94\x9f"=>"\xf0\x9f\x8e\x83", "\xf3\xbe\x94\xa0"=>"\xf0\x9f\x8e\x8a", "\xf3\xbe\x94\xa1"=>"\xf0\x9f\x8e\x8b",
- "\xf3\xbe\x80\x97"=>"\xf0\x9f\x8e\x91", "\xf3\xbe\x94\xa2"=>"\xf0\x9f\x93\x9f", "\xf3\xbe\x94\xa3"=>"\xe2\x98\x8e", "\xf3\xbe\x94\xa4"=>"\xf0\x9f\x93\x9e", "\xf3\xbe\x94\xa5"=>"\xf0\x9f\x93\xb1",
- "\xf3\xbe\x94\xa6"=>"\xf0\x9f\x93\xb2", "\xf3\xbe\x94\xa7"=>"\xf0\x9f\x93\x9d", "\xf3\xbe\x94\xa8"=>"\xf0\x9f\x93\xa0", "\xf3\xbe\x94\xa9"=>"\xe2\x9c\x89", "\xf3\xbe\x94\xaa"=>"\xf0\x9f\x93\xa8",
- "\xf3\xbe\x94\xab"=>"\xf0\x9f\x93\xa9", "\xf3\xbe\x94\xac"=>"\xf0\x9f\x93\xaa", "\xf3\xbe\x94\xad"=>"\xf0\x9f\x93\xab", "\xf3\xbe\x94\xae"=>"\xf0\x9f\x93\xae", "\xf3\xbe\xa0\xa2"=>"\xf0\x9f\x93\xb0",
- "\xf3\xbe\x94\xaf"=>"\xf0\x9f\x93\xa2", "\xf3\xbe\x94\xb0"=>"\xf0\x9f\x93\xa3", "\xf3\xbe\x94\xb1"=>"\xf0\x9f\x93\xa1", "\xf3\xbe\x94\xb3"=>"\xf0\x9f\x93\xa4", "\xf3\xbe\x94\xb4"=>"\xf0\x9f\x93\xa5",
- "\xf3\xbe\x94\xb5"=>"\xf0\x9f\x93\xa6", "\xf3\xbe\xae\x92"=>"\xf0\x9f\x93\xa7", "\xf3\xbe\xad\xbc"=>"\xf0\x9f\x94\xa0", "\xf3\xbe\xad\xbd"=>"\xf0\x9f\x94\xa1", "\xf3\xbe\xad\xbe"=>"\xf0\x9f\x94\xa2",
- "\xf3\xbe\xad\xbf"=>"\xf0\x9f\x94\xa3", "\xf3\xbe\xae\x80"=>"\xf0\x9f\x94\xa4", "\xf3\xbe\x94\xb6"=>"\xe2\x9c\x92", "\xf3\xbe\x94\xb7"=>"\xf0\x9f\x92\xba", "\xf3\xbe\x94\xb8"=>"\xf0\x9f\x92\xbb",
- "\xf3\xbe\x94\xb9"=>"\xe2\x9c\x8f", "\xf3\xbe\x94\xba"=>"\xf0\x9f\x93\x8e", "\xf3\xbe\x94\xbb"=>"\xf0\x9f\x92\xbc", "\xf3\xbe\x94\xbc"=>"\xf0\x9f\x92\xbd", "\xf3\xbe\x94\xbd"=>"\xf0\x9f\x92\xbe",
- "\xf3\xbe\xa0\x9d"=>"\xf0\x9f\x92\xbf", "\xf3\xbe\xa0\x9e"=>"\xf0\x9f\x93\x80", "\xf3\xbe\x94\xbe"=>"\xe2\x9c\x82", "\xf3\xbe\x94\xbf"=>"\xf0\x9f\x93\x8d", "\xf3\xbe\x95\x80"=>"\xf0\x9f\x93\x83",
- "\xf3\xbe\x95\x81"=>"\xf0\x9f\x93\x84", "\xf3\xbe\x95\x82"=>"\xf0\x9f\x93\x85", "\xf3\xbe\x95\x83"=>"\xf0\x9f\x93\x81", "\xf3\xbe\x95\x84"=>"\xf0\x9f\x93\x82", "\xf3\xbe\x95\x85"=>"\xf0\x9f\x93\x93",
- "\xf3\xbe\x95\x86"=>"\xf0\x9f\x93\x96", "\xf3\xbe\x95\x87"=>"\xf0\x9f\x93\x94", "\xf3\xbe\x94\x82"=>"\xf0\x9f\x93\x95", "\xf3\xbe\x93\xbf"=>"\xf0\x9f\x93\x97", "\xf3\xbe\x94\x80"=>"\xf0\x9f\x93\x98",
- "\xf3\xbe\x94\x81"=>"\xf0\x9f\x93\x99", "\xf3\xbe\x94\x83"=>"\xf0\x9f\x93\x9a", "\xf3\xbe\x94\x84"=>"\xf0\x9f\x93\x9b", "\xf3\xbe\x93\xbd"=>"\xf0\x9f\x93\x9c", "\xf3\xbe\x95\x88"=>"\xf0\x9f\x93\x8b",
- "\xf3\xbe\x95\x89"=>"\xf0\x9f\x93\x86", "\xf3\xbe\x95\x8a"=>"\xf0\x9f\x93\x8a", "\xf3\xbe\x95\x8b"=>"\xf0\x9f\x93\x88", "\xf3\xbe\x95\x8c"=>"\xf0\x9f\x93\x89", "\xf3\xbe\x95\x8d"=>"\xf0\x9f\x93\x87",
- "\xf3\xbe\x95\x8e"=>"\xf0\x9f\x93\x8c", "\xf3\xbe\x95\x8f"=>"\xf0\x9f\x93\x92", "\xf3\xbe\x95\x90"=>"\xf0\x9f\x93\x8f", "\xf3\xbe\x95\x91"=>"\xf0\x9f\x93\x90", "\xf3\xbe\x95\x92"=>"\xf0\x9f\x93\x91",
- "\xf3\xbe\x9f\x90"=>"\xf0\x9f\x8e\xbd", "\xf3\xbe\x9f\x91"=>"\xe2\x9a\xbe", "\xf3\xbe\x9f\x92"=>"\xe2\x9b\xb3", "\xf3\xbe\x9f\x93"=>"\xf0\x9f\x8e\xbe", "\xf3\xbe\x9f\x94"=>"\xe2\x9a\xbd",
- "\xf3\xbe\x9f\x95"=>"\xf0\x9f\x8e\xbf", "\xf3\xbe\x9f\x96"=>"\xf0\x9f\x8f\x80", "\xf3\xbe\x9f\x97"=>"\xf0\x9f\x8f\x81", "\xf3\xbe\x9f\x98"=>"\xf0\x9f\x8f\x82", "\xf3\xbe\x9f\x99"=>"\xf0\x9f\x8f\x83",
- "\xf3\xbe\x9f\x9a"=>"\xf0\x9f\x8f\x84", "\xf3\xbe\x9f\x9b"=>"\xf0\x9f\x8f\x86", "\xf3\xbe\x9f\x9d"=>"\xf0\x9f\x8f\x88", "\xf3\xbe\x9f\x9e"=>"\xf0\x9f\x8f\x8a", "\xf3\xbe\x9f\x9f"=>"\xf0\x9f\x9a\x83",
- "\xf3\xbe\x9f\xa0"=>"\xf0\x9f\x9a\x87", "\xf3\xbe\x9f\xa1"=>"\xe2\x93\x82", "\xf3\xbe\x9f\xa2"=>"\xf0\x9f\x9a\x84", "\xf3\xbe\x9f\xa3"=>"\xf0\x9f\x9a\x85", "\xf3\xbe\x9f\xa4"=>"\xf0\x9f\x9a\x97",
- "\xf3\xbe\x9f\xa5"=>"\xf0\x9f\x9a\x99", "\xf3\xbe\x9f\xa6"=>"\xf0\x9f\x9a\x8c", "\xf3\xbe\x9f\xa7"=>"\xf0\x9f\x9a\x8f", "\xf3\xbe\x9f\xa8"=>"\xf0\x9f\x9a\xa2", "\xf3\xbe\x9f\xa9"=>"\xe2\x9c\x88",
- "\xf3\xbe\x9f\xaa"=>"\xe2\x9b\xb5", "\xf3\xbe\x9f\xac"=>"\xf0\x9f\x9a\x89", "\xf3\xbe\x9f\xad"=>"\xf0\x9f\x9a\x80", "\xf3\xbe\x9f\xae"=>"\xf0\x9f\x9a\xa4", "\xf3\xbe\x9f\xaf"=>"\xf0\x9f\x9a\x95",
- "\xf3\xbe\x9f\xb1"=>"\xf0\x9f\x9a\x9a", "\xf3\xbe\x9f\xb2"=>"\xf0\x9f\x9a\x92", "\xf3\xbe\x9f\xb3"=>"\xf0\x9f\x9a\x91", "\xf3\xbe\x9f\xb4"=>"\xf0\x9f\x9a\x93", "\xf3\xbe\x9f\xb5"=>"\xe2\x9b\xbd",
- "\xf3\xbe\x9f\xb6"=>"\xf0\x9f\x85\xbf", "\xf3\xbe\x9f\xb7"=>"\xf0\x9f\x9a\xa5", "\xf3\xbe\x9f\xb8"=>"\xf0\x9f\x9a\xa7", "\xf3\xbe\x9f\xb9"=>"\xf0\x9f\x9a\xa8", "\xf3\xbe\x9f\xba"=>"\xe2\x99\xa8",
- "\xf3\xbe\x9f\xbb"=>"\xe2\x9b\xba", "\xf3\xbe\x9f\xbc"=>"\xf0\x9f\x8e\xa0", "\xf3\xbe\x9f\xbd"=>"\xf0\x9f\x8e\xa1", "\xf3\xbe\x9f\xbe"=>"\xf0\x9f\x8e\xa2", "\xf3\xbe\x9f\xbf"=>"\xf0\x9f\x8e\xa3",
- "\xf3\xbe\xa0\x80"=>"\xf0\x9f\x8e\xa4", "\xf3\xbe\xa0\x81"=>"\xf0\x9f\x8e\xa5", "\xf3\xbe\xa0\x82"=>"\xf0\x9f\x8e\xa6", "\xf3\xbe\xa0\x83"=>"\xf0\x9f\x8e\xa7", "\xf3\xbe\xa0\x84"=>"\xf0\x9f\x8e\xa8",
- "\xf3\xbe\xa0\x85"=>"\xf0\x9f\x8e\xa9", "\xf3\xbe\xa0\x86"=>"\xf0\x9f\x8e\xaa", "\xf3\xbe\xa0\x87"=>"\xf0\x9f\x8e\xab", "\xf3\xbe\xa0\x88"=>"\xf0\x9f\x8e\xac", "\xf3\xbe\xa0\x89"=>"\xf0\x9f\x8e\xad",
- "\xf3\xbe\xa0\x8a"=>"\xf0\x9f\x8e\xae", "\xf3\xbe\xa0\x8b"=>"\xf0\x9f\x80\x84", "\xf3\xbe\xa0\x8c"=>"\xf0\x9f\x8e\xaf", "\xf3\xbe\xa0\x8d"=>"\xf0\x9f\x8e\xb0", "\xf3\xbe\xa0\x8e"=>"\xf0\x9f\x8e\xb1",
- "\xf3\xbe\xa0\x8f"=>"\xf0\x9f\x8e\xb2", "\xf3\xbe\xa0\x90"=>"\xf0\x9f\x8e\xb3", "\xf3\xbe\xa0\x91"=>"\xf0\x9f\x8e\xb4", "\xf3\xbe\xa0\x92"=>"\xf0\x9f\x83\x8f", "\xf3\xbe\xa0\x93"=>"\xf0\x9f\x8e\xb5",
- "\xf3\xbe\xa0\x94"=>"\xf0\x9f\x8e\xb6", "\xf3\xbe\xa0\x95"=>"\xf0\x9f\x8e\xb7", "\xf3\xbe\xa0\x96"=>"\xf0\x9f\x8e\xb8", "\xf3\xbe\xa0\x97"=>"\xf0\x9f\x8e\xb9", "\xf3\xbe\xa0\x98"=>"\xf0\x9f\x8e\xba",
- "\xf3\xbe\xa0\x99"=>"\xf0\x9f\x8e\xbb", "\xf3\xbe\xa0\x9a"=>"\xf0\x9f\x8e\xbc", "\xf3\xbe\xa0\x9b"=>"\xe3\x80\xbd", "\xf3\xbe\x93\xaf"=>"\xf0\x9f\x93\xb7", "\xf3\xbe\x93\xb9"=>"\xf0\x9f\x93\xb9",
- "\xf3\xbe\xa0\x9c"=>"\xf0\x9f\x93\xba", "\xf3\xbe\xa0\x9f"=>"\xf0\x9f\x93\xbb", "\xf3\xbe\xa0\xa0"=>"\xf0\x9f\x93\xbc", "\xf3\xbe\xa0\xa3"=>"\xf0\x9f\x92\x8b", "\xf3\xbe\xa0\xa4"=>"\xf0\x9f\x92\x8c",
- "\xf3\xbe\xa0\xa5"=>"\xf0\x9f\x92\x8d", "\xf3\xbe\xa0\xa6"=>"\xf0\x9f\x92\x8e", "\xf3\xbe\xa0\xa7"=>"\xf0\x9f\x92\x8f", "\xf3\xbe\xa0\xa8"=>"\xf0\x9f\x92\x90", "\xf3\xbe\xa0\xa9"=>"\xf0\x9f\x92\x91",
- "\xf3\xbe\xa0\xaa"=>"\xf0\x9f\x92\x92", "\xf3\xbe\xac\xa5"=>"\xf0\x9f\x94\x9e", "\xf3\xbe\xac\xa9"=>"\xc2\xa9", "\xf3\xbe\xac\xad"=>"\xc2\xae", "\xf3\xbe\xac\xaa"=>"\xe2\x84\xa2",
- "\xf3\xbe\xad\x87"=>"\xe2\x84\xb9", "\xf3\xbe\xa0\xac"=>"#\xe2\x83\xa3", "\xf3\xbe\xa0\xae"=>"1\xe2\x83\xa3", "\xf3\xbe\xa0\xaf"=>"2\xe2\x83\xa3", "\xf3\xbe\xa0\xb0"=>"3\xe2\x83\xa3",
- "\xf3\xbe\xa0\xb1"=>"4\xe2\x83\xa3", "\xf3\xbe\xa0\xb2"=>"5\xe2\x83\xa3", "\xf3\xbe\xa0\xb3"=>"6\xe2\x83\xa3", "\xf3\xbe\xa0\xb4"=>"7\xe2\x83\xa3", "\xf3\xbe\xa0\xb5"=>"8\xe2\x83\xa3",
- "\xf3\xbe\xa0\xb6"=>"9\xe2\x83\xa3", "\xf3\xbe\xa0\xb7"=>"0\xe2\x83\xa3", "\xf3\xbe\xa0\xbb"=>"\xf0\x9f\x94\x9f", "\xf3\xbe\xa0\xb8"=>"\xf0\x9f\x93\xb6", "\xf3\xbe\xa0\xb9"=>"\xf0\x9f\x93\xb3",
- "\xf3\xbe\xa0\xba"=>"\xf0\x9f\x93\xb4", "\xf3\xbe\xa5\xa0"=>"\xf0\x9f\x8d\x94", "\xf3\xbe\xa5\xa1"=>"\xf0\x9f\x8d\x99", "\xf3\xbe\xa5\xa2"=>"\xf0\x9f\x8d\xb0", "\xf3\xbe\xa5\xa3"=>"\xf0\x9f\x8d\x9c",
- "\xf3\xbe\xa5\xa4"=>"\xf0\x9f\x8d\x9e", "\xf3\xbe\xa5\xa5"=>"\xf0\x9f\x8d\xb3", "\xf3\xbe\xa5\xa6"=>"\xf0\x9f\x8d\xa6", "\xf3\xbe\xa5\xa7"=>"\xf0\x9f\x8d\x9f", "\xf3\xbe\xa5\xa8"=>"\xf0\x9f\x8d\xa1",
- "\xf3\xbe\xa5\xa9"=>"\xf0\x9f\x8d\x98", "\xf3\xbe\xa5\xaa"=>"\xf0\x9f\x8d\x9a", "\xf3\xbe\xa5\xab"=>"\xf0\x9f\x8d\x9d", "\xf3\xbe\xa5\xac"=>"\xf0\x9f\x8d\x9b", "\xf3\xbe\xa5\xad"=>"\xf0\x9f\x8d\xa2",
- "\xf3\xbe\xa5\xae"=>"\xf0\x9f\x8d\xa3", "\xf3\xbe\xa5\xaf"=>"\xf0\x9f\x8d\xb1", "\xf3\xbe\xa5\xb0"=>"\xf0\x9f\x8d\xb2", "\xf3\xbe\xa5\xb1"=>"\xf0\x9f\x8d\xa7", "\xf3\xbe\xa5\xb2"=>"\xf0\x9f\x8d\x96",
- "\xf3\xbe\xa5\xb3"=>"\xf0\x9f\x8d\xa5", "\xf3\xbe\xa5\xb4"=>"\xf0\x9f\x8d\xa0", "\xf3\xbe\xa5\xb5"=>"\xf0\x9f\x8d\x95", "\xf3\xbe\xa5\xb6"=>"\xf0\x9f\x8d\x97", "\xf3\xbe\xa5\xb7"=>"\xf0\x9f\x8d\xa8",
- "\xf3\xbe\xa5\xb8"=>"\xf0\x9f\x8d\xa9", "\xf3\xbe\xa5\xb9"=>"\xf0\x9f\x8d\xaa", "\xf3\xbe\xa5\xba"=>"\xf0\x9f\x8d\xab", "\xf3\xbe\xa5\xbb"=>"\xf0\x9f\x8d\xac", "\xf3\xbe\xa5\xbc"=>"\xf0\x9f\x8d\xad",
- "\xf3\xbe\xa5\xbd"=>"\xf0\x9f\x8d\xae", "\xf3\xbe\xa5\xbe"=>"\xf0\x9f\x8d\xaf", "\xf3\xbe\xa5\xbf"=>"\xf0\x9f\x8d\xa4", "\xf3\xbe\xa6\x80"=>"\xf0\x9f\x8d\xb4", "\xf3\xbe\xa6\x81"=>"\xe2\x98\x95",
- "\xf3\xbe\xa6\x82"=>"\xf0\x9f\x8d\xb8", "\xf3\xbe\xa6\x83"=>"\xf0\x9f\x8d\xba", "\xf3\xbe\xa6\x84"=>"\xf0\x9f\x8d\xb5", "\xf3\xbe\xa6\x85"=>"\xf0\x9f\x8d\xb6", "\xf3\xbe\xa6\x86"=>"\xf0\x9f\x8d\xb7",
- "\xf3\xbe\xa6\x87"=>"\xf0\x9f\x8d\xbb", "\xf3\xbe\xa6\x88"=>"\xf0\x9f\x8d\xb9", "\xf3\xbe\xab\xb0"=>"\xe2\x86\x97", "\xf3\xbe\xab\xb1"=>"\xe2\x86\x98", "\xf3\xbe\xab\xb2"=>"\xe2\x86\x96",
- "\xf3\xbe\xab\xb3"=>"\xe2\x86\x99", "\xf3\xbe\xab\xb4"=>"\xe2\xa4\xb4", "\xf3\xbe\xab\xb5"=>"\xe2\xa4\xb5", "\xf3\xbe\xab\xb6"=>"\xe2\x86\x94", "\xf3\xbe\xab\xb7"=>"\xe2\x86\x95",
- "\xf3\xbe\xab\xb8"=>"\xe2\xac\x86", "\xf3\xbe\xab\xb9"=>"\xe2\xac\x87", "\xf3\xbe\xab\xba"=>"\xe2\x9e\xa1", "\xf3\xbe\xab\xbb"=>"\xe2\xac\x85", "\xf3\xbe\xab\xbc"=>"\xe2\x96\xb6",
- "\xf3\xbe\xab\xbd"=>"\xe2\x97\x80", "\xf3\xbe\xab\xbe"=>"\xe2\x8f\xa9", "\xf3\xbe\xab\xbf"=>"\xe2\x8f\xaa", "\xf3\xbe\xac\x83"=>"\xe2\x8f\xab", "\xf3\xbe\xac\x82"=>"\xe2\x8f\xac",
- "\xf3\xbe\xad\xb8"=>"\xf0\x9f\x94\xba", "\xf3\xbe\xad\xb9"=>"\xf0\x9f\x94\xbb", "\xf3\xbe\xac\x81"=>"\xf0\x9f\x94\xbc", "\xf3\xbe\xac\x80"=>"\xf0\x9f\x94\xbd", "\xf3\xbe\xad\x84"=>"\xe2\xad\x95",
- "\xf3\xbe\xad\x85"=>"\xe2\x9d\x8c", "\xf3\xbe\xad\x86"=>"\xe2\x9d\x8e", "\xf3\xbe\xac\x84"=>"\xe2\x9d\x97", "\xf3\xbe\xac\x85"=>"\xe2\x81\x89", "\xf3\xbe\xac\x86"=>"\xe2\x80\xbc",
- "\xf3\xbe\xac\x89"=>"\xe2\x9d\x93", "\xf3\xbe\xac\x8a"=>"\xe2\x9d\x94", "\xf3\xbe\xac\x8b"=>"\xe2\x9d\x95", "\xf3\xbe\xac\x87"=>"\xe3\x80\xb0", "\xf3\xbe\xac\x88"=>"\xe2\x9e\xb0",
- "\xf3\xbe\xa0\xab"=>"\xe2\x9e\xbf", "\xf3\xbe\xac\x8c"=>"\xe2\x9d\xa4", "\xf3\xbe\xac\x8d"=>"\xf0\x9f\x92\x93", "\xf3\xbe\xac\x8e"=>"\xf0\x9f\x92\x94", "\xf3\xbe\xac\x8f"=>"\xf0\x9f\x92\x95",
- "\xf3\xbe\xac\x90"=>"\xf0\x9f\x92\x96", "\xf3\xbe\xac\x91"=>"\xf0\x9f\x92\x97", "\xf3\xbe\xac\x92"=>"\xf0\x9f\x92\x98", "\xf3\xbe\xac\x93"=>"\xf0\x9f\x92\x99", "\xf3\xbe\xac\x94"=>"\xf0\x9f\x92\x9a",
- "\xf3\xbe\xac\x95"=>"\xf0\x9f\x92\x9b", "\xf3\xbe\xac\x96"=>"\xf0\x9f\x92\x9c", "\xf3\xbe\xac\x97"=>"\xf0\x9f\x92\x9d", "\xf3\xbe\xac\x98"=>"\xf0\x9f\x92\x9e", "\xf3\xbe\xac\x99"=>"\xf0\x9f\x92\x9f",
- "\xf3\xbe\xac\x9a"=>"\xe2\x99\xa5", "\xf3\xbe\xac\x9b"=>"\xe2\x99\xa0", "\xf3\xbe\xac\x9c"=>"\xe2\x99\xa6", "\xf3\xbe\xac\x9d"=>"\xe2\x99\xa3", "\xf3\xbe\xac\x9e"=>"\xf0\x9f\x9a\xac",
- "\xf3\xbe\xac\x9f"=>"\xf0\x9f\x9a\xad", "\xf3\xbe\xac\xa0"=>"\xe2\x99\xbf", "\xf3\xbe\xac\xa2"=>"\xf0\x9f\x9a\xa9", "\xf3\xbe\xac\xa3"=>"\xe2\x9a\xa0", "\xf3\xbe\xac\xa6"=>"\xe2\x9b\x94",
- "\xf3\xbe\xac\xac"=>"\xe2\x99\xbb", "\xf3\xbe\x9f\xab"=>"\xf0\x9f\x9a\xb2", "\xf3\xbe\x9f\xb0"=>"\xf0\x9f\x9a\xb6", "\xf3\xbe\xac\xb3"=>"\xf0\x9f\x9a\xb9", "\xf3\xbe\xac\xb4"=>"\xf0\x9f\x9a\xba",
- "\xf3\xbe\x94\x85"=>"\xf0\x9f\x9b\x80", "\xf3\xbe\x94\x86"=>"\xf0\x9f\x9a\xbb", "\xf3\xbe\x94\x87"=>"\xf0\x9f\x9a\xbd", "\xf3\xbe\x94\x88"=>"\xf0\x9f\x9a\xbe", "\xf3\xbe\xac\xb5"=>"\xf0\x9f\x9a\xbc",
- "\xf3\xbe\x93\xb3"=>"\xf0\x9f\x9a\xaa", "\xf3\xbe\xad\x88"=>"\xf0\x9f\x9a\xab", "\xf3\xbe\xad\x89"=>"\xe2\x9c\x94", "\xf3\xbe\xae\x84"=>"\xf0\x9f\x86\x91", "\xf3\xbe\xac\xb8"=>"\xf0\x9f\x86\x92",
- "\xf3\xbe\xac\xa1"=>"\xf0\x9f\x86\x93", "\xf3\xbe\xae\x81"=>"\xf0\x9f\x86\x94", "\xf3\xbe\xac\xb6"=>"\xf0\x9f\x86\x95", "\xf3\xbe\xac\xa8"=>"\xf0\x9f\x86\x96", "\xf3\xbe\xac\xa7"=>"\xf0\x9f\x86\x97",
- "\xf3\xbe\xad\x8f"=>"\xf0\x9f\x86\x98", "\xf3\xbe\xac\xb7"=>"\xf0\x9f\x86\x99", "\xf3\xbe\xac\xb2"=>"\xf0\x9f\x86\x9a", "\xf3\xbe\xac\xa4"=>"\xf0\x9f\x88\x81", "\xf3\xbe\xac\xbf"=>"\xf0\x9f\x88\x82",
- "\xf3\xbe\xac\xae"=>"\xf0\x9f\x88\xb2", "\xf3\xbe\xac\xaf"=>"\xf0\x9f\x88\xb3", "\xf3\xbe\xac\xb0"=>"\xf0\x9f\x88\xb4", "\xf3\xbe\xac\xb1"=>"\xf0\x9f\x88\xb5", "\xf3\xbe\xac\xb9"=>"\xf0\x9f\x88\xb6",
- "\xf3\xbe\xac\xba"=>"\xf0\x9f\x88\x9a", "\xf3\xbe\xac\xbb"=>"\xf0\x9f\x88\xb7", "\xf3\xbe\xac\xbc"=>"\xf0\x9f\x88\xb8", "\xf3\xbe\xac\xbe"=>"\xf0\x9f\x88\xb9", "\xf3\xbe\xad\x80"=>"\xf0\x9f\x88\xaf",
- "\xf3\xbe\xad\x81"=>"\xf0\x9f\x88\xba", "\xf3\xbe\xac\xab"=>"\xe3\x8a\x99", "\xf3\xbe\xad\x83"=>"\xe3\x8a\x97", "\xf3\xbe\xac\xbd"=>"\xf0\x9f\x89\x90", "\xf3\xbe\xad\x90"=>"\xf0\x9f\x89\x91",
- "\xf3\xbe\xad\x91"=>"\xe2\x9e\x95", "\xf3\xbe\xad\x92"=>"\xe2\x9e\x96", "\xf3\xbe\xad\x93"=>"\xe2\x9c\x96", "\xf3\xbe\xad\x94"=>"\xe2\x9e\x97", "\xf3\xbe\xad\x95"=>"\xf0\x9f\x92\xa0",
- "\xf3\xbe\xad\x96"=>"\xf0\x9f\x92\xa1", "\xf3\xbe\xad\x97"=>"\xf0\x9f\x92\xa2", "\xf3\xbe\xad\x98"=>"\xf0\x9f\x92\xa3", "\xf3\xbe\xad\x99"=>"\xf0\x9f\x92\xa4", "\xf3\xbe\xad\x9a"=>"\xf0\x9f\x92\xa5",
- "\xf3\xbe\xad\x9b"=>"\xf0\x9f\x92\xa6", "\xf3\xbe\xad\x9c"=>"\xf0\x9f\x92\xa7", "\xf3\xbe\xad\x9d"=>"\xf0\x9f\x92\xa8", "\xf3\xbe\x93\xb4"=>"\xf0\x9f\x92\xa9", "\xf3\xbe\xad\x9e"=>"\xf0\x9f\x92\xaa",
- "\xf3\xbe\xad\x9f"=>"\xf0\x9f\x92\xab", "\xf3\xbe\x94\xb2"=>"\xf0\x9f\x92\xac", "\xf3\xbe\xad\xa0"=>"\xe2\x9c\xa8", "\xf3\xbe\xad\xa1"=>"\xe2\x9c\xb4", "\xf3\xbe\xad\xa2"=>"\xe2\x9c\xb3",
- "\xf3\xbe\xad\xa5"=>"\xe2\x9a\xaa", "\xf3\xbe\xad\xa6"=>"\xe2\x9a\xab", "\xf3\xbe\xad\xa3"=>"\xf0\x9f\x94\xb4", "\xf3\xbe\xad\xa4"=>"\xf0\x9f\x94\xb2", "\xf3\xbe\xad\xa7"=>"\xf0\x9f\x94\xb3",
- "\xf3\xbe\xad\xa8"=>"\xe2\xad\x90", "\xf3\xbe\xad\xab"=>"\xe2\xac\x9c", "\xf3\xbe\xad\xac"=>"\xe2\xac\x9b", "\xf3\xbe\xad\xad"=>"\xe2\x96\xab", "\xf3\xbe\xad\xae"=>"\xe2\x96\xaa",
- "\xf3\xbe\xad\xaf"=>"\xe2\x97\xbd", "\xf3\xbe\xad\xb0"=>"\xe2\x97\xbe", "\xf3\xbe\xad\xb1"=>"\xe2\x97\xbb", "\xf3\xbe\xad\xb2"=>"\xe2\x97\xbc", "\xf3\xbe\xad\xb3"=>"\xf0\x9f\x94\xb6",
- "\xf3\xbe\xad\xb4"=>"\xf0\x9f\x94\xb7", "\xf3\xbe\xad\xb5"=>"\xf0\x9f\x94\xb8", "\xf3\xbe\xad\xb6"=>"\xf0\x9f\x94\xb9", "\xf3\xbe\xad\xb7"=>"\xe2\x9d\x87", "\xf3\xbe\xad\xba"=>"\xf0\x9f\x92\xae",
- "\xf3\xbe\xad\xbb"=>"\xf0\x9f\x92\xaf", "\xf3\xbe\xae\x83"=>"\xe2\x86\xa9", "\xf3\xbe\xae\x88"=>"\xe2\x86\xaa", "\xf3\xbe\xae\x91"=>"\xf0\x9f\x94\x83", "\xf3\xbe\xa0\xa1"=>"\xf0\x9f\x94\x8a",
- "\xf3\xbe\x93\xbc"=>"\xf0\x9f\x94\x8b", "\xf3\xbe\x93\xbe"=>"\xf0\x9f\x94\x8c", "\xf3\xbe\xae\x85"=>"\xf0\x9f\x94\x8d", "\xf3\xbe\xae\x8d"=>"\xf0\x9f\x94\x8e", "\xf3\xbe\xae\x86"=>"\xf0\x9f\x94\x92",
- "\xf3\xbe\xae\x87"=>"\xf0\x9f\x94\x93", "\xf3\xbe\xae\x90"=>"\xf0\x9f\x94\x8f", "\xf3\xbe\xae\x8a"=>"\xf0\x9f\x94\x90", "\xf3\xbe\xae\x82"=>"\xf0\x9f\x94\x91", "\xf3\xbe\x93\xb2"=>"\xf0\x9f\x94\x94",
- "\xf3\xbe\xae\x8b"=>"\xe2\x98\x91", "\xf3\xbe\xae\x8c"=>"\xf0\x9f\x94\x98", "\xf3\xbe\xae\x8f"=>"\xf0\x9f\x94\x96", "\xf3\xbe\xad\x8b"=>"\xf0\x9f\x94\x97", "\xf3\xbe\xae\x8e"=>"\xf0\x9f\x94\x99",
- "\xf3\xbe\x80\x9a"=>"\xf0\x9f\x94\x9a", "\xf3\xbe\x80\x99"=>"\xf0\x9f\x94\x9b", "\xf3\xbe\x80\x98"=>"\xf0\x9f\x94\x9c", "\xf3\xbe\xad\x82"=>"\xf0\x9f\x94\x9d", "\xf3\xbe\xad\x8a"=>"\xe2\x9c\x85",
- "\xf3\xbe\xae\x93"=>"\xe2\x9c\x8a", "\xf3\xbe\xae\x95"=>"\xe2\x9c\x8b", "\xf3\xbe\xae\x94"=>"\xe2\x9c\x8c", "\xf3\xbe\xae\x96"=>"\xf0\x9f\x91\x8a", "\xf3\xbe\xae\x97"=>"\xf0\x9f\x91\x8d",
- "\xf3\xbe\xae\x98"=>"\xe2\x98\x9d", "\xf3\xbe\xae\x99"=>"\xf0\x9f\x91\x86", "\xf3\xbe\xae\x9a"=>"\xf0\x9f\x91\x87", "\xf3\xbe\xae\x9b"=>"\xf0\x9f\x91\x88", "\xf3\xbe\xae\x9c"=>"\xf0\x9f\x91\x89",
- "\xf3\xbe\xae\x9d"=>"\xf0\x9f\x91\x8b", "\xf3\xbe\xae\x9e"=>"\xf0\x9f\x91\x8f", "\xf3\xbe\xae\x9f"=>"\xf0\x9f\x91\x8c", "\xf3\xbe\xae\xa0"=>"\xf0\x9f\x91\x8e", "\xf3\xbe\xae\xa1"=>"\xf0\x9f\x91\x90",
- ),
- 'unified_to_html' => array(
- "\xe2\x98\x80"=>"<span class=\x22emoji emoji2600\x22></span>", "\xe2\x98\x81"=>"<span class=\x22emoji emoji2601\x22></span>", "\xe2\x98\x94"=>"<span class=\x22emoji emoji2614\x22></span>", "\xe2\x9b\x84"=>"<span class=\x22emoji emoji26c4\x22></span>",
- "\xe2\x9a\xa1"=>"<span class=\x22emoji emoji26a1\x22></span>", "\xf0\x9f\x8c\x80"=>"<span class=\x22emoji emoji1f300\x22></span>", "\xf0\x9f\x8c\x81"=>"<span class=\x22emoji emoji1f301\x22></span>", "\xf0\x9f\x8c\x82"=>"<span class=\x22emoji emoji1f302\x22></span>", "\xf0\x9f\x8c\x83"=>"<span class=\x22emoji emoji1f303\x22></span>",
- "\xf0\x9f\x8c\x84"=>"<span class=\x22emoji emoji1f304\x22></span>", "\xf0\x9f\x8c\x85"=>"<span class=\x22emoji emoji1f305\x22></span>", "\xf0\x9f\x8c\x86"=>"<span class=\x22emoji emoji1f306\x22></span>", "\xf0\x9f\x8c\x87"=>"<span class=\x22emoji emoji1f307\x22></span>", "\xf0\x9f\x8c\x88"=>"<span class=\x22emoji emoji1f308\x22></span>",
- "\xe2\x9d\x84"=>"<span class=\x22emoji emoji2744\x22></span>", "\xe2\x9b\x85"=>"<span class=\x22emoji emoji26c5\x22></span>", "\xf0\x9f\x8c\x89"=>"<span class=\x22emoji emoji1f309\x22></span>", "\xf0\x9f\x8c\x8a"=>"<span class=\x22emoji emoji1f30a\x22></span>", "\xf0\x9f\x8c\x8b"=>"<span class=\x22emoji emoji1f30b\x22></span>",
- "\xf0\x9f\x8c\x8c"=>"<span class=\x22emoji emoji1f30c\x22></span>", "\xf0\x9f\x8c\x8f"=>"<span class=\x22emoji emoji1f30f\x22></span>", "\xf0\x9f\x8c\x91"=>"<span class=\x22emoji emoji1f311\x22></span>", "\xf0\x9f\x8c\x94"=>"<span class=\x22emoji emoji1f314\x22></span>", "\xf0\x9f\x8c\x93"=>"<span class=\x22emoji emoji1f313\x22></span>",
- "\xf0\x9f\x8c\x99"=>"<span class=\x22emoji emoji1f319\x22></span>", "\xf0\x9f\x8c\x95"=>"<span class=\x22emoji emoji1f315\x22></span>", "\xf0\x9f\x8c\x9b"=>"<span class=\x22emoji emoji1f31b\x22></span>", "\xf0\x9f\x8c\x9f"=>"<span class=\x22emoji emoji1f31f\x22></span>", "\xf0\x9f\x8c\xa0"=>"<span class=\x22emoji emoji1f320\x22></span>",
- "\xf0\x9f\x95\x90"=>"<span class=\x22emoji emoji1f550\x22></span>", "\xf0\x9f\x95\x91"=>"<span class=\x22emoji emoji1f551\x22></span>", "\xf0\x9f\x95\x92"=>"<span class=\x22emoji emoji1f552\x22></span>", "\xf0\x9f\x95\x93"=>"<span class=\x22emoji emoji1f553\x22></span>", "\xf0\x9f\x95\x94"=>"<span class=\x22emoji emoji1f554\x22></span>",
- "\xf0\x9f\x95\x95"=>"<span class=\x22emoji emoji1f555\x22></span>", "\xf0\x9f\x95\x96"=>"<span class=\x22emoji emoji1f556\x22></span>", "\xf0\x9f\x95\x97"=>"<span class=\x22emoji emoji1f557\x22></span>", "\xf0\x9f\x95\x98"=>"<span class=\x22emoji emoji1f558\x22></span>", "\xf0\x9f\x95\x99"=>"<span class=\x22emoji emoji1f559\x22></span>",
- "\xf0\x9f\x95\x9a"=>"<span class=\x22emoji emoji1f55a\x22></span>", "\xf0\x9f\x95\x9b"=>"<span class=\x22emoji emoji1f55b\x22></span>", "\xe2\x8c\x9a"=>"<span class=\x22emoji emoji231a\x22></span>", "\xe2\x8c\x9b"=>"<span class=\x22emoji emoji231b\x22></span>", "\xe2\x8f\xb0"=>"<span class=\x22emoji emoji23f0\x22></span>",
- "\xe2\x8f\xb3"=>"<span class=\x22emoji emoji23f3\x22></span>", "\xe2\x99\x88"=>"<span class=\x22emoji emoji2648\x22></span>", "\xe2\x99\x89"=>"<span class=\x22emoji emoji2649\x22></span>", "\xe2\x99\x8a"=>"<span class=\x22emoji emoji264a\x22></span>", "\xe2\x99\x8b"=>"<span class=\x22emoji emoji264b\x22></span>",
- "\xe2\x99\x8c"=>"<span class=\x22emoji emoji264c\x22></span>", "\xe2\x99\x8d"=>"<span class=\x22emoji emoji264d\x22></span>", "\xe2\x99\x8e"=>"<span class=\x22emoji emoji264e\x22></span>", "\xe2\x99\x8f"=>"<span class=\x22emoji emoji264f\x22></span>", "\xe2\x99\x90"=>"<span class=\x22emoji emoji2650\x22></span>",
- "\xe2\x99\x91"=>"<span class=\x22emoji emoji2651\x22></span>", "\xe2\x99\x92"=>"<span class=\x22emoji emoji2652\x22></span>", "\xe2\x99\x93"=>"<span class=\x22emoji emoji2653\x22></span>", "\xe2\x9b\x8e"=>"<span class=\x22emoji emoji26ce\x22></span>", "\xf0\x9f\x8d\x80"=>"<span class=\x22emoji emoji1f340\x22></span>",
- "\xf0\x9f\x8c\xb7"=>"<span class=\x22emoji emoji1f337\x22></span>", "\xf0\x9f\x8c\xb1"=>"<span class=\x22emoji emoji1f331\x22></span>", "\xf0\x9f\x8d\x81"=>"<span class=\x22emoji emoji1f341\x22></span>", "\xf0\x9f\x8c\xb8"=>"<span class=\x22emoji emoji1f338\x22></span>", "\xf0\x9f\x8c\xb9"=>"<span class=\x22emoji emoji1f339\x22></span>",
- "\xf0\x9f\x8d\x82"=>"<span class=\x22emoji emoji1f342\x22></span>", "\xf0\x9f\x8d\x83"=>"<span class=\x22emoji emoji1f343\x22></span>", "\xf0\x9f\x8c\xba"=>"<span class=\x22emoji emoji1f33a\x22></span>", "\xf0\x9f\x8c\xbb"=>"<span class=\x22emoji emoji1f33b\x22></span>", "\xf0\x9f\x8c\xb4"=>"<span class=\x22emoji emoji1f334\x22></span>",
- "\xf0\x9f\x8c\xb5"=>"<span class=\x22emoji emoji1f335\x22></span>", "\xf0\x9f\x8c\xbe"=>"<span class=\x22emoji emoji1f33e\x22></span>", "\xf0\x9f\x8c\xbd"=>"<span class=\x22emoji emoji1f33d\x22></span>", "\xf0\x9f\x8d\x84"=>"<span class=\x22emoji emoji1f344\x22></span>", "\xf0\x9f\x8c\xb0"=>"<span class=\x22emoji emoji1f330\x22></span>",
- "\xf0\x9f\x8c\xbc"=>"<span class=\x22emoji emoji1f33c\x22></span>", "\xf0\x9f\x8c\xbf"=>"<span class=\x22emoji emoji1f33f\x22></span>", "\xf0\x9f\x8d\x92"=>"<span class=\x22emoji emoji1f352\x22></span>", "\xf0\x9f\x8d\x8c"=>"<span class=\x22emoji emoji1f34c\x22></span>", "\xf0\x9f\x8d\x8e"=>"<span class=\x22emoji emoji1f34e\x22></span>",
- "\xf0\x9f\x8d\x8a"=>"<span class=\x22emoji emoji1f34a\x22></span>", "\xf0\x9f\x8d\x93"=>"<span class=\x22emoji emoji1f353\x22></span>", "\xf0\x9f\x8d\x89"=>"<span class=\x22emoji emoji1f349\x22></span>", "\xf0\x9f\x8d\x85"=>"<span class=\x22emoji emoji1f345\x22></span>", "\xf0\x9f\x8d\x86"=>"<span class=\x22emoji emoji1f346\x22></span>",
- "\xf0\x9f\x8d\x88"=>"<span class=\x22emoji emoji1f348\x22></span>", "\xf0\x9f\x8d\x8d"=>"<span class=\x22emoji emoji1f34d\x22></span>", "\xf0\x9f\x8d\x87"=>"<span class=\x22emoji emoji1f347\x22></span>", "\xf0\x9f\x8d\x91"=>"<span class=\x22emoji emoji1f351\x22></span>", "\xf0\x9f\x8d\x8f"=>"<span class=\x22emoji emoji1f34f\x22></span>",
- "\xf0\x9f\x91\x80"=>"<span class=\x22emoji emoji1f440\x22></span>", "\xf0\x9f\x91\x82"=>"<span class=\x22emoji emoji1f442\x22></span>", "\xf0\x9f\x91\x83"=>"<span class=\x22emoji emoji1f443\x22></span>", "\xf0\x9f\x91\x84"=>"<span class=\x22emoji emoji1f444\x22></span>", "\xf0\x9f\x91\x85"=>"<span class=\x22emoji emoji1f445\x22></span>",
- "\xf0\x9f\x92\x84"=>"<span class=\x22emoji emoji1f484\x22></span>", "\xf0\x9f\x92\x85"=>"<span class=\x22emoji emoji1f485\x22></span>", "\xf0\x9f\x92\x86"=>"<span class=\x22emoji emoji1f486\x22></span>", "\xf0\x9f\x92\x87"=>"<span class=\x22emoji emoji1f487\x22></span>", "\xf0\x9f\x92\x88"=>"<span class=\x22emoji emoji1f488\x22></span>",
- "\xf0\x9f\x91\xa4"=>"<span class=\x22emoji emoji1f464\x22></span>", "\xf0\x9f\x91\xa6"=>"<span class=\x22emoji emoji1f466\x22></span>", "\xf0\x9f\x91\xa7"=>"<span class=\x22emoji emoji1f467\x22></span>", "\xf0\x9f\x91\xa8"=>"<span class=\x22emoji emoji1f468\x22></span>", "\xf0\x9f\x91\xa9"=>"<span class=\x22emoji emoji1f469\x22></span>",
- "\xf0\x9f\x91\xaa"=>"<span class=\x22emoji emoji1f46a\x22></span>", "\xf0\x9f\x91\xab"=>"<span class=\x22emoji emoji1f46b\x22></span>", "\xf0\x9f\x91\xae"=>"<span class=\x22emoji emoji1f46e\x22></span>", "\xf0\x9f\x91\xaf"=>"<span class=\x22emoji emoji1f46f\x22></span>", "\xf0\x9f\x91\xb0"=>"<span class=\x22emoji emoji1f470\x22></span>",
- "\xf0\x9f\x91\xb1"=>"<span class=\x22emoji emoji1f471\x22></span>", "\xf0\x9f\x91\xb2"=>"<span class=\x22emoji emoji1f472\x22></span>", "\xf0\x9f\x91\xb3"=>"<span class=\x22emoji emoji1f473\x22></span>", "\xf0\x9f\x91\xb4"=>"<span class=\x22emoji emoji1f474\x22></span>", "\xf0\x9f\x91\xb5"=>"<span class=\x22emoji emoji1f475\x22></span>",
- "\xf0\x9f\x91\xb6"=>"<span class=\x22emoji emoji1f476\x22></span>", "\xf0\x9f\x91\xb7"=>"<span class=\x22emoji emoji1f477\x22></span>", "\xf0\x9f\x91\xb8"=>"<span class=\x22emoji emoji1f478\x22></span>", "\xf0\x9f\x91\xb9"=>"<span class=\x22emoji emoji1f479\x22></span>", "\xf0\x9f\x91\xba"=>"<span class=\x22emoji emoji1f47a\x22></span>",
- "\xf0\x9f\x91\xbb"=>"<span class=\x22emoji emoji1f47b\x22></span>", "\xf0\x9f\x91\xbc"=>"<span class=\x22emoji emoji1f47c\x22></span>", "\xf0\x9f\x91\xbd"=>"<span class=\x22emoji emoji1f47d\x22></span>", "\xf0\x9f\x91\xbe"=>"<span class=\x22emoji emoji1f47e\x22></span>", "\xf0\x9f\x91\xbf"=>"<span class=\x22emoji emoji1f47f\x22></span>",
- "\xf0\x9f\x92\x80"=>"<span class=\x22emoji emoji1f480\x22></span>", "\xf0\x9f\x92\x81"=>"<span class=\x22emoji emoji1f481\x22></span>", "\xf0\x9f\x92\x82"=>"<span class=\x22emoji emoji1f482\x22></span>", "\xf0\x9f\x92\x83"=>"<span class=\x22emoji emoji1f483\x22></span>", "\xf0\x9f\x90\x8c"=>"<span class=\x22emoji emoji1f40c\x22></span>",
- "\xf0\x9f\x90\x8d"=>"<span class=\x22emoji emoji1f40d\x22></span>", "\xf0\x9f\x90\x8e"=>"<span class=\x22emoji emoji1f40e\x22></span>", "\xf0\x9f\x90\x94"=>"<span class=\x22emoji emoji1f414\x22></span>", "\xf0\x9f\x90\x97"=>"<span class=\x22emoji emoji1f417\x22></span>", "\xf0\x9f\x90\xab"=>"<span class=\x22emoji emoji1f42b\x22></span>",
- "\xf0\x9f\x90\x98"=>"<span class=\x22emoji emoji1f418\x22></span>", "\xf0\x9f\x90\xa8"=>"<span class=\x22emoji emoji1f428\x22></span>", "\xf0\x9f\x90\x92"=>"<span class=\x22emoji emoji1f412\x22></span>", "\xf0\x9f\x90\x91"=>"<span class=\x22emoji emoji1f411\x22></span>", "\xf0\x9f\x90\x99"=>"<span class=\x22emoji emoji1f419\x22></span>",
- "\xf0\x9f\x90\x9a"=>"<span class=\x22emoji emoji1f41a\x22></span>", "\xf0\x9f\x90\x9b"=>"<span class=\x22emoji emoji1f41b\x22></span>", "\xf0\x9f\x90\x9c"=>"<span class=\x22emoji emoji1f41c\x22></span>", "\xf0\x9f\x90\x9d"=>"<span class=\x22emoji emoji1f41d\x22></span>", "\xf0\x9f\x90\x9e"=>"<span class=\x22emoji emoji1f41e\x22></span>",
- "\xf0\x9f\x90\xa0"=>"<span class=\x22emoji emoji1f420\x22></span>", "\xf0\x9f\x90\xa1"=>"<span class=\x22emoji emoji1f421\x22></span>", "\xf0\x9f\x90\xa2"=>"<span class=\x22emoji emoji1f422\x22></span>", "\xf0\x9f\x90\xa4"=>"<span class=\x22emoji emoji1f424\x22></span>", "\xf0\x9f\x90\xa5"=>"<span class=\x22emoji emoji1f425\x22></span>",
- "\xf0\x9f\x90\xa6"=>"<span class=\x22emoji emoji1f426\x22></span>", "\xf0\x9f\x90\xa3"=>"<span class=\x22emoji emoji1f423\x22></span>", "\xf0\x9f\x90\xa7"=>"<span class=\x22emoji emoji1f427\x22></span>", "\xf0\x9f\x90\xa9"=>"<span class=\x22emoji emoji1f429\x22></span>", "\xf0\x9f\x90\x9f"=>"<span class=\x22emoji emoji1f41f\x22></span>",
- "\xf0\x9f\x90\xac"=>"<span class=\x22emoji emoji1f42c\x22></span>", "\xf0\x9f\x90\xad"=>"<span class=\x22emoji emoji1f42d\x22></span>", "\xf0\x9f\x90\xaf"=>"<span class=\x22emoji emoji1f42f\x22></span>", "\xf0\x9f\x90\xb1"=>"<span class=\x22emoji emoji1f431\x22></span>", "\xf0\x9f\x90\xb3"=>"<span class=\x22emoji emoji1f433\x22></span>",
- "\xf0\x9f\x90\xb4"=>"<span class=\x22emoji emoji1f434\x22></span>", "\xf0\x9f\x90\xb5"=>"<span class=\x22emoji emoji1f435\x22></span>", "\xf0\x9f\x90\xb6"=>"<span class=\x22emoji emoji1f436\x22></span>", "\xf0\x9f\x90\xb7"=>"<span class=\x22emoji emoji1f437\x22></span>", "\xf0\x9f\x90\xbb"=>"<span class=\x22emoji emoji1f43b\x22></span>",
- "\xf0\x9f\x90\xb9"=>"<span class=\x22emoji emoji1f439\x22></span>", "\xf0\x9f\x90\xba"=>"<span class=\x22emoji emoji1f43a\x22></span>", "\xf0\x9f\x90\xae"=>"<span class=\x22emoji emoji1f42e\x22></span>", "\xf0\x9f\x90\xb0"=>"<span class=\x22emoji emoji1f430\x22></span>", "\xf0\x9f\x90\xb8"=>"<span class=\x22emoji emoji1f438\x22></span>",
- "\xf0\x9f\x90\xbe"=>"<span class=\x22emoji emoji1f43e\x22></span>", "\xf0\x9f\x90\xb2"=>"<span class=\x22emoji emoji1f432\x22></span>", "\xf0\x9f\x90\xbc"=>"<span class=\x22emoji emoji1f43c\x22></span>", "\xf0\x9f\x90\xbd"=>"<span class=\x22emoji emoji1f43d\x22></span>", "\xf0\x9f\x98\xa0"=>"<span class=\x22emoji emoji1f620\x22></span>",
- "\xf0\x9f\x98\xa9"=>"<span class=\x22emoji emoji1f629\x22></span>", "\xf0\x9f\x98\xb2"=>"<span class=\x22emoji emoji1f632\x22></span>", "\xf0\x9f\x98\x9e"=>"<span class=\x22emoji emoji1f61e\x22></span>", "\xf0\x9f\x98\xb5"=>"<span class=\x22emoji emoji1f635\x22></span>", "\xf0\x9f\x98\xb0"=>"<span class=\x22emoji emoji1f630\x22></span>",
- "\xf0\x9f\x98\x92"=>"<span class=\x22emoji emoji1f612\x22></span>", "\xf0\x9f\x98\x8d"=>"<span class=\x22emoji emoji1f60d\x22></span>", "\xf0\x9f\x98\xa4"=>"<span class=\x22emoji emoji1f624\x22></span>", "\xf0\x9f\x98\x9c"=>"<span class=\x22emoji emoji1f61c\x22></span>", "\xf0\x9f\x98\x9d"=>"<span class=\x22emoji emoji1f61d\x22></span>",
- "\xf0\x9f\x98\x8b"=>"<span class=\x22emoji emoji1f60b\x22></span>", "\xf0\x9f\x98\x98"=>"<span class=\x22emoji emoji1f618\x22></span>", "\xf0\x9f\x98\x9a"=>"<span class=\x22emoji emoji1f61a\x22></span>", "\xf0\x9f\x98\xb7"=>"<span class=\x22emoji emoji1f637\x22></span>", "\xf0\x9f\x98\xb3"=>"<span class=\x22emoji emoji1f633\x22></span>",
- "\xf0\x9f\x98\x83"=>"<span class=\x22emoji emoji1f603\x22></span>", "\xf0\x9f\x98\x85"=>"<span class=\x22emoji emoji1f605\x22></span>", "\xf0\x9f\x98\x86"=>"<span class=\x22emoji emoji1f606\x22></span>", "\xf0\x9f\x98\x81"=>"<span class=\x22emoji emoji1f601\x22></span>", "\xf0\x9f\x98\x82"=>"<span class=\x22emoji emoji1f602\x22></span>",
- "\xf0\x9f\x98\x8a"=>"<span class=\x22emoji emoji1f60a\x22></span>", "\xe2\x98\xba"=>"<span class=\x22emoji emoji263a\x22></span>", "\xf0\x9f\x98\x84"=>"<span class=\x22emoji emoji1f604\x22></span>", "\xf0\x9f\x98\xa2"=>"<span class=\x22emoji emoji1f622\x22></span>", "\xf0\x9f\x98\xad"=>"<span class=\x22emoji emoji1f62d\x22></span>",
- "\xf0\x9f\x98\xa8"=>"<span class=\x22emoji emoji1f628\x22></span>", "\xf0\x9f\x98\xa3"=>"<span class=\x22emoji emoji1f623\x22></span>", "\xf0\x9f\x98\xa1"=>"<span class=\x22emoji emoji1f621\x22></span>", "\xf0\x9f\x98\x8c"=>"<span class=\x22emoji emoji1f60c\x22></span>", "\xf0\x9f\x98\x96"=>"<span class=\x22emoji emoji1f616\x22></span>",
- "\xf0\x9f\x98\x94"=>"<span class=\x22emoji emoji1f614\x22></span>", "\xf0\x9f\x98\xb1"=>"<span class=\x22emoji emoji1f631\x22></span>", "\xf0\x9f\x98\xaa"=>"<span class=\x22emoji emoji1f62a\x22></span>", "\xf0\x9f\x98\x8f"=>"<span class=\x22emoji emoji1f60f\x22></span>", "\xf0\x9f\x98\x93"=>"<span class=\x22emoji emoji1f613\x22></span>",
- "\xf0\x9f\x98\xa5"=>"<span class=\x22emoji emoji1f625\x22></span>", "\xf0\x9f\x98\xab"=>"<span class=\x22emoji emoji1f62b\x22></span>", "\xf0\x9f\x98\x89"=>"<span class=\x22emoji emoji1f609\x22></span>", "\xf0\x9f\x98\xba"=>"<span class=\x22emoji emoji1f63a\x22></span>", "\xf0\x9f\x98\xb8"=>"<span class=\x22emoji emoji1f638\x22></span>",
- "\xf0\x9f\x98\xb9"=>"<span class=\x22emoji emoji1f639\x22></span>", "\xf0\x9f\x98\xbd"=>"<span class=\x22emoji emoji1f63d\x22></span>", "\xf0\x9f\x98\xbb"=>"<span class=\x22emoji emoji1f63b\x22></span>", "\xf0\x9f\x98\xbf"=>"<span class=\x22emoji emoji1f63f\x22></span>", "\xf0\x9f\x98\xbe"=>"<span class=\x22emoji emoji1f63e\x22></span>",
- "\xf0\x9f\x98\xbc"=>"<span class=\x22emoji emoji1f63c\x22></span>", "\xf0\x9f\x99\x80"=>"<span class=\x22emoji emoji1f640\x22></span>", "\xf0\x9f\x99\x85"=>"<span class=\x22emoji emoji1f645\x22></span>", "\xf0\x9f\x99\x86"=>"<span class=\x22emoji emoji1f646\x22></span>", "\xf0\x9f\x99\x87"=>"<span class=\x22emoji emoji1f647\x22></span>",
- "\xf0\x9f\x99\x88"=>"<span class=\x22emoji emoji1f648\x22></span>", "\xf0\x9f\x99\x8a"=>"<span class=\x22emoji emoji1f64a\x22></span>", "\xf0\x9f\x99\x89"=>"<span class=\x22emoji emoji1f649\x22></span>", "\xf0\x9f\x99\x8b"=>"<span class=\x22emoji emoji1f64b\x22></span>", "\xf0\x9f\x99\x8c"=>"<span class=\x22emoji emoji1f64c\x22></span>",
- "\xf0\x9f\x99\x8d"=>"<span class=\x22emoji emoji1f64d\x22></span>", "\xf0\x9f\x99\x8e"=>"<span class=\x22emoji emoji1f64e\x22></span>", "\xf0\x9f\x99\x8f"=>"<span class=\x22emoji emoji1f64f\x22></span>", "\xf0\x9f\x8f\xa0"=>"<span class=\x22emoji emoji1f3e0\x22></span>", "\xf0\x9f\x8f\xa1"=>"<span class=\x22emoji emoji1f3e1\x22></span>",
- "\xf0\x9f\x8f\xa2"=>"<span class=\x22emoji emoji1f3e2\x22></span>", "\xf0\x9f\x8f\xa3"=>"<span class=\x22emoji emoji1f3e3\x22></span>", "\xf0\x9f\x8f\xa5"=>"<span class=\x22emoji emoji1f3e5\x22></span>", "\xf0\x9f\x8f\xa6"=>"<span class=\x22emoji emoji1f3e6\x22></span>", "\xf0\x9f\x8f\xa7"=>"<span class=\x22emoji emoji1f3e7\x22></span>",
- "\xf0\x9f\x8f\xa8"=>"<span class=\x22emoji emoji1f3e8\x22></span>", "\xf0\x9f\x8f\xa9"=>"<span class=\x22emoji emoji1f3e9\x22></span>", "\xf0\x9f\x8f\xaa"=>"<span class=\x22emoji emoji1f3ea\x22></span>", "\xf0\x9f\x8f\xab"=>"<span class=\x22emoji emoji1f3eb\x22></span>", "\xe2\x9b\xaa"=>"<span class=\x22emoji emoji26ea\x22></span>",
- "\xe2\x9b\xb2"=>"<span class=\x22emoji emoji26f2\x22></span>", "\xf0\x9f\x8f\xac"=>"<span class=\x22emoji emoji1f3ec\x22></span>", "\xf0\x9f\x8f\xaf"=>"<span class=\x22emoji emoji1f3ef\x22></span>", "\xf0\x9f\x8f\xb0"=>"<span class=\x22emoji emoji1f3f0\x22></span>", "\xf0\x9f\x8f\xad"=>"<span class=\x22emoji emoji1f3ed\x22></span>",
- "\xe2\x9a\x93"=>"<span class=\x22emoji emoji2693\x22></span>", "\xf0\x9f\x8f\xae"=>"<span class=\x22emoji emoji1f3ee\x22></span>", "\xf0\x9f\x97\xbb"=>"<span class=\x22emoji emoji1f5fb\x22></span>", "\xf0\x9f\x97\xbc"=>"<span class=\x22emoji emoji1f5fc\x22></span>", "\xf0\x9f\x97\xbd"=>"<span class=\x22emoji emoji1f5fd\x22></span>",
- "\xf0\x9f\x97\xbe"=>"<span class=\x22emoji emoji1f5fe\x22></span>", "\xf0\x9f\x97\xbf"=>"<span class=\x22emoji emoji1f5ff\x22></span>", "\xf0\x9f\x91\x9e"=>"<span class=\x22emoji emoji1f45e\x22></span>", "\xf0\x9f\x91\x9f"=>"<span class=\x22emoji emoji1f45f\x22></span>", "\xf0\x9f\x91\xa0"=>"<span class=\x22emoji emoji1f460\x22></span>",
- "\xf0\x9f\x91\xa1"=>"<span class=\x22emoji emoji1f461\x22></span>", "\xf0\x9f\x91\xa2"=>"<span class=\x22emoji emoji1f462\x22></span>", "\xf0\x9f\x91\xa3"=>"<span class=\x22emoji emoji1f463\x22></span>", "\xf0\x9f\x91\x93"=>"<span class=\x22emoji emoji1f453\x22></span>", "\xf0\x9f\x91\x95"=>"<span class=\x22emoji emoji1f455\x22></span>",
- "\xf0\x9f\x91\x96"=>"<span class=\x22emoji emoji1f456\x22></span>", "\xf0\x9f\x91\x91"=>"<span class=\x22emoji emoji1f451\x22></span>", "\xf0\x9f\x91\x94"=>"<span class=\x22emoji emoji1f454\x22></span>", "\xf0\x9f\x91\x92"=>"<span class=\x22emoji emoji1f452\x22></span>", "\xf0\x9f\x91\x97"=>"<span class=\x22emoji emoji1f457\x22></span>",
- "\xf0\x9f\x91\x98"=>"<span class=\x22emoji emoji1f458\x22></span>", "\xf0\x9f\x91\x99"=>"<span class=\x22emoji emoji1f459\x22></span>", "\xf0\x9f\x91\x9a"=>"<span class=\x22emoji emoji1f45a\x22></span>", "\xf0\x9f\x91\x9b"=>"<span class=\x22emoji emoji1f45b\x22></span>", "\xf0\x9f\x91\x9c"=>"<span class=\x22emoji emoji1f45c\x22></span>",
- "\xf0\x9f\x91\x9d"=>"<span class=\x22emoji emoji1f45d\x22></span>", "\xf0\x9f\x92\xb0"=>"<span class=\x22emoji emoji1f4b0\x22></span>", "\xf0\x9f\x92\xb1"=>"<span class=\x22emoji emoji1f4b1\x22></span>", "\xf0\x9f\x92\xb9"=>"<span class=\x22emoji emoji1f4b9\x22></span>", "\xf0\x9f\x92\xb2"=>"<span class=\x22emoji emoji1f4b2\x22></span>",
- "\xf0\x9f\x92\xb3"=>"<span class=\x22emoji emoji1f4b3\x22></span>", "\xf0\x9f\x92\xb4"=>"<span class=\x22emoji emoji1f4b4\x22></span>", "\xf0\x9f\x92\xb5"=>"<span class=\x22emoji emoji1f4b5\x22></span>", "\xf0\x9f\x92\xb8"=>"<span class=\x22emoji emoji1f4b8\x22></span>", "\xf0\x9f\x87\xa8\xf0\x9f\x87\xb3"=>"<span class=\x22emoji emoji1f1e81f1f3\x22></span>",
- "\xf0\x9f\x87\xa9\xf0\x9f\x87\xaa"=>"<span class=\x22emoji emoji1f1e91f1ea\x22></span>", "\xf0\x9f\x87\xaa\xf0\x9f\x87\xb8"=>"<span class=\x22emoji emoji1f1ea1f1f8\x22></span>", "\xf0\x9f\x87\xab\xf0\x9f\x87\xb7"=>"<span class=\x22emoji emoji1f1eb1f1f7\x22></span>", "\xf0\x9f\x87\xac\xf0\x9f\x87\xa7"=>"<span class=\x22emoji emoji1f1ec1f1e7\x22></span>", "\xf0\x9f\x87\xae\xf0\x9f\x87\xb9"=>"<span class=\x22emoji emoji1f1ee1f1f9\x22></span>",
- "\xf0\x9f\x87\xaf\xf0\x9f\x87\xb5"=>"<span class=\x22emoji emoji1f1ef1f1f5\x22></span>", "\xf0\x9f\x87\xb0\xf0\x9f\x87\xb7"=>"<span class=\x22emoji emoji1f1f01f1f7\x22></span>", "\xf0\x9f\x87\xb7\xf0\x9f\x87\xba"=>"<span class=\x22emoji emoji1f1f71f1fa\x22></span>", "\xf0\x9f\x87\xba\xf0\x9f\x87\xb8"=>"<span class=\x22emoji emoji1f1fa1f1f8\x22></span>", "\xf0\x9f\x94\xa5"=>"<span class=\x22emoji emoji1f525\x22></span>",
- "\xf0\x9f\x94\xa6"=>"<span class=\x22emoji emoji1f526\x22></span>", "\xf0\x9f\x94\xa7"=>"<span class=\x22emoji emoji1f527\x22></span>", "\xf0\x9f\x94\xa8"=>"<span class=\x22emoji emoji1f528\x22></span>", "\xf0\x9f\x94\xa9"=>"<span class=\x22emoji emoji1f529\x22></span>", "\xf0\x9f\x94\xaa"=>"<span class=\x22emoji emoji1f52a\x22></span>",
- "\xf0\x9f\x94\xab"=>"<span class=\x22emoji emoji1f52b\x22></span>", "\xf0\x9f\x94\xae"=>"<span class=\x22emoji emoji1f52e\x22></span>", "\xf0\x9f\x94\xaf"=>"<span class=\x22emoji emoji1f52f\x22></span>", "\xf0\x9f\x94\xb0"=>"<span class=\x22emoji emoji1f530\x22></span>", "\xf0\x9f\x94\xb1"=>"<span class=\x22emoji emoji1f531\x22></span>",
- "\xf0\x9f\x92\x89"=>"<span class=\x22emoji emoji1f489\x22></span>", "\xf0\x9f\x92\x8a"=>"<span class=\x22emoji emoji1f48a\x22></span>", "\xf0\x9f\x85\xb0"=>"<span class=\x22emoji emoji1f170\x22></span>", "\xf0\x9f\x85\xb1"=>"<span class=\x22emoji emoji1f171\x22></span>", "\xf0\x9f\x86\x8e"=>"<span class=\x22emoji emoji1f18e\x22></span>",
- "\xf0\x9f\x85\xbe"=>"<span class=\x22emoji emoji1f17e\x22></span>", "\xf0\x9f\x8e\x80"=>"<span class=\x22emoji emoji1f380\x22></span>", "\xf0\x9f\x8e\x81"=>"<span class=\x22emoji emoji1f381\x22></span>", "\xf0\x9f\x8e\x82"=>"<span class=\x22emoji emoji1f382\x22></span>", "\xf0\x9f\x8e\x84"=>"<span class=\x22emoji emoji1f384\x22></span>",
- "\xf0\x9f\x8e\x85"=>"<span class=\x22emoji emoji1f385\x22></span>", "\xf0\x9f\x8e\x8c"=>"<span class=\x22emoji emoji1f38c\x22></span>", "\xf0\x9f\x8e\x86"=>"<span class=\x22emoji emoji1f386\x22></span>", "\xf0\x9f\x8e\x88"=>"<span class=\x22emoji emoji1f388\x22></span>", "\xf0\x9f\x8e\x89"=>"<span class=\x22emoji emoji1f389\x22></span>",
- "\xf0\x9f\x8e\x8d"=>"<span class=\x22emoji emoji1f38d\x22></span>", "\xf0\x9f\x8e\x8e"=>"<span class=\x22emoji emoji1f38e\x22></span>", "\xf0\x9f\x8e\x93"=>"<span class=\x22emoji emoji1f393\x22></span>", "\xf0\x9f\x8e\x92"=>"<span class=\x22emoji emoji1f392\x22></span>", "\xf0\x9f\x8e\x8f"=>"<span class=\x22emoji emoji1f38f\x22></span>",
- "\xf0\x9f\x8e\x87"=>"<span class=\x22emoji emoji1f387\x22></span>", "\xf0\x9f\x8e\x90"=>"<span class=\x22emoji emoji1f390\x22></span>", "\xf0\x9f\x8e\x83"=>"<span class=\x22emoji emoji1f383\x22></span>", "\xf0\x9f\x8e\x8a"=>"<span class=\x22emoji emoji1f38a\x22></span>", "\xf0\x9f\x8e\x8b"=>"<span class=\x22emoji emoji1f38b\x22></span>",
- "\xf0\x9f\x8e\x91"=>"<span class=\x22emoji emoji1f391\x22></span>", "\xf0\x9f\x93\x9f"=>"<span class=\x22emoji emoji1f4df\x22></span>", "\xe2\x98\x8e"=>"<span class=\x22emoji emoji260e\x22></span>", "\xf0\x9f\x93\x9e"=>"<span class=\x22emoji emoji1f4de\x22></span>", "\xf0\x9f\x93\xb1"=>"<span class=\x22emoji emoji1f4f1\x22></span>",
- "\xf0\x9f\x93\xb2"=>"<span class=\x22emoji emoji1f4f2\x22></span>", "\xf0\x9f\x93\x9d"=>"<span class=\x22emoji emoji1f4dd\x22></span>", "\xf0\x9f\x93\xa0"=>"<span class=\x22emoji emoji1f4e0\x22></span>", "\xe2\x9c\x89"=>"<span class=\x22emoji emoji2709\x22></span>", "\xf0\x9f\x93\xa8"=>"<span class=\x22emoji emoji1f4e8\x22></span>",
- "\xf0\x9f\x93\xa9"=>"<span class=\x22emoji emoji1f4e9\x22></span>", "\xf0\x9f\x93\xaa"=>"<span class=\x22emoji emoji1f4ea\x22></span>", "\xf0\x9f\x93\xab"=>"<span class=\x22emoji emoji1f4eb\x22></span>", "\xf0\x9f\x93\xae"=>"<span class=\x22emoji emoji1f4ee\x22></span>", "\xf0\x9f\x93\xb0"=>"<span class=\x22emoji emoji1f4f0\x22></span>",
- "\xf0\x9f\x93\xa2"=>"<span class=\x22emoji emoji1f4e2\x22></span>", "\xf0\x9f\x93\xa3"=>"<span class=\x22emoji emoji1f4e3\x22></span>", "\xf0\x9f\x93\xa1"=>"<span class=\x22emoji emoji1f4e1\x22></span>", "\xf0\x9f\x93\xa4"=>"<span class=\x22emoji emoji1f4e4\x22></span>", "\xf0\x9f\x93\xa5"=>"<span class=\x22emoji emoji1f4e5\x22></span>",
- "\xf0\x9f\x93\xa6"=>"<span class=\x22emoji emoji1f4e6\x22></span>", "\xf0\x9f\x93\xa7"=>"<span class=\x22emoji emoji1f4e7\x22></span>", "\xf0\x9f\x94\xa0"=>"<span class=\x22emoji emoji1f520\x22></span>", "\xf0\x9f\x94\xa1"=>"<span class=\x22emoji emoji1f521\x22></span>", "\xf0\x9f\x94\xa2"=>"<span class=\x22emoji emoji1f522\x22></span>",
- "\xf0\x9f\x94\xa3"=>"<span class=\x22emoji emoji1f523\x22></span>", "\xf0\x9f\x94\xa4"=>"<span class=\x22emoji emoji1f524\x22></span>", "\xe2\x9c\x92"=>"<span class=\x22emoji emoji2712\x22></span>", "\xf0\x9f\x92\xba"=>"<span class=\x22emoji emoji1f4ba\x22></span>", "\xf0\x9f\x92\xbb"=>"<span class=\x22emoji emoji1f4bb\x22></span>",
- "\xe2\x9c\x8f"=>"<span class=\x22emoji emoji270f\x22></span>", "\xf0\x9f\x93\x8e"=>"<span class=\x22emoji emoji1f4ce\x22></span>", "\xf0\x9f\x92\xbc"=>"<span class=\x22emoji emoji1f4bc\x22></span>", "\xf0\x9f\x92\xbd"=>"<span class=\x22emoji emoji1f4bd\x22></span>", "\xf0\x9f\x92\xbe"=>"<span class=\x22emoji emoji1f4be\x22></span>",
- "\xf0\x9f\x92\xbf"=>"<span class=\x22emoji emoji1f4bf\x22></span>", "\xf0\x9f\x93\x80"=>"<span class=\x22emoji emoji1f4c0\x22></span>", "\xe2\x9c\x82"=>"<span class=\x22emoji emoji2702\x22></span>", "\xf0\x9f\x93\x8d"=>"<span class=\x22emoji emoji1f4cd\x22></span>", "\xf0\x9f\x93\x83"=>"<span class=\x22emoji emoji1f4c3\x22></span>",
- "\xf0\x9f\x93\x84"=>"<span class=\x22emoji emoji1f4c4\x22></span>", "\xf0\x9f\x93\x85"=>"<span class=\x22emoji emoji1f4c5\x22></span>", "\xf0\x9f\x93\x81"=>"<span class=\x22emoji emoji1f4c1\x22></span>", "\xf0\x9f\x93\x82"=>"<span class=\x22emoji emoji1f4c2\x22></span>", "\xf0\x9f\x93\x93"=>"<span class=\x22emoji emoji1f4d3\x22></span>",
- "\xf0\x9f\x93\x96"=>"<span class=\x22emoji emoji1f4d6\x22></span>", "\xf0\x9f\x93\x94"=>"<span class=\x22emoji emoji1f4d4\x22></span>", "\xf0\x9f\x93\x95"=>"<span class=\x22emoji emoji1f4d5\x22></span>", "\xf0\x9f\x93\x97"=>"<span class=\x22emoji emoji1f4d7\x22></span>", "\xf0\x9f\x93\x98"=>"<span class=\x22emoji emoji1f4d8\x22></span>",
- "\xf0\x9f\x93\x99"=>"<span class=\x22emoji emoji1f4d9\x22></span>", "\xf0\x9f\x93\x9a"=>"<span class=\x22emoji emoji1f4da\x22></span>", "\xf0\x9f\x93\x9b"=>"<span class=\x22emoji emoji1f4db\x22></span>", "\xf0\x9f\x93\x9c"=>"<span class=\x22emoji emoji1f4dc\x22></span>", "\xf0\x9f\x93\x8b"=>"<span class=\x22emoji emoji1f4cb\x22></span>",
- "\xf0\x9f\x93\x86"=>"<span class=\x22emoji emoji1f4c6\x22></span>", "\xf0\x9f\x93\x8a"=>"<span class=\x22emoji emoji1f4ca\x22></span>", "\xf0\x9f\x93\x88"=>"<span class=\x22emoji emoji1f4c8\x22></span>", "\xf0\x9f\x93\x89"=>"<span class=\x22emoji emoji1f4c9\x22></span>", "\xf0\x9f\x93\x87"=>"<span class=\x22emoji emoji1f4c7\x22></span>",
- "\xf0\x9f\x93\x8c"=>"<span class=\x22emoji emoji1f4cc\x22></span>", "\xf0\x9f\x93\x92"=>"<span class=\x22emoji emoji1f4d2\x22></span>", "\xf0\x9f\x93\x8f"=>"<span class=\x22emoji emoji1f4cf\x22></span>", "\xf0\x9f\x93\x90"=>"<span class=\x22emoji emoji1f4d0\x22></span>", "\xf0\x9f\x93\x91"=>"<span class=\x22emoji emoji1f4d1\x22></span>",
- "\xf0\x9f\x8e\xbd"=>"<span class=\x22emoji emoji1f3bd\x22></span>", "\xe2\x9a\xbe"=>"<span class=\x22emoji emoji26be\x22></span>", "\xe2\x9b\xb3"=>"<span class=\x22emoji emoji26f3\x22></span>", "\xf0\x9f\x8e\xbe"=>"<span class=\x22emoji emoji1f3be\x22></span>", "\xe2\x9a\xbd"=>"<span class=\x22emoji emoji26bd\x22></span>",
- "\xf0\x9f\x8e\xbf"=>"<span class=\x22emoji emoji1f3bf\x22></span>", "\xf0\x9f\x8f\x80"=>"<span class=\x22emoji emoji1f3c0\x22></span>", "\xf0\x9f\x8f\x81"=>"<span class=\x22emoji emoji1f3c1\x22></span>", "\xf0\x9f\x8f\x82"=>"<span class=\x22emoji emoji1f3c2\x22></span>", "\xf0\x9f\x8f\x83"=>"<span class=\x22emoji emoji1f3c3\x22></span>",
- "\xf0\x9f\x8f\x84"=>"<span class=\x22emoji emoji1f3c4\x22></span>", "\xf0\x9f\x8f\x86"=>"<span class=\x22emoji emoji1f3c6\x22></span>", "\xf0\x9f\x8f\x88"=>"<span class=\x22emoji emoji1f3c8\x22></span>", "\xf0\x9f\x8f\x8a"=>"<span class=\x22emoji emoji1f3ca\x22></span>", "\xf0\x9f\x9a\x83"=>"<span class=\x22emoji emoji1f683\x22></span>",
- "\xf0\x9f\x9a\x87"=>"<span class=\x22emoji emoji1f687\x22></span>", "\xe2\x93\x82"=>"<span class=\x22emoji emoji24c2\x22></span>", "\xf0\x9f\x9a\x84"=>"<span class=\x22emoji emoji1f684\x22></span>", "\xf0\x9f\x9a\x85"=>"<span class=\x22emoji emoji1f685\x22></span>", "\xf0\x9f\x9a\x97"=>"<span class=\x22emoji emoji1f697\x22></span>",
- "\xf0\x9f\x9a\x99"=>"<span class=\x22emoji emoji1f699\x22></span>", "\xf0\x9f\x9a\x8c"=>"<span class=\x22emoji emoji1f68c\x22></span>", "\xf0\x9f\x9a\x8f"=>"<span class=\x22emoji emoji1f68f\x22></span>", "\xf0\x9f\x9a\xa2"=>"<span class=\x22emoji emoji1f6a2\x22></span>", "\xe2\x9c\x88"=>"<span class=\x22emoji emoji2708\x22></span>",
- "\xe2\x9b\xb5"=>"<span class=\x22emoji emoji26f5\x22></span>", "\xf0\x9f\x9a\x89"=>"<span class=\x22emoji emoji1f689\x22></span>", "\xf0\x9f\x9a\x80"=>"<span class=\x22emoji emoji1f680\x22></span>", "\xf0\x9f\x9a\xa4"=>"<span class=\x22emoji emoji1f6a4\x22></span>", "\xf0\x9f\x9a\x95"=>"<span class=\x22emoji emoji1f695\x22></span>",
- "\xf0\x9f\x9a\x9a"=>"<span class=\x22emoji emoji1f69a\x22></span>", "\xf0\x9f\x9a\x92"=>"<span class=\x22emoji emoji1f692\x22></span>", "\xf0\x9f\x9a\x91"=>"<span class=\x22emoji emoji1f691\x22></span>", "\xf0\x9f\x9a\x93"=>"<span class=\x22emoji emoji1f693\x22></span>", "\xe2\x9b\xbd"=>"<span class=\x22emoji emoji26fd\x22></span>",
- "\xf0\x9f\x85\xbf"=>"<span class=\x22emoji emoji1f17f\x22></span>", "\xf0\x9f\x9a\xa5"=>"<span class=\x22emoji emoji1f6a5\x22></span>", "\xf0\x9f\x9a\xa7"=>"<span class=\x22emoji emoji1f6a7\x22></span>", "\xf0\x9f\x9a\xa8"=>"<span class=\x22emoji emoji1f6a8\x22></span>", "\xe2\x99\xa8"=>"<span class=\x22emoji emoji2668\x22></span>",
- "\xe2\x9b\xba"=>"<span class=\x22emoji emoji26fa\x22></span>", "\xf0\x9f\x8e\xa0"=>"<span class=\x22emoji emoji1f3a0\x22></span>", "\xf0\x9f\x8e\xa1"=>"<span class=\x22emoji emoji1f3a1\x22></span>", "\xf0\x9f\x8e\xa2"=>"<span class=\x22emoji emoji1f3a2\x22></span>", "\xf0\x9f\x8e\xa3"=>"<span class=\x22emoji emoji1f3a3\x22></span>",
- "\xf0\x9f\x8e\xa4"=>"<span class=\x22emoji emoji1f3a4\x22></span>", "\xf0\x9f\x8e\xa5"=>"<span class=\x22emoji emoji1f3a5\x22></span>", "\xf0\x9f\x8e\xa6"=>"<span class=\x22emoji emoji1f3a6\x22></span>", "\xf0\x9f\x8e\xa7"=>"<span class=\x22emoji emoji1f3a7\x22></span>", "\xf0\x9f\x8e\xa8"=>"<span class=\x22emoji emoji1f3a8\x22></span>",
- "\xf0\x9f\x8e\xa9"=>"<span class=\x22emoji emoji1f3a9\x22></span>", "\xf0\x9f\x8e\xaa"=>"<span class=\x22emoji emoji1f3aa\x22></span>", "\xf0\x9f\x8e\xab"=>"<span class=\x22emoji emoji1f3ab\x22></span>", "\xf0\x9f\x8e\xac"=>"<span class=\x22emoji emoji1f3ac\x22></span>", "\xf0\x9f\x8e\xad"=>"<span class=\x22emoji emoji1f3ad\x22></span>",
- "\xf0\x9f\x8e\xae"=>"<span class=\x22emoji emoji1f3ae\x22></span>", "\xf0\x9f\x80\x84"=>"<span class=\x22emoji emoji1f004\x22></span>", "\xf0\x9f\x8e\xaf"=>"<span class=\x22emoji emoji1f3af\x22></span>", "\xf0\x9f\x8e\xb0"=>"<span class=\x22emoji emoji1f3b0\x22></span>", "\xf0\x9f\x8e\xb1"=>"<span class=\x22emoji emoji1f3b1\x22></span>",
- "\xf0\x9f\x8e\xb2"=>"<span class=\x22emoji emoji1f3b2\x22></span>", "\xf0\x9f\x8e\xb3"=>"<span class=\x22emoji emoji1f3b3\x22></span>", "\xf0\x9f\x8e\xb4"=>"<span class=\x22emoji emoji1f3b4\x22></span>", "\xf0\x9f\x83\x8f"=>"<span class=\x22emoji emoji1f0cf\x22></span>", "\xf0\x9f\x8e\xb5"=>"<span class=\x22emoji emoji1f3b5\x22></span>",
- "\xf0\x9f\x8e\xb6"=>"<span class=\x22emoji emoji1f3b6\x22></span>", "\xf0\x9f\x8e\xb7"=>"<span class=\x22emoji emoji1f3b7\x22></span>", "\xf0\x9f\x8e\xb8"=>"<span class=\x22emoji emoji1f3b8\x22></span>", "\xf0\x9f\x8e\xb9"=>"<span class=\x22emoji emoji1f3b9\x22></span>", "\xf0\x9f\x8e\xba"=>"<span class=\x22emoji emoji1f3ba\x22></span>",
- "\xf0\x9f\x8e\xbb"=>"<span class=\x22emoji emoji1f3bb\x22></span>", "\xf0\x9f\x8e\xbc"=>"<span class=\x22emoji emoji1f3bc\x22></span>", "\xe3\x80\xbd"=>"<span class=\x22emoji emoji303d\x22></span>", "\xf0\x9f\x93\xb7"=>"<span class=\x22emoji emoji1f4f7\x22></span>", "\xf0\x9f\x93\xb9"=>"<span class=\x22emoji emoji1f4f9\x22></span>",
- "\xf0\x9f\x93\xba"=>"<span class=\x22emoji emoji1f4fa\x22></span>", "\xf0\x9f\x93\xbb"=>"<span class=\x22emoji emoji1f4fb\x22></span>", "\xf0\x9f\x93\xbc"=>"<span class=\x22emoji emoji1f4fc\x22></span>", "\xf0\x9f\x92\x8b"=>"<span class=\x22emoji emoji1f48b\x22></span>", "\xf0\x9f\x92\x8c"=>"<span class=\x22emoji emoji1f48c\x22></span>",
- "\xf0\x9f\x92\x8d"=>"<span class=\x22emoji emoji1f48d\x22></span>", "\xf0\x9f\x92\x8e"=>"<span class=\x22emoji emoji1f48e\x22></span>", "\xf0\x9f\x92\x8f"=>"<span class=\x22emoji emoji1f48f\x22></span>", "\xf0\x9f\x92\x90"=>"<span class=\x22emoji emoji1f490\x22></span>", "\xf0\x9f\x92\x91"=>"<span class=\x22emoji emoji1f491\x22></span>",
- "\xf0\x9f\x92\x92"=>"<span class=\x22emoji emoji1f492\x22></span>", "\xf0\x9f\x94\x9e"=>"<span class=\x22emoji emoji1f51e\x22></span>", "\xc2\xa9"=>"<span class=\x22emoji emojia9\x22></span>", "\xc2\xae"=>"<span class=\x22emoji emojiae\x22></span>", "\xe2\x84\xa2"=>"<span class=\x22emoji emoji2122\x22></span>",
- "\xe2\x84\xb9"=>"<span class=\x22emoji emoji2139\x22></span>", "#\xe2\x83\xa3"=>"<span class=\x22emoji emoji2320e3\x22></span>", "1\xe2\x83\xa3"=>"<span class=\x22emoji emoji3120e3\x22></span>", "2\xe2\x83\xa3"=>"<span class=\x22emoji emoji3220e3\x22></span>", "3\xe2\x83\xa3"=>"<span class=\x22emoji emoji3320e3\x22></span>",
- "4\xe2\x83\xa3"=>"<span class=\x22emoji emoji3420e3\x22></span>", "5\xe2\x83\xa3"=>"<span class=\x22emoji emoji3520e3\x22></span>", "6\xe2\x83\xa3"=>"<span class=\x22emoji emoji3620e3\x22></span>", "7\xe2\x83\xa3"=>"<span class=\x22emoji emoji3720e3\x22></span>", "8\xe2\x83\xa3"=>"<span class=\x22emoji emoji3820e3\x22></span>",
- "9\xe2\x83\xa3"=>"<span class=\x22emoji emoji3920e3\x22></span>", "0\xe2\x83\xa3"=>"<span class=\x22emoji emoji3020e3\x22></span>", "\xf0\x9f\x94\x9f"=>"<span class=\x22emoji emoji1f51f\x22></span>", "\xf0\x9f\x93\xb6"=>"<span class=\x22emoji emoji1f4f6\x22></span>", "\xf0\x9f\x93\xb3"=>"<span class=\x22emoji emoji1f4f3\x22></span>",
- "\xf0\x9f\x93\xb4"=>"<span class=\x22emoji emoji1f4f4\x22></span>", "\xf0\x9f\x8d\x94"=>"<span class=\x22emoji emoji1f354\x22></span>", "\xf0\x9f\x8d\x99"=>"<span class=\x22emoji emoji1f359\x22></span>", "\xf0\x9f\x8d\xb0"=>"<span class=\x22emoji emoji1f370\x22></span>", "\xf0\x9f\x8d\x9c"=>"<span class=\x22emoji emoji1f35c\x22></span>",
- "\xf0\x9f\x8d\x9e"=>"<span class=\x22emoji emoji1f35e\x22></span>", "\xf0\x9f\x8d\xb3"=>"<span class=\x22emoji emoji1f373\x22></span>", "\xf0\x9f\x8d\xa6"=>"<span class=\x22emoji emoji1f366\x22></span>", "\xf0\x9f\x8d\x9f"=>"<span class=\x22emoji emoji1f35f\x22></span>", "\xf0\x9f\x8d\xa1"=>"<span class=\x22emoji emoji1f361\x22></span>",
- "\xf0\x9f\x8d\x98"=>"<span class=\x22emoji emoji1f358\x22></span>", "\xf0\x9f\x8d\x9a"=>"<span class=\x22emoji emoji1f35a\x22></span>", "\xf0\x9f\x8d\x9d"=>"<span class=\x22emoji emoji1f35d\x22></span>", "\xf0\x9f\x8d\x9b"=>"<span class=\x22emoji emoji1f35b\x22></span>", "\xf0\x9f\x8d\xa2"=>"<span class=\x22emoji emoji1f362\x22></span>",
- "\xf0\x9f\x8d\xa3"=>"<span class=\x22emoji emoji1f363\x22></span>", "\xf0\x9f\x8d\xb1"=>"<span class=\x22emoji emoji1f371\x22></span>", "\xf0\x9f\x8d\xb2"=>"<span class=\x22emoji emoji1f372\x22></span>", "\xf0\x9f\x8d\xa7"=>"<span class=\x22emoji emoji1f367\x22></span>", "\xf0\x9f\x8d\x96"=>"<span class=\x22emoji emoji1f356\x22></span>",
- "\xf0\x9f\x8d\xa5"=>"<span class=\x22emoji emoji1f365\x22></span>", "\xf0\x9f\x8d\xa0"=>"<span class=\x22emoji emoji1f360\x22></span>", "\xf0\x9f\x8d\x95"=>"<span class=\x22emoji emoji1f355\x22></span>", "\xf0\x9f\x8d\x97"=>"<span class=\x22emoji emoji1f357\x22></span>", "\xf0\x9f\x8d\xa8"=>"<span class=\x22emoji emoji1f368\x22></span>",
- "\xf0\x9f\x8d\xa9"=>"<span class=\x22emoji emoji1f369\x22></span>", "\xf0\x9f\x8d\xaa"=>"<span class=\x22emoji emoji1f36a\x22></span>", "\xf0\x9f\x8d\xab"=>"<span class=\x22emoji emoji1f36b\x22></span>", "\xf0\x9f\x8d\xac"=>"<span class=\x22emoji emoji1f36c\x22></span>", "\xf0\x9f\x8d\xad"=>"<span class=\x22emoji emoji1f36d\x22></span>",
- "\xf0\x9f\x8d\xae"=>"<span class=\x22emoji emoji1f36e\x22></span>", "\xf0\x9f\x8d\xaf"=>"<span class=\x22emoji emoji1f36f\x22></span>", "\xf0\x9f\x8d\xa4"=>"<span class=\x22emoji emoji1f364\x22></span>", "\xf0\x9f\x8d\xb4"=>"<span class=\x22emoji emoji1f374\x22></span>", "\xe2\x98\x95"=>"<span class=\x22emoji emoji2615\x22></span>",
- "\xf0\x9f\x8d\xb8"=>"<span class=\x22emoji emoji1f378\x22></span>", "\xf0\x9f\x8d\xba"=>"<span class=\x22emoji emoji1f37a\x22></span>", "\xf0\x9f\x8d\xb5"=>"<span class=\x22emoji emoji1f375\x22></span>", "\xf0\x9f\x8d\xb6"=>"<span class=\x22emoji emoji1f376\x22></span>", "\xf0\x9f\x8d\xb7"=>"<span class=\x22emoji emoji1f377\x22></span>",
- "\xf0\x9f\x8d\xbb"=>"<span class=\x22emoji emoji1f37b\x22></span>", "\xf0\x9f\x8d\xb9"=>"<span class=\x22emoji emoji1f379\x22></span>", "\xe2\x86\x97"=>"<span class=\x22emoji emoji2197\x22></span>", "\xe2\x86\x98"=>"<span class=\x22emoji emoji2198\x22></span>", "\xe2\x86\x96"=>"<span class=\x22emoji emoji2196\x22></span>",
- "\xe2\x86\x99"=>"<span class=\x22emoji emoji2199\x22></span>", "\xe2\xa4\xb4"=>"<span class=\x22emoji emoji2934\x22></span>", "\xe2\xa4\xb5"=>"<span class=\x22emoji emoji2935\x22></span>", "\xe2\x86\x94"=>"<span class=\x22emoji emoji2194\x22></span>", "\xe2\x86\x95"=>"<span class=\x22emoji emoji2195\x22></span>",
- "\xe2\xac\x86"=>"<span class=\x22emoji emoji2b06\x22></span>", "\xe2\xac\x87"=>"<span class=\x22emoji emoji2b07\x22></span>", "\xe2\x9e\xa1"=>"<span class=\x22emoji emoji27a1\x22></span>", "\xe2\xac\x85"=>"<span class=\x22emoji emoji2b05\x22></span>", "\xe2\x96\xb6"=>"<span class=\x22emoji emoji25b6\x22></span>",
- "\xe2\x97\x80"=>"<span class=\x22emoji emoji25c0\x22></span>", "\xe2\x8f\xa9"=>"<span class=\x22emoji emoji23e9\x22></span>", "\xe2\x8f\xaa"=>"<span class=\x22emoji emoji23ea\x22></span>", "\xe2\x8f\xab"=>"<span class=\x22emoji emoji23eb\x22></span>", "\xe2\x8f\xac"=>"<span class=\x22emoji emoji23ec\x22></span>",
- "\xf0\x9f\x94\xba"=>"<span class=\x22emoji emoji1f53a\x22></span>", "\xf0\x9f\x94\xbb"=>"<span class=\x22emoji emoji1f53b\x22></span>", "\xf0\x9f\x94\xbc"=>"<span class=\x22emoji emoji1f53c\x22></span>", "\xf0\x9f\x94\xbd"=>"<span class=\x22emoji emoji1f53d\x22></span>", "\xe2\xad\x95"=>"<span class=\x22emoji emoji2b55\x22></span>",
- "\xe2\x9d\x8c"=>"<span class=\x22emoji emoji274c\x22></span>", "\xe2\x9d\x8e"=>"<span class=\x22emoji emoji274e\x22></span>", "\xe2\x9d\x97"=>"<span class=\x22emoji emoji2757\x22></span>", "\xe2\x81\x89"=>"<span class=\x22emoji emoji2049\x22></span>", "\xe2\x80\xbc"=>"<span class=\x22emoji emoji203c\x22></span>",
- "\xe2\x9d\x93"=>"<span class=\x22emoji emoji2753\x22></span>", "\xe2\x9d\x94"=>"<span class=\x22emoji emoji2754\x22></span>", "\xe2\x9d\x95"=>"<span class=\x22emoji emoji2755\x22></span>", "\xe3\x80\xb0"=>"<span class=\x22emoji emoji3030\x22></span>", "\xe2\x9e\xb0"=>"<span class=\x22emoji emoji27b0\x22></span>",
- "\xe2\x9e\xbf"=>"<span class=\x22emoji emoji27bf\x22></span>", "\xe2\x9d\xa4"=>"<span class=\x22emoji emoji2764\x22></span>", "\xf0\x9f\x92\x93"=>"<span class=\x22emoji emoji1f493\x22></span>", "\xf0\x9f\x92\x94"=>"<span class=\x22emoji emoji1f494\x22></span>", "\xf0\x9f\x92\x95"=>"<span class=\x22emoji emoji1f495\x22></span>",
- "\xf0\x9f\x92\x96"=>"<span class=\x22emoji emoji1f496\x22></span>", "\xf0\x9f\x92\x97"=>"<span class=\x22emoji emoji1f497\x22></span>", "\xf0\x9f\x92\x98"=>"<span class=\x22emoji emoji1f498\x22></span>", "\xf0\x9f\x92\x99"=>"<span class=\x22emoji emoji1f499\x22></span>", "\xf0\x9f\x92\x9a"=>"<span class=\x22emoji emoji1f49a\x22></span>",
- "\xf0\x9f\x92\x9b"=>"<span class=\x22emoji emoji1f49b\x22></span>", "\xf0\x9f\x92\x9c"=>"<span class=\x22emoji emoji1f49c\x22></span>", "\xf0\x9f\x92\x9d"=>"<span class=\x22emoji emoji1f49d\x22></span>", "\xf0\x9f\x92\x9e"=>"<span class=\x22emoji emoji1f49e\x22></span>", "\xf0\x9f\x92\x9f"=>"<span class=\x22emoji emoji1f49f\x22></span>",
- "\xe2\x99\xa5"=>"<span class=\x22emoji emoji2665\x22></span>", "\xe2\x99\xa0"=>"<span class=\x22emoji emoji2660\x22></span>", "\xe2\x99\xa6"=>"<span class=\x22emoji emoji2666\x22></span>", "\xe2\x99\xa3"=>"<span class=\x22emoji emoji2663\x22></span>", "\xf0\x9f\x9a\xac"=>"<span class=\x22emoji emoji1f6ac\x22></span>",
- "\xf0\x9f\x9a\xad"=>"<span class=\x22emoji emoji1f6ad\x22></span>", "\xe2\x99\xbf"=>"<span class=\x22emoji emoji267f\x22></span>", "\xf0\x9f\x9a\xa9"=>"<span class=\x22emoji emoji1f6a9\x22></span>", "\xe2\x9a\xa0"=>"<span class=\x22emoji emoji26a0\x22></span>", "\xe2\x9b\x94"=>"<span class=\x22emoji emoji26d4\x22></span>",
- "\xe2\x99\xbb"=>"<span class=\x22emoji emoji267b\x22></span>", "\xf0\x9f\x9a\xb2"=>"<span class=\x22emoji emoji1f6b2\x22></span>", "\xf0\x9f\x9a\xb6"=>"<span class=\x22emoji emoji1f6b6\x22></span>", "\xf0\x9f\x9a\xb9"=>"<span class=\x22emoji emoji1f6b9\x22></span>", "\xf0\x9f\x9a\xba"=>"<span class=\x22emoji emoji1f6ba\x22></span>",
- "\xf0\x9f\x9b\x80"=>"<span class=\x22emoji emoji1f6c0\x22></span>", "\xf0\x9f\x9a\xbb"=>"<span class=\x22emoji emoji1f6bb\x22></span>", "\xf0\x9f\x9a\xbd"=>"<span class=\x22emoji emoji1f6bd\x22></span>", "\xf0\x9f\x9a\xbe"=>"<span class=\x22emoji emoji1f6be\x22></span>", "\xf0\x9f\x9a\xbc"=>"<span class=\x22emoji emoji1f6bc\x22></span>",
- "\xf0\x9f\x9a\xaa"=>"<span class=\x22emoji emoji1f6aa\x22></span>", "\xf0\x9f\x9a\xab"=>"<span class=\x22emoji emoji1f6ab\x22></span>", "\xe2\x9c\x94"=>"<span class=\x22emoji emoji2714\x22></span>", "\xf0\x9f\x86\x91"=>"<span class=\x22emoji emoji1f191\x22></span>", "\xf0\x9f\x86\x92"=>"<span class=\x22emoji emoji1f192\x22></span>",
- "\xf0\x9f\x86\x93"=>"<span class=\x22emoji emoji1f193\x22></span>", "\xf0\x9f\x86\x94"=>"<span class=\x22emoji emoji1f194\x22></span>", "\xf0\x9f\x86\x95"=>"<span class=\x22emoji emoji1f195\x22></span>", "\xf0\x9f\x86\x96"=>"<span class=\x22emoji emoji1f196\x22></span>", "\xf0\x9f\x86\x97"=>"<span class=\x22emoji emoji1f197\x22></span>",
- "\xf0\x9f\x86\x98"=>"<span class=\x22emoji emoji1f198\x22></span>", "\xf0\x9f\x86\x99"=>"<span class=\x22emoji emoji1f199\x22></span>", "\xf0\x9f\x86\x9a"=>"<span class=\x22emoji emoji1f19a\x22></span>", "\xf0\x9f\x88\x81"=>"<span class=\x22emoji emoji1f201\x22></span>", "\xf0\x9f\x88\x82"=>"<span class=\x22emoji emoji1f202\x22></span>",
- "\xf0\x9f\x88\xb2"=>"<span class=\x22emoji emoji1f232\x22></span>", "\xf0\x9f\x88\xb3"=>"<span class=\x22emoji emoji1f233\x22></span>", "\xf0\x9f\x88\xb4"=>"<span class=\x22emoji emoji1f234\x22></span>", "\xf0\x9f\x88\xb5"=>"<span class=\x22emoji emoji1f235\x22></span>", "\xf0\x9f\x88\xb6"=>"<span class=\x22emoji emoji1f236\x22></span>",
- "\xf0\x9f\x88\x9a"=>"<span class=\x22emoji emoji1f21a\x22></span>", "\xf0\x9f\x88\xb7"=>"<span class=\x22emoji emoji1f237\x22></span>", "\xf0\x9f\x88\xb8"=>"<span class=\x22emoji emoji1f238\x22></span>", "\xf0\x9f\x88\xb9"=>"<span class=\x22emoji emoji1f239\x22></span>", "\xf0\x9f\x88\xaf"=>"<span class=\x22emoji emoji1f22f\x22></span>",
- "\xf0\x9f\x88\xba"=>"<span class=\x22emoji emoji1f23a\x22></span>", "\xe3\x8a\x99"=>"<span class=\x22emoji emoji3299\x22></span>", "\xe3\x8a\x97"=>"<span class=\x22emoji emoji3297\x22></span>", "\xf0\x9f\x89\x90"=>"<span class=\x22emoji emoji1f250\x22></span>", "\xf0\x9f\x89\x91"=>"<span class=\x22emoji emoji1f251\x22></span>",
- "\xe2\x9e\x95"=>"<span class=\x22emoji emoji2795\x22></span>", "\xe2\x9e\x96"=>"<span class=\x22emoji emoji2796\x22></span>", "\xe2\x9c\x96"=>"<span class=\x22emoji emoji2716\x22></span>", "\xe2\x9e\x97"=>"<span class=\x22emoji emoji2797\x22></span>", "\xf0\x9f\x92\xa0"=>"<span class=\x22emoji emoji1f4a0\x22></span>",
- "\xf0\x9f\x92\xa1"=>"<span class=\x22emoji emoji1f4a1\x22></span>", "\xf0\x9f\x92\xa2"=>"<span class=\x22emoji emoji1f4a2\x22></span>", "\xf0\x9f\x92\xa3"=>"<span class=\x22emoji emoji1f4a3\x22></span>", "\xf0\x9f\x92\xa4"=>"<span class=\x22emoji emoji1f4a4\x22></span>", "\xf0\x9f\x92\xa5"=>"<span class=\x22emoji emoji1f4a5\x22></span>",
- "\xf0\x9f\x92\xa6"=>"<span class=\x22emoji emoji1f4a6\x22></span>", "\xf0\x9f\x92\xa7"=>"<span class=\x22emoji emoji1f4a7\x22></span>", "\xf0\x9f\x92\xa8"=>"<span class=\x22emoji emoji1f4a8\x22></span>", "\xf0\x9f\x92\xa9"=>"<span class=\x22emoji emoji1f4a9\x22></span>", "\xf0\x9f\x92\xaa"=>"<span class=\x22emoji emoji1f4aa\x22></span>",
- "\xf0\x9f\x92\xab"=>"<span class=\x22emoji emoji1f4ab\x22></span>", "\xf0\x9f\x92\xac"=>"<span class=\x22emoji emoji1f4ac\x22></span>", "\xe2\x9c\xa8"=>"<span class=\x22emoji emoji2728\x22></span>", "\xe2\x9c\xb4"=>"<span class=\x22emoji emoji2734\x22></span>", "\xe2\x9c\xb3"=>"<span class=\x22emoji emoji2733\x22></span>",
- "\xe2\x9a\xaa"=>"<span class=\x22emoji emoji26aa\x22></span>", "\xe2\x9a\xab"=>"<span class=\x22emoji emoji26ab\x22></span>", "\xf0\x9f\x94\xb4"=>"<span class=\x22emoji emoji1f534\x22></span>", "\xf0\x9f\x94\xb5"=>"<span class=\x22emoji emoji1f535\x22></span>", "\xf0\x9f\x94\xb2"=>"<span class=\x22emoji emoji1f532\x22></span>",
- "\xf0\x9f\x94\xb3"=>"<span class=\x22emoji emoji1f533\x22></span>", "\xe2\xad\x90"=>"<span class=\x22emoji emoji2b50\x22></span>", "\xe2\xac\x9c"=>"<span class=\x22emoji emoji2b1c\x22></span>", "\xe2\xac\x9b"=>"<span class=\x22emoji emoji2b1b\x22></span>", "\xe2\x96\xab"=>"<span class=\x22emoji emoji25ab\x22></span>",
- "\xe2\x96\xaa"=>"<span class=\x22emoji emoji25aa\x22></span>", "\xe2\x97\xbd"=>"<span class=\x22emoji emoji25fd\x22></span>", "\xe2\x97\xbe"=>"<span class=\x22emoji emoji25fe\x22></span>", "\xe2\x97\xbb"=>"<span class=\x22emoji emoji25fb\x22></span>", "\xe2\x97\xbc"=>"<span class=\x22emoji emoji25fc\x22></span>",
- "\xf0\x9f\x94\xb6"=>"<span class=\x22emoji emoji1f536\x22></span>", "\xf0\x9f\x94\xb7"=>"<span class=\x22emoji emoji1f537\x22></span>", "\xf0\x9f\x94\xb8"=>"<span class=\x22emoji emoji1f538\x22></span>", "\xf0\x9f\x94\xb9"=>"<span class=\x22emoji emoji1f539\x22></span>", "\xe2\x9d\x87"=>"<span class=\x22emoji emoji2747\x22></span>",
- "\xf0\x9f\x92\xae"=>"<span class=\x22emoji emoji1f4ae\x22></span>", "\xf0\x9f\x92\xaf"=>"<span class=\x22emoji emoji1f4af\x22></span>", "\xe2\x86\xa9"=>"<span class=\x22emoji emoji21a9\x22></span>", "\xe2\x86\xaa"=>"<span class=\x22emoji emoji21aa\x22></span>", "\xf0\x9f\x94\x83"=>"<span class=\x22emoji emoji1f503\x22></span>",
- "\xf0\x9f\x94\x8a"=>"<span class=\x22emoji emoji1f50a\x22></span>", "\xf0\x9f\x94\x8b"=>"<span class=\x22emoji emoji1f50b\x22></span>", "\xf0\x9f\x94\x8c"=>"<span class=\x22emoji emoji1f50c\x22></span>", "\xf0\x9f\x94\x8d"=>"<span class=\x22emoji emoji1f50d\x22></span>", "\xf0\x9f\x94\x8e"=>"<span class=\x22emoji emoji1f50e\x22></span>",
- "\xf0\x9f\x94\x92"=>"<span class=\x22emoji emoji1f512\x22></span>", "\xf0\x9f\x94\x93"=>"<span class=\x22emoji emoji1f513\x22></span>", "\xf0\x9f\x94\x8f"=>"<span class=\x22emoji emoji1f50f\x22></span>", "\xf0\x9f\x94\x90"=>"<span class=\x22emoji emoji1f510\x22></span>", "\xf0\x9f\x94\x91"=>"<span class=\x22emoji emoji1f511\x22></span>",
- "\xf0\x9f\x94\x94"=>"<span class=\x22emoji emoji1f514\x22></span>", "\xe2\x98\x91"=>"<span class=\x22emoji emoji2611\x22></span>", "\xf0\x9f\x94\x98"=>"<span class=\x22emoji emoji1f518\x22></span>", "\xf0\x9f\x94\x96"=>"<span class=\x22emoji emoji1f516\x22></span>", "\xf0\x9f\x94\x97"=>"<span class=\x22emoji emoji1f517\x22></span>",
- "\xf0\x9f\x94\x99"=>"<span class=\x22emoji emoji1f519\x22></span>", "\xf0\x9f\x94\x9a"=>"<span class=\x22emoji emoji1f51a\x22></span>", "\xf0\x9f\x94\x9b"=>"<span class=\x22emoji emoji1f51b\x22></span>", "\xf0\x9f\x94\x9c"=>"<span class=\x22emoji emoji1f51c\x22></span>", "\xf0\x9f\x94\x9d"=>"<span class=\x22emoji emoji1f51d\x22></span>",
- "\xe2\x9c\x85"=>"<span class=\x22emoji emoji2705\x22></span>", "\xe2\x9c\x8a"=>"<span class=\x22emoji emoji270a\x22></span>", "\xe2\x9c\x8b"=>"<span class=\x22emoji emoji270b\x22></span>", "\xe2\x9c\x8c"=>"<span class=\x22emoji emoji270c\x22></span>", "\xf0\x9f\x91\x8a"=>"<span class=\x22emoji emoji1f44a\x22></span>",
- "\xf0\x9f\x91\x8d"=>"<span class=\x22emoji emoji1f44d\x22></span>", "\xe2\x98\x9d"=>"<span class=\x22emoji emoji261d\x22></span>", "\xf0\x9f\x91\x86"=>"<span class=\x22emoji emoji1f446\x22></span>", "\xf0\x9f\x91\x87"=>"<span class=\x22emoji emoji1f447\x22></span>", "\xf0\x9f\x91\x88"=>"<span class=\x22emoji emoji1f448\x22></span>",
- "\xf0\x9f\x91\x89"=>"<span class=\x22emoji emoji1f449\x22></span>", "\xf0\x9f\x91\x8b"=>"<span class=\x22emoji emoji1f44b\x22></span>", "\xf0\x9f\x91\x8f"=>"<span class=\x22emoji emoji1f44f\x22></span>", "\xf0\x9f\x91\x8c"=>"<span class=\x22emoji emoji1f44c\x22></span>", "\xf0\x9f\x91\x8e"=>"<span class=\x22emoji emoji1f44e\x22></span>",
- "\xf0\x9f\x91\x90"=>"<span class=\x22emoji emoji1f450\x22></span>",
- ),
- );
-
- $this->maps['html_to_unified'] = array_flip($this->maps['unified_to_html']);
- }
-
-
- #
- # functions to convert incoming data into the unified format
- #
-
- public function docomo_to_unified ($text) { return $this->convert($text, 'docomo_to_unified'); }
- public function kddi_to_unified ($text) { return $this->convert($text, 'kddi_to_unified'); }
- public function softbank_to_unified ($text) { return $this->convert($text, 'softbank_to_unified'); }
- public function google_to_unified ($text) { return $this->convert($text, 'google_to_unified'); }
-
-
- #
- # functions to convert unified data into an outgoing format
- #
-
- public function unified_to_docomo ($text) { return $this->convert($text, 'unified_to_docomo'); }
- public function unified_to_kddi ($text) { return $this->convert($text, 'unified_to_kddi'); }
- public function unified_to_softbank ($text) { return $this->convert($text, 'unified_to_softbank'); }
- public function unified_to_google ($text) { return $this->convert($text, 'unified_to_google'); }
- public function unified_to_html ($text) { return $this->convert($text, 'unified_to_html'); }
- public function html_to_unified ($text) { return $this->convert($text, 'html_to_unified'); }
-
-
-
- public function convert($text, $map){
- return str_replace(array_keys($this->maps[$map]), $this->maps[$map], $text);
- }
-
- public function get_name($unified_cp){
- return $this->maps['names'][$unified_cp] ? $this->maps['names'][$unified_cp] : '?';
- }
-
- public function any_to_html($text){
- $text = $this->docomo_to_unified($text);
- $text = $this->kddi_to_unified($text);
- $text = $this->softbank_to_unified($text);
- $text = $this->google_to_unified($text);
- return $this->unified_to_html($text);
- }
-}
diff --git a/emoji/appinfo/app.php b/emoji/appinfo/app.php
deleted file mode 100644
index 0727a7699..000000000
--- a/emoji/appinfo/app.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-
-/**
-* ownCloud - Emoji
-*
-* @author Jonathan Stump
-* @copyright 2013 Jonathan Stump <1-23-4-5@web.de>
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the License, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library. If not, see <http://www.gnu.org/licenses/>.
-*
-*/
-
-
-OCP\Util::connectHook('OCA\SMStorage', 'pre_index_output', 'OCA\Emoji\Hooks', 'smstorage_preOutputTmpl');
-OCP\Util::connectHook('OCA\SMStorage', 'pre_ajax_parseMessages', 'OCA\Emoji\Hooks', 'smstorage_parseMessages');
diff --git a/emoji/appinfo/info.xml b/emoji/appinfo/info.xml
deleted file mode 100644
index 057f15304..000000000
--- a/emoji/appinfo/info.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0"?>
-<info>
- <id>emoji</id>
- <name>Emoji Plugin</name>
- <description>A plugin for other Apps to add Emoji support. Those Apps have to support plugins</description>
- <version>0.1</version>
- <licence>AGPL</licence>
- <author>Jonathan Stump</author>
- <requiremin>5</requiremin>
-</info>
diff --git a/emoji/css/emoji.css b/emoji/css/emoji.css
deleted file mode 100644
index 2c60e3a3f..000000000
--- a/emoji/css/emoji.css
+++ /dev/null
@@ -1,729 +0,0 @@
-.emoji {
- background: url('%appswebroot%/emoji/img/emoji.png') top left no-repeat;
- width: 20px;
- height: 20px;
- display: -moz-inline-stack;
- display: inline-block;
- vertical-align: top;
- zoom: 1;
-}
-.emoji2600 { background-position: -0px -15120px; }
-.emoji2601 { background-position: -0px -15140px; }
-.emoji2614 { background-position: -0px -15200px; }
-.emoji26c4 { background-position: -0px -15800px; }
-.emoji26a1 { background-position: -0px -15700px; }
-.emoji1f300 { background-position: -0px -1100px; }
-.emoji1f301 { background-position: -0px -1120px; }
-.emoji1f302 { background-position: -0px -1140px; }
-.emoji1f303 { background-position: -0px -1160px; }
-.emoji1f304 { background-position: -0px -1180px; }
-.emoji1f305 { background-position: -0px -1200px; }
-.emoji1f306 { background-position: -0px -1220px; }
-.emoji1f307 { background-position: -0px -1240px; }
-.emoji1f308 { background-position: -0px -1260px; }
-.emoji2744 { background-position: -0px -16280px; }
-.emoji26c5 { background-position: -0px -15820px; }
-.emoji1f309 { background-position: -0px -1280px; }
-.emoji1f30a { background-position: -0px -1300px; }
-.emoji1f30b { background-position: -0px -1320px; }
-.emoji1f30c { background-position: -0px -1340px; }
-.emoji1f30f { background-position: -0px -1400px; }
-.emoji1f311 { background-position: -0px -1440px; }
-.emoji1f314 { background-position: -0px -1500px; }
-.emoji1f313 { background-position: -0px -1480px; }
-.emoji1f319 { background-position: -0px -1600px; }
-.emoji1f315 { background-position: -0px -1520px; }
-.emoji1f31b { background-position: -0px -1640px; }
-.emoji1f31f { background-position: -0px -1720px; }
-.emoji1f320 { background-position: -px -px; }
-.emoji1f550 { background-position: -0px -11060px; }
-.emoji1f551 { background-position: -0px -11080px; }
-.emoji1f552 { background-position: -0px -11100px; }
-.emoji1f553 { background-position: -0px -11120px; }
-.emoji1f554 { background-position: -0px -11140px; }
-.emoji1f555 { background-position: -0px -11160px; }
-.emoji1f556 { background-position: -0px -11180px; }
-.emoji1f557 { background-position: -0px -11200px; }
-.emoji1f558 { background-position: -0px -11220px; }
-.emoji1f559 { background-position: -0px -11240px; }
-.emoji1f55a { background-position: -0px -11260px; }
-.emoji1f55b { background-position: -0px -11280px; }
-.emoji231a { background-position: -0px -14780px; }
-.emoji231b { background-position: -0px -14800px; }
-.emoji23f0 { background-position: -0px -14900px; }
-.emoji23f3 { background-position: -0px -14920px; }
-.emoji2648 { background-position: -0px -15280px; }
-.emoji2649 { background-position: -0px -15300px; }
-.emoji264a { background-position: -0px -15320px; }
-.emoji264b { background-position: -0px -15340px; }
-.emoji264c { background-position: -0px -15360px; }
-.emoji264d { background-position: -0px -15380px; }
-.emoji264e { background-position: -0px -15400px; }
-.emoji264f { background-position: -0px -15420px; }
-.emoji2650 { background-position: -0px -15440px; }
-.emoji2651 { background-position: -0px -15460px; }
-.emoji2652 { background-position: -0px -15480px; }
-.emoji2653 { background-position: -0px -15500px; }
-.emoji26ce { background-position: -0px -15840px; }
-.emoji1f340 { background-position: -0px -2040px; }
-.emoji1f337 { background-position: -0px -1860px; }
-.emoji1f331 { background-position: -0px -1760px; }
-.emoji1f341 { background-position: -0px -2060px; }
-.emoji1f338 { background-position: -0px -1880px; }
-.emoji1f339 { background-position: -0px -1900px; }
-.emoji1f342 { background-position: -0px -2080px; }
-.emoji1f343 { background-position: -0px -2100px; }
-.emoji1f33a { background-position: -0px -1920px; }
-.emoji1f33b { background-position: -0px -1940px; }
-.emoji1f334 { background-position: -0px -1820px; }
-.emoji1f335 { background-position: -0px -1840px; }
-.emoji1f33e { background-position: -0px -2000px; }
-.emoji1f33d { background-position: -0px -1980px; }
-.emoji1f344 { background-position: -0px -2120px; }
-.emoji1f330 { background-position: -0px -1740px; }
-.emoji1f33c { background-position: -0px -1960px; }
-.emoji1f33f { background-position: -0px -2020px; }
-.emoji1f352 { background-position: -0px -2400px; }
-.emoji1f34c { background-position: -0px -2280px; }
-.emoji1f34e { background-position: -0px -2320px; }
-.emoji1f34a { background-position: -0px -2240px; }
-.emoji1f353 { background-position: -0px -2420px; }
-.emoji1f349 { background-position: -0px -2220px; }
-.emoji1f345 { background-position: -0px -2140px; }
-.emoji1f346 { background-position: -0px -2160px; }
-.emoji1f348 { background-position: -0px -2200px; }
-.emoji1f34d { background-position: -0px -2300px; }
-.emoji1f347 { background-position: -0px -2180px; }
-.emoji1f351 { background-position: -0px -2380px; }
-.emoji1f34f { background-position: -0px -2340px; }
-.emoji1f440 { background-position: -0px -6100px; }
-.emoji1f442 { background-position: -0px -6120px; }
-.emoji1f443 { background-position: -0px -6140px; }
-.emoji1f444 { background-position: -0px -6160px; }
-.emoji1f445 { background-position: -0px -6180px; }
-.emoji1f484 { background-position: -0px -7440px; }
-.emoji1f485 { background-position: -0px -7460px; }
-.emoji1f486 { background-position: -0px -7480px; }
-.emoji1f487 { background-position: -0px -7500px; }
-.emoji1f488 { background-position: -0px -7520px; }
-.emoji1f464 { background-position: -0px -6800px; }
-.emoji1f466 { background-position: -0px -6840px; }
-.emoji1f467 { background-position: -0px -6860px; }
-.emoji1f468 { background-position: -0px -6880px; }
-.emoji1f469 { background-position: -0px -6900px; }
-.emoji1f46a { background-position: -0px -6920px; }
-.emoji1f46b { background-position: -0px -6940px; }
-.emoji1f46e { background-position: -0px -7000px; }
-.emoji1f46f { background-position: -0px -7020px; }
-.emoji1f470 { background-position: -0px -7040px; }
-.emoji1f471 { background-position: -0px -7060px; }
-.emoji1f472 { background-position: -0px -7080px; }
-.emoji1f473 { background-position: -0px -7100px; }
-.emoji1f474 { background-position: -0px -7120px; }
-.emoji1f475 { background-position: -0px -7140px; }
-.emoji1f476 { background-position: -0px -7160px; }
-.emoji1f477 { background-position: -0px -7180px; }
-.emoji1f478 { background-position: -0px -7200px; }
-.emoji1f479 { background-position: -0px -7220px; }
-.emoji1f47a { background-position: -0px -7240px; }
-.emoji1f47b { background-position: -0px -7260px; }
-.emoji1f47c { background-position: -0px -7280px; }
-.emoji1f47d { background-position: -0px -7300px; }
-.emoji1f47e { background-position: -0px -7320px; }
-.emoji1f47f { background-position: -0px -7340px; }
-.emoji1f480 { background-position: -0px -7360px; }
-.emoji1f481 { background-position: -0px -7380px; }
-.emoji1f482 { background-position: -0px -7400px; }
-.emoji1f483 { background-position: -0px -7420px; }
-.emoji1f40c { background-position: -0px -5080px; }
-.emoji1f40d { background-position: -0px -5100px; }
-.emoji1f40e { background-position: -0px -5120px; }
-.emoji1f414 { background-position: -0px -5240px; }
-.emoji1f417 { background-position: -0px -5300px; }
-.emoji1f42b { background-position: -0px -5700px; }
-.emoji1f418 { background-position: -0px -5320px; }
-.emoji1f428 { background-position: -0px -5640px; }
-.emoji1f412 { background-position: -0px -5200px; }
-.emoji1f411 { background-position: -0px -5180px; }
-.emoji1f419 { background-position: -0px -5340px; }
-.emoji1f41a { background-position: -0px -5360px; }
-.emoji1f41b { background-position: -0px -5380px; }
-.emoji1f41c { background-position: -0px -5400px; }
-.emoji1f41d { background-position: -0px -5420px; }
-.emoji1f41e { background-position: -0px -5440px; }
-.emoji1f420 { background-position: -0px -5480px; }
-.emoji1f421 { background-position: -0px -5500px; }
-.emoji1f422 { background-position: -0px -5520px; }
-.emoji1f424 { background-position: -0px -5560px; }
-.emoji1f425 { background-position: -0px -5580px; }
-.emoji1f426 { background-position: -0px -5600px; }
-.emoji1f423 { background-position: -0px -5540px; }
-.emoji1f427 { background-position: -0px -5620px; }
-.emoji1f429 { background-position: -0px -5660px; }
-.emoji1f41f { background-position: -0px -5460px; }
-.emoji1f42c { background-position: -0px -5720px; }
-.emoji1f42d { background-position: -0px -5740px; }
-.emoji1f42f { background-position: -0px -5780px; }
-.emoji1f431 { background-position: -0px -5820px; }
-.emoji1f433 { background-position: -0px -5860px; }
-.emoji1f434 { background-position: -0px -5880px; }
-.emoji1f435 { background-position: -0px -5900px; }
-.emoji1f436 { background-position: -0px -5920px; }
-.emoji1f437 { background-position: -0px -5940px; }
-.emoji1f43b { background-position: -0px -6020px; }
-.emoji1f439 { background-position: -0px -5980px; }
-.emoji1f43a { background-position: -0px -6000px; }
-.emoji1f42e { background-position: -0px -5760px; }
-.emoji1f430 { background-position: -0px -5800px; }
-.emoji1f438 { background-position: -0px -5960px; }
-.emoji1f43e { background-position: -0px -6080px; }
-.emoji1f432 { background-position: -0px -5840px; }
-.emoji1f43c { background-position: -0px -6040px; }
-.emoji1f43d { background-position: -0px -6060px; }
-.emoji1f620 { background-position: -0px -12280px; }
-.emoji1f629 { background-position: -0px -12460px; }
-.emoji1f632 { background-position: -0px -12640px; }
-.emoji1f61e { background-position: -0px -12240px; }
-.emoji1f635 { background-position: -0px -12700px; }
-.emoji1f630 { background-position: -0px -12600px; }
-.emoji1f612 { background-position: -0px -12000px; }
-.emoji1f60d { background-position: -0px -11900px; }
-.emoji1f624 { background-position: -0px -12360px; }
-.emoji1f61c { background-position: -0px -12200px; }
-.emoji1f61d { background-position: -0px -12220px; }
-.emoji1f60b { background-position: -0px -11860px; }
-.emoji1f618 { background-position: -0px -12120px; }
-.emoji1f61a { background-position: -0px -12160px; }
-.emoji1f637 { background-position: -0px -12740px; }
-.emoji1f633 { background-position: -0px -12660px; }
-.emoji1f603 { background-position: -0px -11700px; }
-.emoji1f605 { background-position: -0px -11740px; }
-.emoji1f606 { background-position: -0px -11760px; }
-.emoji1f601 { background-position: -0px -11660px; }
-.emoji1f602 { background-position: -0px -11680px; }
-.emoji1f60a { background-position: -0px -11840px; }
-.emoji263a { background-position: -0px -15260px; }
-.emoji1f604 { background-position: -0px -11720px; }
-.emoji1f622 { background-position: -0px -12320px; }
-.emoji1f62d { background-position: -0px -12540px; }
-.emoji1f628 { background-position: -0px -12440px; }
-.emoji1f623 { background-position: -0px -12340px; }
-.emoji1f621 { background-position: -0px -12300px; }
-.emoji1f60c { background-position: -0px -11880px; }
-.emoji1f616 { background-position: -0px -12080px; }
-.emoji1f614 { background-position: -0px -12040px; }
-.emoji1f631 { background-position: -0px -12620px; }
-.emoji1f62a { background-position: -0px -12480px; }
-.emoji1f60f { background-position: -0px -11940px; }
-.emoji1f613 { background-position: -0px -12020px; }
-.emoji1f625 { background-position: -0px -12380px; }
-.emoji1f62b { background-position: -0px -12500px; }
-.emoji1f609 { background-position: -0px -11820px; }
-.emoji1f63a { background-position: -0px -12800px; }
-.emoji1f638 { background-position: -0px -12760px; }
-.emoji1f639 { background-position: -0px -12780px; }
-.emoji1f63d { background-position: -0px -12860px; }
-.emoji1f63b { background-position: -0px -12820px; }
-.emoji1f63f { background-position: -0px -12900px; }
-.emoji1f63e { background-position: -0px -12880px; }
-.emoji1f63c { background-position: -0px -12840px; }
-.emoji1f640 { background-position: -0px -12920px; }
-.emoji1f645 { background-position: -0px -12940px; }
-.emoji1f646 { background-position: -0px -12960px; }
-.emoji1f647 { background-position: -0px -12980px; }
-.emoji1f648 { background-position: -0px -13000px; }
-.emoji1f64a { background-position: -0px -13040px; }
-.emoji1f649 { background-position: -0px -13020px; }
-.emoji1f64b { background-position: -0px -13060px; }
-.emoji1f64c { background-position: -0px -13080px; }
-.emoji1f64d { background-position: -0px -13100px; }
-.emoji1f64e { background-position: -0px -13120px; }
-.emoji1f64f { background-position: -0px -13140px; }
-.emoji1f3e0 { background-position: -0px -4500px; }
-.emoji1f3e1 { background-position: -0px -4520px; }
-.emoji1f3e2 { background-position: -0px -4540px; }
-.emoji1f3e3 { background-position: -0px -4560px; }
-.emoji1f3e5 { background-position: -0px -4600px; }
-.emoji1f3e6 { background-position: -0px -4620px; }
-.emoji1f3e7 { background-position: -0px -4640px; }
-.emoji1f3e8 { background-position: -0px -4660px; }
-.emoji1f3e9 { background-position: -0px -4680px; }
-.emoji1f3ea { background-position: -0px -4700px; }
-.emoji1f3eb { background-position: -0px -4720px; }
-.emoji26ea { background-position: -0px -15880px; }
-.emoji26f2 { background-position: -0px -15900px; }
-.emoji1f3ec { background-position: -0px -4740px; }
-.emoji1f3ef { background-position: -0px -4800px; }
-.emoji1f3f0 { background-position: -0px -4820px; }
-.emoji1f3ed { background-position: -0px -4760px; }
-.emoji2693 { background-position: -0px -15660px; }
-.emoji1f3ee { background-position: -0px -4780px; }
-.emoji1f5fb { background-position: -0px -11540px; }
-.emoji1f5fc { background-position: -0px -11560px; }
-.emoji1f5fd { background-position: -0px -11580px; }
-.emoji1f5fe { background-position: -0px -11600px; }
-.emoji1f5ff { background-position: -0px -11620px; }
-.emoji1f45e { background-position: -0px -6680px; }
-.emoji1f45f { background-position: -0px -6700px; }
-.emoji1f460 { background-position: -0px -6720px; }
-.emoji1f461 { background-position: -0px -6740px; }
-.emoji1f462 { background-position: -0px -6760px; }
-.emoji1f463 { background-position: -0px -6780px; }
-.emoji1f453 { background-position: -0px -6460px; }
-.emoji1f455 { background-position: -0px -6500px; }
-.emoji1f456 { background-position: -0px -6520px; }
-.emoji1f451 { background-position: -0px -6420px; }
-.emoji1f454 { background-position: -0px -6480px; }
-.emoji1f452 { background-position: -0px -6440px; }
-.emoji1f457 { background-position: -0px -6540px; }
-.emoji1f458 { background-position: -0px -6560px; }
-.emoji1f459 { background-position: -0px -6580px; }
-.emoji1f45a { background-position: -0px -6600px; }
-.emoji1f45b { background-position: -0px -6620px; }
-.emoji1f45c { background-position: -0px -6640px; }
-.emoji1f45d { background-position: -0px -6660px; }
-.emoji1f4b0 { background-position: -0px -8320px; }
-.emoji1f4b1 { background-position: -0px -8340px; }
-.emoji1f4b9 { background-position: -0px -8500px; }
-.emoji1f4b2 { background-position: -0px -8360px; }
-.emoji1f4b3 { background-position: -0px -8380px; }
-.emoji1f4b4 { background-position: -0px -8400px; }
-.emoji1f4b5 { background-position: -0px -8420px; }
-.emoji1f4b8 { background-position: -0px -8480px; }
-.emoji1f1e81f1f3 { background-position: -0px -600px; }
-.emoji1f1e91f1ea { background-position: -0px -620px; }
-.emoji1f1ea1f1f8 { background-position: -0px -640px; }
-.emoji1f1eb1f1f7 { background-position: -0px -660px; }
-.emoji1f1ec1f1e7 { background-position: -0px -680px; }
-.emoji1f1ee1f1f9 { background-position: -0px -700px; }
-.emoji1f1ef1f1f5 { background-position: -0px -720px; }
-.emoji1f1f01f1f7 { background-position: -0px -740px; }
-.emoji1f1f71f1fa { background-position: -0px -760px; }
-.emoji1f1fa1f1f8 { background-position: -0px -780px; }
-.emoji1f525 { background-position: -0px -10560px; }
-.emoji1f526 { background-position: -0px -10580px; }
-.emoji1f527 { background-position: -0px -10600px; }
-.emoji1f528 { background-position: -0px -10620px; }
-.emoji1f529 { background-position: -0px -10640px; }
-.emoji1f52a { background-position: -0px -10660px; }
-.emoji1f52b { background-position: -0px -10680px; }
-.emoji1f52e { background-position: -0px -10740px; }
-.emoji1f52f { background-position: -0px -10760px; }
-.emoji1f530 { background-position: -0px -10780px; }
-.emoji1f531 { background-position: -0px -10800px; }
-.emoji1f489 { background-position: -0px -7540px; }
-.emoji1f48a { background-position: -0px -7560px; }
-.emoji1f170 { background-position: -0px -300px; }
-.emoji1f171 { background-position: -0px -320px; }
-.emoji1f18e { background-position: -0px -380px; }
-.emoji1f17e { background-position: -0px -340px; }
-.emoji1f380 { background-position: -0px -3260px; }
-.emoji1f381 { background-position: -0px -3280px; }
-.emoji1f382 { background-position: -0px -3300px; }
-.emoji1f384 { background-position: -0px -3340px; }
-.emoji1f385 { background-position: -0px -3360px; }
-.emoji1f38c { background-position: -0px -3500px; }
-.emoji1f386 { background-position: -0px -3380px; }
-.emoji1f388 { background-position: -0px -3420px; }
-.emoji1f389 { background-position: -0px -3440px; }
-.emoji1f38d { background-position: -0px -3520px; }
-.emoji1f38e { background-position: -0px -3540px; }
-.emoji1f393 { background-position: -0px -3640px; }
-.emoji1f392 { background-position: -0px -3620px; }
-.emoji1f38f { background-position: -0px -3560px; }
-.emoji1f387 { background-position: -0px -3400px; }
-.emoji1f390 { background-position: -0px -3580px; }
-.emoji1f383 { background-position: -0px -3320px; }
-.emoji1f38a { background-position: -0px -3460px; }
-.emoji1f38b { background-position: -0px -3480px; }
-.emoji1f391 { background-position: -0px -3600px; }
-.emoji1f4df { background-position: -0px -9260px; }
-.emoji260e { background-position: -0px -15160px; }
-.emoji1f4de { background-position: -0px -9240px; }
-.emoji1f4f1 { background-position: -0px -9620px; }
-.emoji1f4f2 { background-position: -0px -9640px; }
-.emoji1f4dd { background-position: -0px -9220px; }
-.emoji1f4e0 { background-position: -0px -9280px; }
-.emoji2709 { background-position: -0px -16060px; }
-.emoji1f4e8 { background-position: -0px -9440px; }
-.emoji1f4e9 { background-position: -0px -9460px; }
-.emoji1f4ea { background-position: -0px -9480px; }
-.emoji1f4eb { background-position: -0px -9500px; }
-.emoji1f4ee { background-position: -0px -9560px; }
-.emoji1f4f0 { background-position: -0px -9600px; }
-.emoji1f4e2 { background-position: -0px -9320px; }
-.emoji1f4e3 { background-position: -0px -9340px; }
-.emoji1f4e1 { background-position: -0px -9300px; }
-.emoji1f4e4 { background-position: -0px -9360px; }
-.emoji1f4e5 { background-position: -0px -9380px; }
-.emoji1f4e6 { background-position: -0px -9400px; }
-.emoji1f4e7 { background-position: -0px -9420px; }
-.emoji1f520 { background-position: -0px -10460px; }
-.emoji1f521 { background-position: -0px -10480px; }
-.emoji1f522 { background-position: -0px -10500px; }
-.emoji1f523 { background-position: -0px -10520px; }
-.emoji1f524 { background-position: -0px -10540px; }
-.emoji2712 { background-position: -0px -16160px; }
-.emoji1f4ba { background-position: -0px -8520px; }
-.emoji1f4bb { background-position: -0px -8540px; }
-.emoji270f { background-position: -0px -16140px; }
-.emoji1f4ce { background-position: -0px -8920px; }
-.emoji1f4bc { background-position: -0px -8560px; }
-.emoji1f4bd { background-position: -0px -8580px; }
-.emoji1f4be { background-position: -0px -8600px; }
-.emoji1f4bf { background-position: -0px -8620px; }
-.emoji1f4c0 { background-position: -0px -8640px; }
-.emoji2702 { background-position: -0px -16000px; }
-.emoji1f4cd { background-position: -0px -8900px; }
-.emoji1f4c3 { background-position: -0px -8700px; }
-.emoji1f4c4 { background-position: -0px -8720px; }
-.emoji1f4c5 { background-position: -0px -8740px; }
-.emoji1f4c1 { background-position: -0px -8660px; }
-.emoji1f4c2 { background-position: -0px -8680px; }
-.emoji1f4d3 { background-position: -0px -9020px; }
-.emoji1f4d6 { background-position: -0px -9080px; }
-.emoji1f4d4 { background-position: -0px -9040px; }
-.emoji1f4d5 { background-position: -0px -9060px; }
-.emoji1f4d7 { background-position: -0px -9100px; }
-.emoji1f4d8 { background-position: -0px -9120px; }
-.emoji1f4d9 { background-position: -0px -9140px; }
-.emoji1f4da { background-position: -0px -9160px; }
-.emoji1f4db { background-position: -0px -9180px; }
-.emoji1f4dc { background-position: -0px -9200px; }
-.emoji1f4cb { background-position: -0px -8860px; }
-.emoji1f4c6 { background-position: -0px -8760px; }
-.emoji1f4ca { background-position: -0px -8840px; }
-.emoji1f4c8 { background-position: -0px -8800px; }
-.emoji1f4c9 { background-position: -0px -8820px; }
-.emoji1f4c7 { background-position: -0px -8780px; }
-.emoji1f4cc { background-position: -0px -8880px; }
-.emoji1f4d2 { background-position: -0px -9000px; }
-.emoji1f4cf { background-position: -0px -8940px; }
-.emoji1f4d0 { background-position: -0px -8960px; }
-.emoji1f4d1 { background-position: -0px -8980px; }
-.emoji1f3bd { background-position: -0px -4240px; }
-.emoji26be { background-position: -0px -15780px; }
-.emoji26f3 { background-position: -0px -15920px; }
-.emoji1f3be { background-position: -0px -4260px; }
-.emoji26bd { background-position: -0px -15760px; }
-.emoji1f3bf { background-position: -0px -4280px; }
-.emoji1f3c0 { background-position: -0px -4300px; }
-.emoji1f3c1 { background-position: -0px -4320px; }
-.emoji1f3c2 { background-position: -0px -4340px; }
-.emoji1f3c3 { background-position: -0px -4360px; }
-.emoji1f3c4 { background-position: -0px -4380px; }
-.emoji1f3c6 { background-position: -0px -4400px; }
-.emoji1f3c8 { background-position: -0px -4440px; }
-.emoji1f3ca { background-position: -0px -4480px; }
-.emoji1f683 { background-position: -0px -13220px; }
-.emoji1f687 { background-position: -0px -13300px; }
-.emoji24c2 { background-position: -0px -14940px; }
-.emoji1f684 { background-position: -0px -13240px; }
-.emoji1f685 { background-position: -0px -13260px; }
-.emoji1f697 { background-position: -0px -13600px; }
-.emoji1f699 { background-position: -0px -13640px; }
-.emoji1f68c { background-position: -0px -13380px; }
-.emoji1f68f { background-position: -0px -13440px; }
-.emoji1f6a2 { background-position: -0px -13820px; }
-.emoji2708 { background-position: -0px -16040px; }
-.emoji26f5 { background-position: -0px -15940px; }
-.emoji1f689 { background-position: -0px -13340px; }
-.emoji1f680 { background-position: -0px -13160px; }
-.emoji1f6a4 { background-position: -0px -13860px; }
-.emoji1f695 { background-position: -0px -13560px; }
-.emoji1f69a { background-position: -0px -13660px; }
-.emoji1f692 { background-position: -0px -13500px; }
-.emoji1f691 { background-position: -0px -13480px; }
-.emoji1f693 { background-position: -0px -13520px; }
-.emoji26fd { background-position: -0px -15980px; }
-.emoji1f17f { background-position: -0px -360px; }
-.emoji1f6a5 { background-position: -0px -13880px; }
-.emoji1f6a7 { background-position: -0px -13920px; }
-.emoji1f6a8 { background-position: -0px -13940px; }
-.emoji2668 { background-position: -0px -15600px; }
-.emoji26fa { background-position: -0px -15960px; }
-.emoji1f3a0 { background-position: -0px -3660px; }
-.emoji1f3a1 { background-position: -0px -3680px; }
-.emoji1f3a2 { background-position: -0px -3700px; }
-.emoji1f3a3 { background-position: -0px -3720px; }
-.emoji1f3a4 { background-position: -0px -3740px; }
-.emoji1f3a5 { background-position: -0px -3760px; }
-.emoji1f3a6 { background-position: -0px -3780px; }
-.emoji1f3a7 { background-position: -0px -3800px; }
-.emoji1f3a8 { background-position: -0px -3820px; }
-.emoji1f3a9 { background-position: -0px -3840px; }
-.emoji1f3aa { background-position: -0px -3860px; }
-.emoji1f3ab { background-position: -0px -3880px; }
-.emoji1f3ac { background-position: -0px -3900px; }
-.emoji1f3ad { background-position: -0px -3920px; }
-.emoji1f3ae { background-position: -0px -3940px; }
-.emoji1f004 { background-position: -0px -260px; }
-.emoji1f3af { background-position: -0px -3960px; }
-.emoji1f3b0 { background-position: -0px -3980px; }
-.emoji1f3b1 { background-position: -0px -4000px; }
-.emoji1f3b2 { background-position: -0px -4020px; }
-.emoji1f3b3 { background-position: -0px -4040px; }
-.emoji1f3b4 { background-position: -0px -4060px; }
-.emoji1f0cf { background-position: -0px -280px; }
-.emoji1f3b5 { background-position: -0px -4080px; }
-.emoji1f3b6 { background-position: -0px -4100px; }
-.emoji1f3b7 { background-position: -0px -4120px; }
-.emoji1f3b8 { background-position: -0px -4140px; }
-.emoji1f3b9 { background-position: -0px -4160px; }
-.emoji1f3ba { background-position: -0px -4180px; }
-.emoji1f3bb { background-position: -0px -4200px; }
-.emoji1f3bc { background-position: -0px -4220px; }
-.emoji303d { background-position: -0px -16780px; }
-.emoji1f4f7 { background-position: -0px -9740px; }
-.emoji1f4f9 { background-position: -0px -9760px; }
-.emoji1f4fa { background-position: -0px -9780px; }
-.emoji1f4fb { background-position: -0px -9800px; }
-.emoji1f4fc { background-position: -0px -9820px; }
-.emoji1f48b { background-position: -0px -7580px; }
-.emoji1f48c { background-position: -0px -7600px; }
-.emoji1f48d { background-position: -0px -7620px; }
-.emoji1f48e { background-position: -0px -7640px; }
-.emoji1f48f { background-position: -0px -7660px; }
-.emoji1f490 { background-position: -0px -7680px; }
-.emoji1f491 { background-position: -0px -7700px; }
-.emoji1f492 { background-position: -0px -7720px; }
-.emoji1f51e { background-position: -0px -10420px; }
-.emojia9 { background-position: -0px -220px; }
-.emojiae { background-position: -0px -240px; }
-.emoji2122 { background-position: -0px -14580px; }
-.emoji2139 { background-position: -0px -14600px; }
-.emoji2320e3 { background-position: -0px -0px; }
-.emoji3120e3 { background-position: -0px -40px; }
-.emoji3220e3 { background-position: -0px -60px; }
-.emoji3320e3 { background-position: -0px -80px; }
-.emoji3420e3 { background-position: -0px -100px; }
-.emoji3520e3 { background-position: -0px -120px; }
-.emoji3620e3 { background-position: -0px -140px; }
-.emoji3720e3 { background-position: -0px -160px; }
-.emoji3820e3 { background-position: -0px -180px; }
-.emoji3920e3 { background-position: -0px -200px; }
-.emoji3020e3 { background-position: -0px -20px; }
-.emoji1f51f { background-position: -0px -10440px; }
-.emoji1f4f6 { background-position: -0px -9720px; }
-.emoji1f4f3 { background-position: -0px -9660px; }
-.emoji1f4f4 { background-position: -0px -9680px; }
-.emoji1f354 { background-position: -0px -2440px; }
-.emoji1f359 { background-position: -0px -2540px; }
-.emoji1f370 { background-position: -0px -3000px; }
-.emoji1f35c { background-position: -0px -2600px; }
-.emoji1f35e { background-position: -0px -2640px; }
-.emoji1f373 { background-position: -0px -3060px; }
-.emoji1f366 { background-position: -0px -2800px; }
-.emoji1f35f { background-position: -0px -2660px; }
-.emoji1f361 { background-position: -0px -2700px; }
-.emoji1f358 { background-position: -0px -2520px; }
-.emoji1f35a { background-position: -0px -2560px; }
-.emoji1f35d { background-position: -0px -2620px; }
-.emoji1f35b { background-position: -0px -2580px; }
-.emoji1f362 { background-position: -0px -2720px; }
-.emoji1f363 { background-position: -0px -2740px; }
-.emoji1f371 { background-position: -0px -3020px; }
-.emoji1f372 { background-position: -0px -3040px; }
-.emoji1f367 { background-position: -0px -2820px; }
-.emoji1f356 { background-position: -0px -2480px; }
-.emoji1f365 { background-position: -0px -2780px; }
-.emoji1f360 { background-position: -0px -2680px; }
-.emoji1f355 { background-position: -0px -2460px; }
-.emoji1f357 { background-position: -0px -2500px; }
-.emoji1f368 { background-position: -0px -2840px; }
-.emoji1f369 { background-position: -0px -2860px; }
-.emoji1f36a { background-position: -0px -2880px; }
-.emoji1f36b { background-position: -0px -2900px; }
-.emoji1f36c { background-position: -0px -2920px; }
-.emoji1f36d { background-position: -0px -2940px; }
-.emoji1f36e { background-position: -0px -2960px; }
-.emoji1f36f { background-position: -0px -2980px; }
-.emoji1f364 { background-position: -0px -2760px; }
-.emoji1f374 { background-position: -0px -3080px; }
-.emoji2615 { background-position: -0px -15220px; }
-.emoji1f378 { background-position: -0px -3160px; }
-.emoji1f37a { background-position: -0px -3200px; }
-.emoji1f375 { background-position: -0px -3100px; }
-.emoji1f376 { background-position: -0px -3120px; }
-.emoji1f377 { background-position: -0px -3140px; }
-.emoji1f37b { background-position: -0px -3220px; }
-.emoji1f379 { background-position: -0px -3180px; }
-.emoji2197 { background-position: -0px -14680px; }
-.emoji2198 { background-position: -0px -14700px; }
-.emoji2196 { background-position: -0px -14660px; }
-.emoji2199 { background-position: -0px -14720px; }
-.emoji2934 { background-position: -0px -16580px; }
-.emoji2935 { background-position: -0px -16600px; }
-.emoji2194 { background-position: -0px -14620px; }
-.emoji2195 { background-position: -0px -14640px; }
-.emoji2b06 { background-position: -0px -16640px; }
-.emoji2b07 { background-position: -0px -16660px; }
-.emoji27a1 { background-position: -0px -16520px; }
-.emoji2b05 { background-position: -0px -16620px; }
-.emoji25b6 { background-position: -0px -15000px; }
-.emoji25c0 { background-position: -0px -15020px; }
-.emoji23e9 { background-position: -0px -14820px; }
-.emoji23ea { background-position: -0px -14840px; }
-.emoji23eb { background-position: -0px -14860px; }
-.emoji23ec { background-position: -0px -14880px; }
-.emoji1f53a { background-position: -0px -10980px; }
-.emoji1f53b { background-position: -0px -11000px; }
-.emoji1f53c { background-position: -0px -11020px; }
-.emoji1f53d { background-position: -0px -11040px; }
-.emoji2b55 { background-position: -0px -16740px; }
-.emoji274c { background-position: -0px -16320px; }
-.emoji274e { background-position: -0px -16340px; }
-.emoji2757 { background-position: -0px -16420px; }
-.emoji2049 { background-position: -0px -14560px; }
-.emoji203c { background-position: -0px -14540px; }
-.emoji2753 { background-position: -0px -16360px; }
-.emoji2754 { background-position: -0px -16380px; }
-.emoji2755 { background-position: -0px -16400px; }
-.emoji3030 { background-position: -0px -16760px; }
-.emoji27b0 { background-position: -0px -16540px; }
-.emoji27bf { background-position: -0px -16560px; }
-.emoji2764 { background-position: -0px -16440px; }
-.emoji1f493 { background-position: -0px -7740px; }
-.emoji1f494 { background-position: -0px -7760px; }
-.emoji1f495 { background-position: -0px -7780px; }
-.emoji1f496 { background-position: -0px -7800px; }
-.emoji1f497 { background-position: -0px -7820px; }
-.emoji1f498 { background-position: -0px -7840px; }
-.emoji1f499 { background-position: -0px -7860px; }
-.emoji1f49a { background-position: -0px -7880px; }
-.emoji1f49b { background-position: -0px -7900px; }
-.emoji1f49c { background-position: -0px -7920px; }
-.emoji1f49d { background-position: -0px -7940px; }
-.emoji1f49e { background-position: -0px -7960px; }
-.emoji1f49f { background-position: -0px -7980px; }
-.emoji2665 { background-position: -0px -15560px; }
-.emoji2660 { background-position: -0px -15520px; }
-.emoji2666 { background-position: -0px -15580px; }
-.emoji2663 { background-position: -0px -15540px; }
-.emoji1f6ac { background-position: -0px -14020px; }
-.emoji1f6ad { background-position: -0px -14040px; }
-.emoji267f { background-position: -0px -15640px; }
-.emoji1f6a9 { background-position: -0px -13960px; }
-.emoji26a0 { background-position: -0px -15680px; }
-.emoji26d4 { background-position: -0px -15860px; }
-.emoji267b { background-position: -0px -15620px; }
-.emoji1f6b2 { background-position: -0px -14140px; }
-.emoji1f6b6 { background-position: -0px -14220px; }
-.emoji1f6b9 { background-position: -0px -14280px; }
-.emoji1f6ba { background-position: -0px -14300px; }
-.emoji1f6c0 { background-position: -0px -14420px; }
-.emoji1f6bb { background-position: -0px -14320px; }
-.emoji1f6bd { background-position: -0px -14360px; }
-.emoji1f6be { background-position: -0px -14380px; }
-.emoji1f6bc { background-position: -0px -14340px; }
-.emoji1f6aa { background-position: -0px -13980px; }
-.emoji1f6ab { background-position: -0px -14000px; }
-.emoji2714 { background-position: -0px -16180px; }
-.emoji1f191 { background-position: -0px -400px; }
-.emoji1f192 { background-position: -0px -420px; }
-.emoji1f193 { background-position: -0px -440px; }
-.emoji1f194 { background-position: -0px -460px; }
-.emoji1f195 { background-position: -0px -480px; }
-.emoji1f196 { background-position: -0px -500px; }
-.emoji1f197 { background-position: -0px -520px; }
-.emoji1f198 { background-position: -0px -540px; }
-.emoji1f199 { background-position: -0px -560px; }
-.emoji1f19a { background-position: -0px -580px; }
-.emoji1f201 { background-position: -0px -800px; }
-.emoji1f202 { background-position: -0px -820px; }
-.emoji1f232 { background-position: -0px -880px; }
-.emoji1f233 { background-position: -0px -900px; }
-.emoji1f234 { background-position: -0px -920px; }
-.emoji1f235 { background-position: -0px -940px; }
-.emoji1f236 { background-position: -0px -960px; }
-.emoji1f21a { background-position: -0px -840px; }
-.emoji1f237 { background-position: -0px -980px; }
-.emoji1f238 { background-position: -0px -1000px; }
-.emoji1f239 { background-position: -0px -1020px; }
-.emoji1f22f { background-position: -0px -860px; }
-.emoji1f23a { background-position: -0px -1040px; }
-.emoji3299 { background-position: -0px -16820px; }
-.emoji3297 { background-position: -0px -16800px; }
-.emoji1f250 { background-position: -0px -1060px; }
-.emoji1f251 { background-position: -0px -1080px; }
-.emoji2795 { background-position: -0px -16460px; }
-.emoji2796 { background-position: -0px -16480px; }
-.emoji2716 { background-position: -0px -16200px; }
-.emoji2797 { background-position: -0px -16500px; }
-.emoji1f4a0 { background-position: -0px -8000px; }
-.emoji1f4a1 { background-position: -0px -8020px; }
-.emoji1f4a2 { background-position: -0px -8040px; }
-.emoji1f4a3 { background-position: -0px -8060px; }
-.emoji1f4a4 { background-position: -0px -8080px; }
-.emoji1f4a5 { background-position: -0px -8100px; }
-.emoji1f4a6 { background-position: -0px -8120px; }
-.emoji1f4a7 { background-position: -0px -8140px; }
-.emoji1f4a8 { background-position: -0px -8160px; }
-.emoji1f4a9 { background-position: -0px -8180px; }
-.emoji1f4aa { background-position: -0px -8200px; }
-.emoji1f4ab { background-position: -0px -8220px; }
-.emoji1f4ac { background-position: -0px -8240px; }
-.emoji2728 { background-position: -0px -16220px; }
-.emoji2734 { background-position: -0px -16260px; }
-.emoji2733 { background-position: -0px -16240px; }
-.emoji26aa { background-position: -0px -15720px; }
-.emoji26ab { background-position: -0px -15740px; }
-.emoji1f534 { background-position: -0px -10860px; }
-.emoji1f535 { background-position: -0px -10880px; }
-.emoji1f532 { background-position: -0px -10820px; }
-.emoji1f533 { background-position: -0px -10840px; }
-.emoji2b50 { background-position: -0px -16720px; }
-.emoji2b1c { background-position: -0px -16700px; }
-.emoji2b1b { background-position: -0px -16680px; }
-.emoji25ab { background-position: -0px -14980px; }
-.emoji25aa { background-position: -0px -14960px; }
-.emoji25fd { background-position: -0px -15080px; }
-.emoji25fe { background-position: -0px -15100px; }
-.emoji25fb { background-position: -0px -15040px; }
-.emoji25fc { background-position: -0px -15060px; }
-.emoji1f536 { background-position: -0px -10900px; }
-.emoji1f537 { background-position: -0px -10920px; }
-.emoji1f538 { background-position: -0px -10940px; }
-.emoji1f539 { background-position: -0px -10960px; }
-.emoji2747 { background-position: -0px -16300px; }
-.emoji1f4ae { background-position: -0px -8280px; }
-.emoji1f4af { background-position: -0px -8300px; }
-.emoji21a9 { background-position: -0px -14740px; }
-.emoji21aa { background-position: -0px -14760px; }
-.emoji1f503 { background-position: -0px -9900px; }
-.emoji1f50a { background-position: -0px -10020px; }
-.emoji1f50b { background-position: -0px -10040px; }
-.emoji1f50c { background-position: -0px -10060px; }
-.emoji1f50d { background-position: -0px -10080px; }
-.emoji1f50e { background-position: -0px -10100px; }
-.emoji1f512 { background-position: -0px -10180px; }
-.emoji1f513 { background-position: -0px -10200px; }
-.emoji1f50f { background-position: -0px -10120px; }
-.emoji1f510 { background-position: -0px -10140px; }
-.emoji1f511 { background-position: -0px -10160px; }
-.emoji1f514 { background-position: -0px -10220px; }
-.emoji2611 { background-position: -0px -15180px; }
-.emoji1f518 { background-position: -0px -10300px; }
-.emoji1f516 { background-position: -0px -10260px; }
-.emoji1f517 { background-position: -0px -10280px; }
-.emoji1f519 { background-position: -0px -10320px; }
-.emoji1f51a { background-position: -0px -10340px; }
-.emoji1f51b { background-position: -0px -10360px; }
-.emoji1f51c { background-position: -0px -10380px; }
-.emoji1f51d { background-position: -0px -10400px; }
-.emoji2705 { background-position: -0px -16020px; }
-.emoji270a { background-position: -0px -16080px; }
-.emoji270b { background-position: -0px -16100px; }
-.emoji270c { background-position: -0px -16120px; }
-.emoji1f44a { background-position: -0px -6280px; }
-.emoji1f44d { background-position: -0px -6340px; }
-.emoji261d { background-position: -0px -15240px; }
-.emoji1f446 { background-position: -0px -6200px; }
-.emoji1f447 { background-position: -0px -6220px; }
-.emoji1f448 { background-position: -0px -6240px; }
-.emoji1f449 { background-position: -0px -6260px; }
-.emoji1f44b { background-position: -0px -6300px; }
-.emoji1f44f { background-position: -0px -6380px; }
-.emoji1f44c { background-position: -0px -6320px; }
-.emoji1f44e { background-position: -0px -6360px; }
-.emoji1f450 { background-position: -0px -6400px; }
diff --git a/emoji/hooks.php b/emoji/hooks.php
deleted file mode 100644
index 1e9de2b56..000000000
--- a/emoji/hooks.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-/**
-* ownCloud - Emoji
-*
-* @author Jonathan Stump
-* @copyright 2013 Jonathan Stump <1-23-4-5@web.de>
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the License, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library. If not, see <http://www.gnu.org/licenses/>.
-*
-*/
-
-namespace OCA\Emoji;
-
-class Hooks {
- // Hooks for SMStorage
- public static function smstorage_preOutputTmpl($data) {
- \OCP\Util::addStyle('emoji', 'emoji');
- }
-
- public static function smstorage_parseMessages($data) {
- $emoji = new App();
- foreach ($data['messages'] as $message) {
- $message->body = $emoji->any_to_html($message->body);
- }
- }
-}
diff --git a/emoji/img/emoji.png b/emoji/img/emoji.png
deleted file mode 100644
index 8a21054d6..000000000
--- a/emoji/img/emoji.png
+++ /dev/null
Binary files differ
diff --git a/files_videoviewer/appinfo/app.php b/files_videoviewer/appinfo/app.php
deleted file mode 100644
index 080015db2..000000000
--- a/files_videoviewer/appinfo/app.php
+++ /dev/null
@@ -1,5 +0,0 @@
-<?php
-//load the required files
-OCP\Util::addStyle( 'files_videoviewer', 'style' );
-OCP\Util::addStyle( 'files_videoviewer', 'mediaelementplayer' );
-OCP\Util::addscript( 'files_videoviewer', 'viewer');
diff --git a/files_videoviewer/appinfo/info.xml b/files_videoviewer/appinfo/info.xml
deleted file mode 100644
index 2a7b2684c..000000000
--- a/files_videoviewer/appinfo/info.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0"?>
-<info>
- <id>files_videoviewer</id>
- <name>Video Viewer</name>
- <description>Simple video player based on MediaElement.js by John Dyer.</description>
- <licence>AGPL</licence>
- <author>Victor Dubiniuk</author>
- <shipped>true</shipped>
- <default_enable/>
- <dependencies>
- <owncloud min-version="9.0" max-version="9.0" />
- </dependencies>
- <ocsid>166054</ocsid>
-</info>
diff --git a/files_videoviewer/appinfo/version b/files_videoviewer/appinfo/version
deleted file mode 100644
index b1e80bb24..000000000
--- a/files_videoviewer/appinfo/version
+++ /dev/null
@@ -1 +0,0 @@
-0.1.3
diff --git a/files_videoviewer/css/mediaelementplayer.css b/files_videoviewer/css/mediaelementplayer.css
deleted file mode 100644
index 8ee248385..000000000
--- a/files_videoviewer/css/mediaelementplayer.css
+++ /dev/null
@@ -1,870 +0,0 @@
-.mejs-container {
- position: relative;
- background: #000;
- font-family: Helvetica, Arial;
- text-align: left;
- vertical-align: top;
- text-indent: 0;
-}
-
-.me-plugin {
- position: absolute;
-}
-
-.mejs-embed, .mejs-embed body {
- width: 100%;
- height: 100%;
- margin: 0;
- padding: 0;
- background: #000;
- overflow: hidden;
-}
-
-.mejs-fullscreen {
- /* set it to not show scroll bars so 100% will work */
- overflow: hidden !important;
-}
-
-.mejs-container-fullscreen {
- position: fixed;
- left: 0;
- top: 0;
- right: 0;
- bottom: 0;
- overflow: hidden;
- z-index: 1000;
-}
-.mejs-container-fullscreen .mejs-mediaelement,
-.mejs-container-fullscreen video {
- width: 100%;
- height: 100%;
-}
-
-.mejs-clear {
- clear: both;
-}
-
-/* Start: LAYERS */
-.mejs-background {
- position: absolute;
- top: 0;
- left: 0;
-}
-
-.mejs-mediaelement {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
-}
-
-.mejs-poster {
- position: absolute;
- top: 0;
- left: 0;
- background-size: contain ;
- background-position: 50% 50% ;
- background-repeat: no-repeat ;
-}
-:root .mejs-poster img {
- display: none ;
-}
-
-.mejs-poster img {
- border: 0;
- padding: 0;
- border: 0;
-}
-
-.mejs-overlay {
- position: absolute;
- top: 0;
- left: 0;
-}
-
-.mejs-overlay-play {
- cursor: pointer;
-}
-
-.mejs-overlay-button {
- position: absolute;
- top: 50%;
- left: 50%;
- width: 100px;
- height: 100px;
- margin: -50px 0 0 -50px;
- background: url('../img/skin/bigplay.svg') no-repeat;
-}
-
-.no-svg .mejs-overlay-button {
- background-image: url('../img/skin/bigplay.png');
-}
-
-.mejs-overlay:hover .mejs-overlay-button {
- background-position: 0 -100px ;
-}
-
-.mejs-overlay-loading {
- position: absolute;
- top: 50%;
- left: 50%;
- width: 80px;
- height: 80px;
- margin: -40px 0 0 -40px;
- background: #333;
- background: url('../img/skin/background.png');
- background: rgba(0, 0, 0, 0.9);
- background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(50,50,50,0.9)), to(rgba(0,0,0,0.9)));
- background: -webkit-linear-gradient(top, rgba(50,50,50,0.9), rgba(0,0,0,0.9));
- background: -moz-linear-gradient(top, rgba(50,50,50,0.9), rgba(0,0,0,0.9));
- background: -o-linear-gradient(top, rgba(50,50,50,0.9), rgba(0,0,0,0.9));
- background: -ms-linear-gradient(top, rgba(50,50,50,0.9), rgba(0,0,0,0.9));
- background: linear-gradient(rgba(50,50,50,0.9), rgba(0,0,0,0.9));
-}
-
-.mejs-overlay-loading span {
- display: block;
- width: 80px;
- height: 80px;
- background: transparent url('../img/skin/loading.gif') 50% 50% no-repeat;
-}
-
-/* End: LAYERS */
-
-/* Start: CONTROL BAR */
-.mejs-container .mejs-controls {
- position: absolute;
- list-style-type: none;
- margin: 0;
- padding: 0;
- bottom: 0;
- left: 0;
- background: url('../img/skin/background.png');
- background: rgba(0, 0, 0, 0.7);
- background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(50,50,50,0.7)), to(rgba(0,0,0,0.7)));
- background: -webkit-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7));
- background: -moz-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7));
- background: -o-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7));
- background: -ms-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7));
- background: linear-gradient(rgba(50,50,50,0.7), rgba(0,0,0,0.7));
- height: 30px;
- width: 100%;
-}
-.mejs-container .mejs-controls div {
- list-style-type: none;
- background-image: none;
- display: block;
- float: left;
- margin: 0;
- padding: 0;
- width: 26px;
- height: 26px;
- font-size: 11px;
- line-height: 11px;
- font-family: Helvetica, Arial;
- border: 0;
-}
-
-.mejs-controls .mejs-button button {
- cursor: pointer;
- display: block;
- font-size: 0;
- line-height: 0;
- text-decoration: none;
- margin: 7px 5px;
- padding: 0;
- position: absolute;
- height: 16px;
- width: 16px;
- border: 0;
- background: transparent url('../img/skin/controls.svg') no-repeat;
-}
-
-.no-svg .mejs-controls .mejs-button button {
- background-image: url('../img/skin/controls.png');
-}
-
-/* :focus for accessibility */
-.mejs-controls .mejs-button button:focus {
- outline: dotted 1px #999;
-}
-
-/* End: CONTROL BAR */
-
-/* Start: Time (Current / Duration) */
-.mejs-container .mejs-controls .mejs-time {
- color: #fff;
- display: block;
- height: 17px;
- width: auto;
- padding: 8px 3px 0 3px ;
- overflow: hidden;
- text-align: center;
- -moz-box-sizing: content-box;
- -webkit-box-sizing: content-box;
- box-sizing: content-box;
-}
-
-.mejs-container .mejs-controls .mejs-time span {
- color: #fff;
- font-size: 11px;
- line-height: 12px;
- display: block;
- float: left;
- margin: 1px 2px 0 0;
- width: auto;
-}
-/* End: Time (Current / Duration) */
-
-/* Start: Play/Pause/Stop */
-.mejs-controls .mejs-play button {
- background-position: 0 0;
-}
-
-.mejs-controls .mejs-pause button {
- background-position: 0 -16px;
-}
-
-.mejs-controls .mejs-stop button {
- background-position: -112px 0;
-}
-/* Start: Play/Pause/Stop */
-
-/* Start: Progress Bar */
-.mejs-controls div.mejs-time-rail {
- direction: ltr;
- width: 200px;
- padding-top: 5px;
-}
-
-.mejs-controls .mejs-time-rail span {
- display: block;
- position: absolute;
- width: 180px;
- height: 10px;
- -webkit-border-radius: 2px;
- -moz-border-radius: 2px;
- border-radius: 2px;
- cursor: pointer;
-}
-
-.mejs-controls .mejs-time-rail .mejs-time-total {
- margin: 5px;
- background: #333;
- background: rgba(50,50,50,0.8);
- background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(30,30,30,0.8)), to(rgba(60,60,60,0.8)));
- background: -webkit-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8));
- background: -moz-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8));
- background: -o-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8));
- background: -ms-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8));
- background: linear-gradient(rgba(30,30,30,0.8), rgba(60,60,60,0.8));
-}
-
-.mejs-controls .mejs-time-rail .mejs-time-buffering {
- width: 100%;
- background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
- background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- -webkit-background-size: 15px 15px;
- -moz-background-size: 15px 15px;
- -o-background-size: 15px 15px;
- background-size: 15px 15px;
- -webkit-animation: buffering-stripes 2s linear infinite;
- -moz-animation: buffering-stripes 2s linear infinite;
- -ms-animation: buffering-stripes 2s linear infinite;
- -o-animation: buffering-stripes 2s linear infinite;
- animation: buffering-stripes 2s linear infinite;
-}
-
-@-webkit-keyframes buffering-stripes { from {background-position: 0 0;} to {background-position: 30px 0;} }
-@-moz-keyframes buffering-stripes { from {background-position: 0 0;} to {background-position: 30px 0;} }
-@-ms-keyframes buffering-stripes { from {background-position: 0 0;} to {background-position: 30px 0;} }
-@-o-keyframes buffering-stripes { from {background-position: 0 0;} to {background-position: 30px 0;} }
-@keyframes buffering-stripes { from {background-position: 0 0;} to {background-position: 30px 0;} }
-
-.mejs-controls .mejs-time-rail .mejs-time-loaded {
- background: #3caac8;
- background: rgba(60,170,200,0.8);
- background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(44,124,145,0.8)), to(rgba(78,183,212,0.8)));
- background: -webkit-linear-gradient(top, rgba(44,124,145,0.8), rgba(78,183,212,0.8));
- background: -moz-linear-gradient(top, rgba(44,124,145,0.8), rgba(78,183,212,0.8));
- background: -o-linear-gradient(top, rgba(44,124,145,0.8), rgba(78,183,212,0.8));
- background: -ms-linear-gradient(top, rgba(44,124,145,0.8), rgba(78,183,212,0.8));
- background: linear-gradient(rgba(44,124,145,0.8), rgba(78,183,212,0.8));
- width: 0;
-}
-
-.mejs-controls .mejs-time-rail .mejs-time-current {
- background: #fff;
- background: rgba(255,255,255,0.8);
- background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(255,255,255,0.9)), to(rgba(200,200,200,0.8)));
- background: -webkit-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8));
- background: -moz-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8));
- background: -o-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8));
- background: -ms-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8));
- background: linear-gradient(rgba(255,255,255,0.9), rgba(200,200,200,0.8));
- width: 0;
-}
-
-.mejs-controls .mejs-time-rail .mejs-time-handle {
- display: none;
- position: absolute;
- margin: 0;
- width: 10px;
- background: #fff;
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
- cursor: pointer;
- border: solid 2px #333;
- top: -2px;
- text-align: center;
-}
-
-.mejs-controls .mejs-time-rail .mejs-time-float {
- position: absolute;
- display: none;
- background: #eee;
- width: 36px;
- height: 17px;
- border: solid 1px #333;
- top: -26px;
- margin-left: -18px;
- text-align: center;
- color: #111;
-}
-
-.mejs-controls .mejs-time-rail .mejs-time-float-current {
- margin: 2px;
- width: 30px;
- display: block;
- text-align: center;
- left: 0;
-}
-
-.mejs-controls .mejs-time-rail .mejs-time-float-corner {
- position: absolute;
- display: block;
- width: 0;
- height: 0;
- line-height: 0;
- border: solid 5px #eee;
- border-color: #eee transparent transparent transparent;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
- top: 15px;
- left: 13px;
-}
-
-.mejs-long-video .mejs-controls .mejs-time-rail .mejs-time-float {
- width: 48px;
-}
-
-.mejs-long-video .mejs-controls .mejs-time-rail .mejs-time-float-current {
- width: 44px;
-}
-
-.mejs-long-video .mejs-controls .mejs-time-rail .mejs-time-float-corner {
- left: 18px;
-}
-
-/*
-.mejs-controls .mejs-time-rail:hover .mejs-time-handle {
- visibility:visible;
-}
-*/
-/* End: Progress Bar */
-
-/* Start: Fullscreen */
-.mejs-controls .mejs-fullscreen-button button {
- background-position: -32px 0;
-}
-
-.mejs-controls .mejs-unfullscreen button {
- background-position: -32px -16px;
-}
-/* End: Fullscreen */
-
-
-/* Start: Mute/Volume */
-.mejs-controls .mejs-volume-button {
-}
-
-.mejs-controls .mejs-mute button {
- background-position: -16px -16px;
-}
-
-.mejs-controls .mejs-unmute button {
- background-position: -16px 0;
-}
-
-.mejs-controls .mejs-volume-button {
- position: relative;
-}
-
-.mejs-controls .mejs-volume-button .mejs-volume-slider {
- display: none;
- height: 115px;
- width: 25px;
- background: url('../img/skin/background.png');
- background: rgba(50, 50, 50, 0.7);
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
- top: -115px;
- left: 0;
- z-index: 1;
- position: absolute;
- margin: 0;
-}
-
-.mejs-controls .mejs-volume-button:hover {
- -webkit-border-radius: 0 0 4px 4px;
- -moz-border-radius: 0 0 4px 4px;
- border-radius: 0 0 4px 4px;
-}
-
-/*
-.mejs-controls .mejs-volume-button:hover .mejs-volume-slider {
- display: block;
-}
-*/
-
-.mejs-controls .mejs-volume-button .mejs-volume-slider .mejs-volume-total {
- position: absolute;
- left: 11px;
- top: 8px;
- width: 2px;
- height: 100px;
- background: #ddd;
- background: rgba(255, 255, 255, 0.5);
- margin: 0;
-}
-
-.mejs-controls .mejs-volume-button .mejs-volume-slider .mejs-volume-current {
- position: absolute;
- left: 11px;
- top: 8px;
- width: 2px;
- height: 100px;
- background: #ddd;
- background: rgba(255, 255, 255, 0.9);
- margin: 0;
-}
-
-.mejs-controls .mejs-volume-button .mejs-volume-slider .mejs-volume-handle {
- position: absolute;
- left: 4px;
- top: -3px;
- width: 16px;
- height: 6px;
- background: #ddd;
- background: rgba(255, 255, 255, 0.9);
- cursor: N-resize;
- -webkit-border-radius: 1px;
- -moz-border-radius: 1px;
- border-radius: 1px;
- margin: 0;
-}
-
-/* horizontal version */
-.mejs-controls div.mejs-horizontal-volume-slider {
- height: 26px;
- width: 60px;
- position: relative;
-}
-
-.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total {
- position: absolute;
- left: 0;
- top: 11px;
- width: 50px;
- height: 8px;
- margin: 0;
- padding: 0;
- font-size: 1px;
- -webkit-border-radius: 2px;
- -moz-border-radius: 2px;
- border-radius: 2px;
- background: #333;
- background: rgba(50,50,50,0.8);
- background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(30,30,30,0.8)), to(rgba(60,60,60,0.8)));
- background: -webkit-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8));
- background: -moz-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8));
- background: -o-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8));
- background: -ms-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8));
- background: linear-gradient(rgba(30,30,30,0.8), rgba(60,60,60,0.8));
-}
-
-.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current {
- position: absolute;
- left: 0;
- top: 11px;
- width: 50px;
- height: 8px;
- margin: 0;
- padding: 0;
- font-size: 1px;
- -webkit-border-radius: 2px;
- -moz-border-radius: 2px;
- border-radius: 2px;
- background: #fff;
- background: rgba(255,255,255,0.8);
- background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(255,255,255,0.9)), to(rgba(200,200,200,0.8)));
- background: -webkit-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8));
- background: -moz-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8));
- background: -o-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8));
- background: -ms-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8));
- background: linear-gradient(rgba(255,255,255,0.9), rgba(200,200,200,0.8));
-}
-
-.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-handle {
- display: none;
-}
-
-/* End: Mute/Volume */
-
-/* Start: Track (Captions and Chapters) */
-.mejs-controls .mejs-captions-button {
- position: relative;
-}
-
-.mejs-controls .mejs-captions-button button {
- background-position: -48px 0;
-}
-.mejs-controls .mejs-captions-button .mejs-captions-selector {
- visibility: hidden;
- position: absolute;
- bottom: 26px;
- right: -10px;
- width: 130px;
- height: 100px;
- background: url('../img/skin/background.png');
- background: rgba(50,50,50,0.7);
- border: solid 1px transparent;
- padding: 10px;
- overflow: hidden;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-/*
-.mejs-controls .mejs-captions-button:hover .mejs-captions-selector {
- visibility: visible;
-}
-*/
-
-.mejs-controls .mejs-captions-button .mejs-captions-selector ul {
- margin: 0;
- padding: 0;
- display: block;
- list-style-type: none !important;
- overflow: hidden;
-}
-
-.mejs-controls .mejs-captions-button .mejs-captions-selector ul li {
- margin: 0 0 6px 0;
- padding: 0;
- list-style-type: none !important;
- display: block;
- color: #fff;
- overflow: hidden;
-}
-
-.mejs-controls .mejs-captions-button .mejs-captions-selector ul li input {
- clear: both;
- float: left;
- margin: 3px 3px 0 5px;
-}
-
-.mejs-controls .mejs-captions-button .mejs-captions-selector ul li label {
- width: 100px;
- float: left;
- padding: 4px 0 0 0;
- line-height: 15px;
- font-family: helvetica, arial;
- font-size: 10px;
-}
-
-.mejs-controls .mejs-captions-button .mejs-captions-translations {
- font-size: 10px;
- margin: 0 0 5px 0;
-}
-
-.mejs-chapters {
- position: absolute;
- top: 0;
- left: 0;
- -xborder-right: solid 1px #fff;
- width: 10000px;
- z-index: 1;
-}
-
-.mejs-chapters .mejs-chapter {
- position: absolute;
- float: left;
- background: #222;
- background: rgba(0, 0, 0, 0.7);
- background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(50,50,50,0.7)), to(rgba(0,0,0,0.7)));
- background: -webkit-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7));
- background: -moz-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7));
- background: -o-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7));
- background: -ms-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7));
- background: linear-gradient(rgba(50,50,50,0.7), rgba(0,0,0,0.7));
- filter: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, startColorstr=#323232,endColorstr=#000000);
- overflow: hidden;
- border: 0;
-}
-
-.mejs-chapters .mejs-chapter .mejs-chapter-block {
- font-size: 11px;
- color: #fff;
- padding: 5px;
- display: block;
- border-right: solid 1px #333;
- border-bottom: solid 1px #333;
- cursor: pointer;
-}
-
-.mejs-chapters .mejs-chapter .mejs-chapter-block-last {
- border-right: none;
-}
-
-.mejs-chapters .mejs-chapter .mejs-chapter-block:hover {
- background: #666;
- background: rgba(102,102,102, 0.7);
- background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(102,102,102,0.7)), to(rgba(50,50,50,0.6)));
- background: -webkit-linear-gradient(top, rgba(102,102,102,0.7), rgba(50,50,50,0.6));
- background: -moz-linear-gradient(top, rgba(102,102,102,0.7), rgba(50,50,50,0.6));
- background: -o-linear-gradient(top, rgba(102,102,102,0.7), rgba(50,50,50,0.6));
- background: -ms-linear-gradient(top, rgba(102,102,102,0.7), rgba(50,50,50,0.6));
- background: linear-gradient(rgba(102,102,102,0.7), rgba(50,50,50,0.6));
- filter: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, startColorstr=#666666,endColorstr=#323232);
-}
-
-.mejs-chapters .mejs-chapter .mejs-chapter-block .ch-title {
- font-size: 12px;
- font-weight: bold;
- display: block;
- white-space: nowrap;
- text-overflow: ellipsis;
- margin: 0 0 3px 0;
- line-height: 12px;
-}
-
-.mejs-chapters .mejs-chapter .mejs-chapter-block .ch-timespan {
- font-size: 12px;
- line-height: 12px;
- margin: 3px 0 4px 0;
- display: block;
- white-space: nowrap;
- text-overflow: ellipsis;
-}
-
-.mejs-captions-layer {
- position: absolute;
- bottom: 0;
- left: 0;
- text-align:center;
- line-height: 22px;
- font-size: 12px;
- color: #fff;
-}
-
-.mejs-captions-layer a {
- color: #fff;
- text-decoration: underline;
-}
-
-.mejs-captions-layer[lang=ar] {
- font-size: 20px;
- font-weight: normal;
-}
-
-.mejs-captions-position {
- position: absolute;
- width: 100%;
- bottom: 15px;
- left: 0;
-}
-
-.mejs-captions-position-hover {
- bottom: 45px;
-}
-
-.mejs-captions-text {
- padding: 3px 5px;
- background: url('../img/skin/background.png');
- background: rgba(20, 20, 20, 0.8);
-
-}
-/* End: Track (Captions and Chapters) */
-
-/* Start: Error */
-.me-cannotplay {
-}
-
-.me-cannotplay a {
- color: #fff;
- font-weight: bold;
-}
-
-.me-cannotplay span {
- padding: 15px;
- display: block;
-}
-/* End: Error */
-
-
-/* Start: Loop */
-.mejs-controls .mejs-loop-off button {
- background-position: -64px -16px;
-}
-
-.mejs-controls .mejs-loop-on button {
- background-position: -64px 0;
-}
-
-/* End: Loop */
-
-/* Start: backlight */
-.mejs-controls .mejs-backlight-off button {
- background-position: -80px -16px;
-}
-
-.mejs-controls .mejs-backlight-on button {
- background-position: -80px 0;
-}
-/* End: backlight */
-
-/* Start: Picture Controls */
-.mejs-controls .mejs-picturecontrols-button {
- background-position: -96px 0;
-}
-/* End: Picture Controls */
-
-
-/* context menu */
-.mejs-contextmenu {
- position: absolute;
- width: 150px;
- padding: 10px;
- border-radius: 4px;
- top: 0;
- left: 0;
- background: #fff;
- border: solid 1px #999;
- z-index: 1001; /* make sure it shows on fullscreen */
-}
-.mejs-contextmenu .mejs-contextmenu-separator {
- height: 1px;
- font-size: 0;
- margin: 5px 6px;
- background: #333;
-}
-
-.mejs-contextmenu .mejs-contextmenu-item {
- font-family: Helvetica, Arial;
- font-size: 12px;
- padding: 4px 6px;
- cursor: pointer;
- color: #333;
-}
-.mejs-contextmenu .mejs-contextmenu-item:hover {
- background: #2C7C91;
- color: #fff;
-}
-
-/* Start: Source Chooser */
-.mejs-controls .mejs-sourcechooser-button {
- position: relative;
-}
-
-.mejs-controls .mejs-sourcechooser-button button {
- background-position: -128px 0;
-}
-
-.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector {
- visibility: hidden;
- position: absolute;
- bottom: 26px;
- right: -10px;
- width: 130px;
- height: 100px;
- background: url('../img/skin/background.png');
- background: rgba(50,50,50,0.7);
- border: solid 1px transparent;
- padding: 10px;
- overflow: hidden;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul {
- margin: 0;
- padding: 0;
- display: block;
- list-style-type: none !important;
- overflow: hidden;
-}
-
-.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul li {
- margin: 0 0 6px 0;
- padding: 0;
- list-style-type: none !important;
- display: block;
- color: #fff;
- overflow: hidden;
-}
-
-.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul li input {
- clear: both;
- float: left;
- margin: 3px 3px 0 5px;
-}
-
-.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul li label {
- width: 100px;
- float: left;
- padding: 4px 0 0 0;
- line-height: 15px;
- font-family: helvetica, arial;
- font-size: 10px;
-}
-/* End: Source Chooser */
-
-/* Start: Postroll */
-.mejs-postroll-layer {
- position: absolute;
- bottom: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background: url('../img/skin/background.png');
- background: rgba(50,50,50,0.7);
- z-index: 1000;
- overflow: hidden;
-}
-.mejs-postroll-layer-content {
- width: 100%;
- height: 100%;
-}
-.mejs-postroll-close {
- position: absolute;
- right: 0;
- top: 0;
- background: url('../img/skin/background.png');
- background: rgba(50,50,50,0.7);
- color: #fff;
- padding: 4px;
- z-index: 100;
- cursor: pointer;
-}
-/* End: Postroll */
diff --git a/files_videoviewer/css/style.css b/files_videoviewer/css/style.css
deleted file mode 100644
index fbaa10ab7..000000000
--- a/files_videoviewer/css/style.css
+++ /dev/null
@@ -1,31 +0,0 @@
-#videoviewer_overlay{
- position:fixed;
- top:0px;bottom:0px;left:0px;right:0px;
- z-index:100;
- background-color:#777;
- background-color:rgba(119,119,119, .7);
- }
-
-#videoviewer_popup{
- position:fixed;
- left:50%;top:50%;
- z-index:101;
-}
-
-#videoviewer_container{
- position:relative;
- left:-50%;
- margin-top:-40%;
- padding:10px 10px 25px;
- color:#4d4d4d;
- background:#fff;
- box-shadow: 0 0 20px #111;
-}
-
-a.box-close{
- position:absolute;
- top:-15px;right:-15px;
- width:30px;height:30px;
- cursor:pointer;
- background:url('../img/close.png') no-repeat 0 0;
-}
diff --git a/files_videoviewer/img/app.png b/files_videoviewer/img/app.png
deleted file mode 100644
index f84e9055c..000000000
--- a/files_videoviewer/img/app.png
+++ /dev/null
Binary files differ
diff --git a/files_videoviewer/img/app.svg b/files_videoviewer/img/app.svg
deleted file mode 100644
index 38bc6f618..000000000
--- a/files_videoviewer/img/app.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="32" width="32" version="1.0" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
- <path d="m5 2c-2.216 0-4 1.784-4 4v20c0 2.216 1.784 4 4 4h22c2.216 0 4-1.784 4-4v-20c0-2.216-1.784-4-4-4h-22zm5 6 16 8-16 8v-16z" fill="#FFF"/>
- <path opacity=".1" d="m5 3c-2.216 0-4 1.784-4 4v20c0 2.216 1.784 4 4 4h22c2.216 0 4-1.784 4-4v-20c0-2.216-1.784-4-4-4h-22zm5 6 16 8-16 8v-16z" fill="#FFF"/>
-</svg>
diff --git a/files_videoviewer/img/close.png b/files_videoviewer/img/close.png
deleted file mode 100644
index 9c4275cca..000000000
--- a/files_videoviewer/img/close.png
+++ /dev/null
Binary files differ
diff --git a/files_videoviewer/img/skin/background.png b/files_videoviewer/img/skin/background.png
deleted file mode 100644
index 7a4da4ec0..000000000
--- a/files_videoviewer/img/skin/background.png
+++ /dev/null
Binary files differ
diff --git a/files_videoviewer/img/skin/bigplay.png b/files_videoviewer/img/skin/bigplay.png
deleted file mode 100644
index be190caf6..000000000
--- a/files_videoviewer/img/skin/bigplay.png
+++ /dev/null
Binary files differ
diff --git a/files_videoviewer/img/skin/bigplay.svg b/files_videoviewer/img/skin/bigplay.svg
deleted file mode 100644
index 7e07babdd..000000000
--- a/files_videoviewer/img/skin/bigplay.svg
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'>
-<svg style="background-color:#ffffff00" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" height="200px" width="100px" version="1.1" y="0px" x="0px" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 100 200">
- <defs>
- <radialGradient id="b">
- <stop stop-color="#222" stop-opacity="0" offset=".7"/>
- <stop stop-color="#222" stop-opacity=".0118" offset=".70202"/>
- <stop stop-color="#333" offset=".85"/>
- <stop stop-color="#333" stop-opacity="0" offset="1"/>
- </radialGradient>
- <radialGradient id="a">
- <stop stop-color="#bbb" stop-opacity="0" offset=".7"/>
- <stop stop-color="#bbb" stop-opacity=".0118" offset=".70202"/>
- <stop stop-color="#bbb" offset=".85"/>
- <stop stop-color="#bbb" stop-opacity="0" offset="1"/>
- </radialGradient>
- <filter id="d" y="-100%" x="-100%" height="300%" width="300%">
- <feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.251 0" type="matrix" result="out" in="SourceGraphic"/>
- <feMorphology operator="dilate" radius="3" result="out" in="out"/>
- <feGaussianBlur stdDeviation="1.5" result="out" in="out"/>
- <feBlend result="Glow1" mode="normal" in2="out" in="SourceGraphic"/>
- </filter>
- <filter id="c" y="-100%" x="-100%" height="300%" width="300%">
- <feColorMatrix values="0 0 0 0.8667 0 0 0 0 0.8667 0 0 0 0 0.8667 0 0 0 0 0.251 0" type="matrix" result="out" in="SourceGraphic"/>
- <feMorphology operator="dilate" radius="3" result="out" in="out"/>
- <feGaussianBlur stdDeviation="1.5" result="out" in="out"/>
- <feBlend result="Glow2" mode="normal" in2="out" in="SourceGraphic"/>
- </filter>
- </defs>
- <path d="m22 50c0-15.464 12.536-28 28-28s28 12.536 28 28-12.536 28-28 28-28-12.536-28-28zm-17 0c0 24.853 20.147 45 45 45s45-20.147 45-45-20.147-45-45-45-45 20.147-45 45z" fill="url(#b)"/>
- <path d="m22 150c0-15.46 12.536-28 28-28s28 12.54 28 28-12.536 28-28 28-28-12.54-28-28zm-17 0c0 24.85 20.147 45 45 45s45-20.15 45-45-20.147-45-45-45-45 20.15-45 45z" fill="url(#a)"/>
- <path filter="url(#d)" fill="#fff" d="m72.5 49.5l-33.75 19.486v-38.972l33.75 19.486z"/>
- <path stroke="#fff" stroke-width="5" fill="none" d="m13 50.5c0-20.711 16.789-37.5 37.5-37.5s37.5 16.789 37.5 37.5-16.789 37.5-37.5 37.5-37.5-16.789-37.5-37.5z"/>
- <path filter="url(#c)" fill="#fff" d="m72.5 149.5l-33.75 19.49v-38.98l33.75 19.49z"/>
- <path stroke="#fff" stroke-width="5" fill="none" d="m13 150.5c0-20.71 16.789-37.5 37.5-37.5s37.5 16.79 37.5 37.5-16.789 37.5-37.5 37.5-37.5-16.79-37.5-37.5z"/>
-</svg>
diff --git a/files_videoviewer/img/skin/controls-ted.png b/files_videoviewer/img/skin/controls-ted.png
deleted file mode 100644
index 3aac05aa8..000000000
--- a/files_videoviewer/img/skin/controls-ted.png
+++ /dev/null
Binary files differ
diff --git a/files_videoviewer/img/skin/controls-wmp-bg.png b/files_videoviewer/img/skin/controls-wmp-bg.png
deleted file mode 100644
index 89bb9b956..000000000
--- a/files_videoviewer/img/skin/controls-wmp-bg.png
+++ /dev/null
Binary files differ
diff --git a/files_videoviewer/img/skin/controls-wmp.png b/files_videoviewer/img/skin/controls-wmp.png
deleted file mode 100644
index 4775ef5b0..000000000
--- a/files_videoviewer/img/skin/controls-wmp.png
+++ /dev/null
Binary files differ
diff --git a/files_videoviewer/img/skin/controls.png b/files_videoviewer/img/skin/controls.png
deleted file mode 100644
index dfac76410..000000000
--- a/files_videoviewer/img/skin/controls.png
+++ /dev/null
Binary files differ
diff --git a/files_videoviewer/img/skin/controls.svg b/files_videoviewer/img/skin/controls.svg
deleted file mode 100644
index 4b93d8f9e..000000000
--- a/files_videoviewer/img/skin/controls.svg
+++ /dev/null
@@ -1,98 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'>
-<svg style="background-color:#ffffff00" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" height="32px" width="144px" version="1.1" y="0px" x="0px" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 144 32">
- <defs>
- <radialGradient id="l">
- <stop stop-color="#fff" offset="0"/>
- <stop stop-color="#f2f2f2" stop-opacity=".2" offset="1"/>
- </radialGradient>
- <linearGradient id="f" y1="-7.8652%" x2="50%" x1="50%" y2="249.66%">
- <stop stop-color="#fff" offset="0"/>
- <stop stop-color="#c8c8c8" offset="1"/>
- </linearGradient>
- <linearGradient id="b" x2="50%" x1="50%" y2="238.75%">
- <stop stop-color="#fff" offset="0"/>
- <stop stop-color="#c8c8c8" offset="1"/>
- </linearGradient>
- <linearGradient id="a" x2="50%" x1="50%" y2="100%">
- <stop stop-color="#fff" offset="0"/>
- <stop stop-color="#c8c8c8" offset="1"/>
- </linearGradient>
- <linearGradient id="c" y1="-33.333%" x2="50%" x1="50%" y2="152.08%">
- <stop stop-color="#fff" offset="0"/>
- <stop stop-color="#c8c8c8" offset="1"/>
- </linearGradient>
- <linearGradient id="k" y1="-140%" x2="40%" x1="40%" y2="98.75%">
- <stop stop-color="#fff" offset="0"/>
- <stop stop-color="#c8c8c8" offset="1"/>
- </linearGradient>
- <linearGradient id="j" y1="-140%" x2="60%" x1="60%" y2="98.75%">
- <stop stop-color="#fff" offset="0"/>
- <stop stop-color="#c8c8c8" offset="1"/>
- </linearGradient>
- <linearGradient id="i" x2="50%" x1="50%" y2="298.44%">
- <stop stop-color="#fff" offset="0"/>
- <stop stop-color="#c8c8c8" offset="1"/>
- </linearGradient>
- <linearGradient id="h" y1="-200%" x2="50%" x1="50%" y2="100%">
- <stop stop-color="#fff" offset="0"/>
- <stop stop-color="#c8c8c8" offset="1"/>
- </linearGradient>
- <linearGradient id="g" y1="-200%" x2="50%" x1="50%" y2="110.94%">
- <stop stop-color="#fff" offset="0"/>
- <stop stop-color="#c8c8c8" offset="1"/>
- </linearGradient>
- <linearGradient id="e" x2="55%" x1="55%" y2="100%">
- <stop stop-color="#fff" offset="0"/>
- <stop stop-color="#c8c8c8" offset="1"/>
- </linearGradient>
- <linearGradient id="d" x2="50%" x1="50%" y2="100%">
- <stop stop-color="#fff" offset="0"/>
- <stop stop-color="#c8c8c8" offset=".99444"/>
- </linearGradient>
- </defs>
- <g stroke="#fff" fill="none">
- <path d="m98.5 7.5h11"/>
- <path d="m98.5 3.5h11"/>
- <path d="m98.5 11.5h11"/></g><g fill="#fff">
- <path d="m108 11.5c0-0.828 0.45-1.5 1-1.5s1 0.672 1 1.5-0.45 1.5-1 1.5-1-0.672-1-1.5z"/>
- <path d="m104 7.5c0-0.8284 0.45-1.5 1-1.5s1 0.6716 1 1.5-0.45 1.5-1 1.5-1-0.6716-1-1.5z"/>
- <path d="m108 3.5c0-0.8284 0.45-1.5 1-1.5s1 0.6716 1 1.5-0.45 1.5-1 1.5-1-0.6716-1-1.5z"/>
- </g>
- <rect height="6" width="10" stroke="#fff" y="21" x="83" fill="#333"/>
- <path fill="url(#l)" d="m81 8c0-2.7615 3.134-5 7-5s7 2.2385 7 5c0 2.762-3.134 5-7 5s-7-2.238-7-5z"/>
- <rect height="6" width="10" stroke="#fff" y="5" x="83" fill="#333"/>
- <path d="m73.795 4.205c1.421 0.6735 2.405 2.1184 2.405 3.795 0 2.32-1.88 4.2-4.2 4.2s-4.2-1.88-4.2-4.2c0-1.6766 0.984-3.1215 2.405-3.795l-1.33-1.33c-1.725 1.0539-2.875 2.9556-2.875 5.125 0 3.314 2.686 6 6 6s6-2.686 6-6c0-2.1694-1.15-4.0711-2.875-5.125l-1.33 1.33z" fill="url(#f)"/>
- <path d="m71 2h-5l5 5v-5z" fill="url(#b)"/>
- <g fill="#a8a8b7">
- <path d="m73.795 20.205c1.421 0.673 2.405 2.118 2.405 3.795 0 2.32-1.88 4.2-4.2 4.2s-4.2-1.88-4.2-4.2c0-1.677 0.984-3.122 2.405-3.795l-1.33-1.33c-1.725 1.054-2.875 2.956-2.875 5.125 0 3.314 2.686 6 6 6s6-2.686 6-6c0-2.169-1.15-4.071-2.875-5.125l-1.33 1.33z"/>
- <path d="m71 18h-5l5 5v-5z"/>
- </g>
- <rect visibility="hidden" height="12" width="14" stroke="#b0b0b0" y="2" x="49" fill="none"/>
- <text style="color:#ffffff;text-align:center" font-size="10px" visibility="hidden" width="14" y="17" x="49" font-family="Arial" fill="#ffffff"><tspan><![CDATA[cc]]></tspan></text>
- <path stroke="#fff" d="m55 7c-4.719-3.2187-4.937 5.94 0 3" fill="none"/>
- <path stroke="#fff" d="m60 7c-4.719-3.2187-4.937 5.94 0 3" fill="none"/>
- <path d="m50 3h12v10h-12v-10zm-1-1v12h14v-12h-14z" fill="url(#a)"/>
- <rect y="2" x="49" height="12" fill="none" width="14"/>
- <rect y="5" x="17" height="6" fill="url(#c)" width="5"/>
- <path d="m21 5l4-3v12l-4-2.938v-6.062z" fill="url(#a)"/>
- <rect y="21" x="17" height="6" fill="url(#c)" width="5"/>
- <path d="m21 21l4-3v12l-4-2.938v-6.062z" fill="url(#a)"/>
- <path stroke="#fff" d="m27 18s3.062-0.625 3 6-3 6-3 6" fill="none"/>
- <path stroke="#fff" d="m26 21.008s2.041-0.312 1.999 2.992c-0.041 3.304-1.999 2.992-1.999 2.992" fill="none"/>
- <path fill="url(#a)" d="m14 8.5l-11 5.5v-11l11 5.5z"/>
- <g fill="url(#a)">
- <rect y="18" x="3" height="12" width="3"/>
- <rect y="18" x="10" height="12" width="3"/>
- </g>
- <path d="m34 2h5l-5 5v-5z" fill="url(#b)"/>
- <path d="m34 14h5l-5-5v5z" fill="url(#k)"/>
- <path d="m46 2h-5l5 5v-5z" fill="url(#b)"/>
- <path d="m46 14h-5l5-5v5z" fill="url(#j)"/>
- <path d="m42 22h4l-4-4v4z" fill="url(#i)"/>
- <path d="m38 22v-4l-4 4h4z" fill="url(#b)"/>
- <path d="m38 26h-4l4 4v-4z" fill="url(#h)"/>
- <path d="m42 26v4l4-4h-4z" fill="url(#g)"/>
- <rect y="3" x="115" height="10" fill="url(#e)" width="10"/>
- <path d="m135.23 6.1522c1.03-0.4227 2.2 0.0619 2.62 1.0824s-0.06 2.1904-1.08 2.6132c-1.03 0.4222-2.2-0.0619-2.62-1.0824s0.06-2.1905 1.08-2.6132zm-1.96-4.7346l2.73 2.5878 2.73-2.5878 0.09 3.7578 3.76 0.0981-2.59 2.7265 2.59 2.726-3.76 0.099-0.09 3.757-2.73-2.587-2.73 2.587-0.09-3.757-3.76-0.099 2.59-2.726-2.59-2.7265 3.76-0.0981 0.09-3.7578z" fill="url(#d)"/>
-</svg>
diff --git a/files_videoviewer/img/skin/loading.gif b/files_videoviewer/img/skin/loading.gif
deleted file mode 100644
index 612222be5..000000000
--- a/files_videoviewer/img/skin/loading.gif
+++ /dev/null
Binary files differ
diff --git a/files_videoviewer/js/flashmediaelement.swf b/files_videoviewer/js/flashmediaelement.swf
deleted file mode 100755
index 8f02fd278..000000000
--- a/files_videoviewer/js/flashmediaelement.swf
+++ /dev/null
Binary files differ
diff --git a/files_videoviewer/js/mediaelement-and-player.js b/files_videoviewer/js/mediaelement-and-player.js
deleted file mode 100755
index 9ef957563..000000000
--- a/files_videoviewer/js/mediaelement-and-player.js
+++ /dev/null
@@ -1,5800 +0,0 @@
-/*!
- *
- * MediaElement.js
- * HTML5 <video> and <audio> shim and player
- * http://mediaelementjs.com/
- *
- * Creates a JavaScript object that mimics HTML5 MediaElement API
- * for browsers that don't understand HTML5 or can't play the provided codec
- * Can play MP4 (H.264), Ogg, WebM, FLV, WMV, WMA, ACC, and MP3
- *
- * Copyright 2010-2014, John Dyer (http://j.hn)
- * License: MIT
- *
- */
-// Namespace
-var mejs = mejs || {};
-
-// version number
-mejs.version = '2.21.2';
-
-
-// player number (for missing, same id attr)
-mejs.meIndex = 0;
-
-// media types accepted by plugins
-mejs.plugins = {
- silverlight: [
- {version: [3,0], types: ['video/mp4','video/m4v','video/mov','video/wmv','audio/wma','audio/m4a','audio/mp3','audio/wav','audio/mpeg']}
- ],
- flash: [
- {version: [9,0,124], types: ['video/mp4','video/m4v','video/mov','video/flv','video/rtmp','video/x-flv','audio/flv','audio/x-flv','audio/mp3','audio/m4a','audio/mpeg', 'video/dailymotion', 'video/x-dailymotion', 'application/x-mpegURL']}
- // 'video/youtube', 'video/x-youtube',
- // ,{version: [12,0], types: ['video/webm']} // for future reference (hopefully!)
- ],
- youtube: [
- {version: null, types: ['video/youtube', 'video/x-youtube', 'audio/youtube', 'audio/x-youtube']}
- ],
- vimeo: [
- {version: null, types: ['video/vimeo', 'video/x-vimeo']}
- ]
-};
-
-/*
-Utility methods
-*/
-mejs.Utility = {
- encodeUrl: function(url) {
- return encodeURIComponent(url); //.replace(/\?/gi,'%3F').replace(/=/gi,'%3D').replace(/&/gi,'%26');
- },
- escapeHTML: function(s) {
- return s.toString().split('&').join('&amp;').split('<').join('&lt;').split('"').join('&quot;');
- },
- absolutizeUrl: function(url) {
- var el = document.createElement('div');
- el.innerHTML = '<a href="' + this.escapeHTML(url) + '">x</a>';
- return el.firstChild.href;
- },
- getScriptPath: function(scriptNames) {
- var
- i = 0,
- j,
- codePath = '',
- testname = '',
- slashPos,
- filenamePos,
- scriptUrl,
- scriptPath,
- scriptFilename,
- scripts = document.getElementsByTagName('script'),
- il = scripts.length,
- jl = scriptNames.length;
-
- // go through all <script> tags
- for (; i < il; i++) {
- scriptUrl = scripts[i].src;
- slashPos = scriptUrl.lastIndexOf('/');
- if (slashPos > -1) {
- scriptFilename = scriptUrl.substring(slashPos + 1);
- scriptPath = scriptUrl.substring(0, slashPos + 1);
- } else {
- scriptFilename = scriptUrl;
- scriptPath = '';
- }
-
- // see if any <script> tags have a file name that matches the
- for (j = 0; j < jl; j++) {
- testname = scriptNames[j];
- filenamePos = scriptFilename.indexOf(testname);
- if (filenamePos > -1) {
- codePath = scriptPath;
- break;
- }
- }
-
- // if we found a path, then break and return it
- if (codePath !== '') {
- break;
- }
- }
-
- // send the best path back
- return codePath;
- },
- /*
- * Calculate the time format to use. We have a default format set in the
- * options but it can be imcomplete. We ajust it according to the media
- * duration.
- *
- * We support format like 'hh:mm:ss:ff'.
- */
- calculateTimeFormat: function(time, options, fps) {
- if (time < 0) {
- time = 0;
- }
-
- if(typeof fps == 'undefined') {
- fps = 25;
- }
-
- var format = options.timeFormat,
- firstChar = format[0],
- firstTwoPlaces = (format[1] == format[0]),
- separatorIndex = firstTwoPlaces? 2: 1,
- separator = ':',
- hours = Math.floor(time / 3600) % 24,
- minutes = Math.floor(time / 60) % 60,
- seconds = Math.floor(time % 60),
- frames = Math.floor(((time % 1)*fps).toFixed(3)),
- lis = [
- [frames, 'f'],
- [seconds, 's'],
- [minutes, 'm'],
- [hours, 'h']
- ];
-
- // Try to get the separator from the format
- if (format.length < separatorIndex) {
- separator = format[separatorIndex];
- }
-
- var required = false;
-
- for (var i=0, len=lis.length; i < len; i++) {
- if (format.indexOf(lis[i][1]) !== -1) {
- required=true;
- }
- else if (required) {
- var hasNextValue = false;
- for (var j=i; j < len; j++) {
- if (lis[j][0] > 0) {
- hasNextValue = true;
- break;
- }
- }
-
- if (! hasNextValue) {
- break;
- }
-
- if (!firstTwoPlaces) {
- format = firstChar + format;
- }
- format = lis[i][1] + separator + format;
- if (firstTwoPlaces) {
- format = lis[i][1] + format;
- }
- firstChar = lis[i][1];
- }
- }
- options.currentTimeFormat = format;
- },
- /*
- * Prefix the given number by zero if it is lower than 10.
- */
- twoDigitsString: function(n) {
- if (n < 10) {
- return '0' + n;
- }
- return String(n);
- },
- secondsToTimeCode: function(time, options) {
- if (time < 0) {
- time = 0;
- }
-
- // Maintain backward compatibility with method signature before v2.18.
- if (typeof options !== 'object') {
- var format = 'm:ss';
- format = arguments[1] ? 'hh:mm:ss' : format; // forceHours
- format = arguments[2] ? format + ':ff' : format; // showFrameCount
-
- options = {
- currentTimeFormat: format,
- framesPerSecond: arguments[3] || 25
- };
- }
-
- var fps = options.framesPerSecond;
- if(typeof fps === 'undefined') {
- fps = 25;
- }
-
- var format = options.currentTimeFormat,
- hours = Math.floor(time / 3600) % 24,
- minutes = Math.floor(time / 60) % 60,
- seconds = Math.floor(time % 60),
- frames = Math.floor(((time % 1)*fps).toFixed(3));
- lis = [
- [frames, 'f'],
- [seconds, 's'],
- [minutes, 'm'],
- [hours, 'h']
- ];
-
- var res = format;
- for (i=0,len=lis.length; i < len; i++) {
- res = res.replace(lis[i][1]+lis[i][1], this.twoDigitsString(lis[i][0]));
- res = res.replace(lis[i][1], lis[i][0]);
- }
- return res;
- },
-
- timeCodeToSeconds: function(hh_mm_ss_ff, forceHours, showFrameCount, fps){
- if (typeof showFrameCount == 'undefined') {
- showFrameCount=false;
- } else if(typeof fps == 'undefined') {
- fps = 25;
- }
-
- var tc_array = hh_mm_ss_ff.split(":"),
- tc_hh = parseInt(tc_array[0], 10),
- tc_mm = parseInt(tc_array[1], 10),
- tc_ss = parseInt(tc_array[2], 10),
- tc_ff = 0,
- tc_in_seconds = 0;
-
- if (showFrameCount) {
- tc_ff = parseInt(tc_array[3])/fps;
- }
-
- tc_in_seconds = ( tc_hh * 3600 ) + ( tc_mm * 60 ) + tc_ss + tc_ff;
-
- return tc_in_seconds;
- },
-
-
- convertSMPTEtoSeconds: function (SMPTE) {
- if (typeof SMPTE != 'string')
- return false;
-
- SMPTE = SMPTE.replace(',', '.');
-
- var secs = 0,
- decimalLen = (SMPTE.indexOf('.') != -1) ? SMPTE.split('.')[1].length : 0,
- multiplier = 1;
-
- SMPTE = SMPTE.split(':').reverse();
-
- for (var i = 0; i < SMPTE.length; i++) {
- multiplier = 1;
- if (i > 0) {
- multiplier = Math.pow(60, i);
- }
- secs += Number(SMPTE[i]) * multiplier;
- }
- return Number(secs.toFixed(decimalLen));
- },
-
- /* borrowed from SWFObject: http://code.google.com/p/swfobject/source/browse/trunk/swfobject/src/swfobject.js#474 */
- removeSwf: function(id) {
- var obj = document.getElementById(id);
- if (obj && /object|embed/i.test(obj.nodeName)) {
- if (mejs.MediaFeatures.isIE) {
- obj.style.display = "none";
- (function(){
- if (obj.readyState == 4) {
- mejs.Utility.removeObjectInIE(id);
- } else {
- setTimeout(arguments.callee, 10);
- }
- })();
- } else {
- obj.parentNode.removeChild(obj);
- }
- }
- },
- removeObjectInIE: function(id) {
- var obj = document.getElementById(id);
- if (obj) {
- for (var i in obj) {
- if (typeof obj[i] == "function") {
- obj[i] = null;
- }
- }
- obj.parentNode.removeChild(obj);
- }
- },
- determineScheme: function(url) {
- if (url && url.indexOf("://") != -1) {
- return url.substr(0, url.indexOf("://")+3);
- }
- return "//"; // let user agent figure this out
- }
-};
-
-
-// Core detector, plugins are added below
-mejs.PluginDetector = {
-
- // main public function to test a plug version number PluginDetector.hasPluginVersion('flash',[9,0,125]);
- hasPluginVersion: function(plugin, v) {
- var pv = this.plugins[plugin];
- v[1] = v[1] || 0;
- v[2] = v[2] || 0;
- return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;
- },
-
- // cached values
- nav: window.navigator,
- ua: window.navigator.userAgent.toLowerCase(),
-
- // stored version numbers
- plugins: [],
-
- // runs detectPlugin() and stores the version number
- addPlugin: function(p, pluginName, mimeType, activeX, axDetect) {
- this.plugins[p] = this.detectPlugin(pluginName, mimeType, activeX, axDetect);
- },
-
- // get the version number from the mimetype (all but IE) or ActiveX (IE)
- detectPlugin: function(pluginName, mimeType, activeX, axDetect) {
-
- var version = [0,0,0],
- description,
- i,
- ax;
-
- // Firefox, Webkit, Opera
- if (typeof(this.nav.plugins) != 'undefined' && typeof this.nav.plugins[pluginName] == 'object') {
- description = this.nav.plugins[pluginName].description;
- if (description && !(typeof this.nav.mimeTypes != 'undefined' && this.nav.mimeTypes[mimeType] && !this.nav.mimeTypes[mimeType].enabledPlugin)) {
- version = description.replace(pluginName, '').replace(/^\s+/,'').replace(/\sr/gi,'.').split('.');
- for (i=0; i<version.length; i++) {
- version[i] = parseInt(version[i].match(/\d+/), 10);
- }
- }
- // Internet Explorer / ActiveX
- } else if (typeof(window.ActiveXObject) != 'undefined') {
- try {
- ax = new ActiveXObject(activeX);
- if (ax) {
- version = axDetect(ax);
- }
- }
- catch (e) { }
- }
- return version;
- }
-};
-
-// Add Flash detection
-mejs.PluginDetector.addPlugin('flash','Shockwave Flash','application/x-shockwave-flash','ShockwaveFlash.ShockwaveFlash', function(ax) {
- // adapted from SWFObject
- var version = [],
- d = ax.GetVariable("$version");
- if (d) {
- d = d.split(" ")[1].split(",");
- version = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
- }
- return version;
-});
-
-// Add Silverlight detection
-mejs.PluginDetector.addPlugin('silverlight','Silverlight Plug-In','application/x-silverlight-2','AgControl.AgControl', function (ax) {
- // Silverlight cannot report its version number to IE
- // but it does have a isVersionSupported function, so we have to loop through it to get a version number.
- // adapted from http://www.silverlightversion.com/
- var v = [0,0,0,0],
- loopMatch = function(ax, v, i, n) {
- while(ax.isVersionSupported(v[0]+ "."+ v[1] + "." + v[2] + "." + v[3])){
- v[i]+=n;
- }
- v[i] -= n;
- };
- loopMatch(ax, v, 0, 1);
- loopMatch(ax, v, 1, 1);
- loopMatch(ax, v, 2, 10000); // the third place in the version number is usually 5 digits (4.0.xxxxx)
- loopMatch(ax, v, 2, 1000);
- loopMatch(ax, v, 2, 100);
- loopMatch(ax, v, 2, 10);
- loopMatch(ax, v, 2, 1);
- loopMatch(ax, v, 3, 1);
-
- return v;
-});
-// add adobe acrobat
-/*
-PluginDetector.addPlugin('acrobat','Adobe Acrobat','application/pdf','AcroPDF.PDF', function (ax) {
- var version = [],
- d = ax.GetVersions().split(',')[0].split('=')[1].split('.');
-
- if (d) {
- version = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
- }
- return version;
-});
-*/
-// necessary detection (fixes for <IE9)
-mejs.MediaFeatures = {
- init: function() {
- var
- t = this,
- d = document,
- nav = mejs.PluginDetector.nav,
- ua = mejs.PluginDetector.ua.toLowerCase(),
- i,
- v,
- html5Elements = ['source','track','audio','video'];
-
- // detect browsers (only the ones that have some kind of quirk we need to work around)
- t.isiPad = (ua.match(/ipad/i) !== null);
- t.isiPhone = (ua.match(/iphone/i) !== null);
- t.isiOS = t.isiPhone || t.isiPad;
- t.isAndroid = (ua.match(/android/i) !== null);
- t.isBustedAndroid = (ua.match(/android 2\.[12]/) !== null);
- t.isBustedNativeHTTPS = (location.protocol === 'https:' && (ua.match(/android [12]\./) !== null || ua.match(/macintosh.* version.* safari/) !== null));
- t.isIE = (nav.appName.toLowerCase().indexOf("microsoft") != -1 || nav.appName.toLowerCase().match(/trident/gi) !== null);
- t.isChrome = (ua.match(/chrome/gi) !== null);
- t.isChromium = (ua.match(/chromium/gi) !== null);
- t.isFirefox = (ua.match(/firefox/gi) !== null);
- t.isWebkit = (ua.match(/webkit/gi) !== null);
- t.isGecko = (ua.match(/gecko/gi) !== null) && !t.isWebkit && !t.isIE;
- t.isOpera = (ua.match(/opera/gi) !== null);
- t.hasTouch = ('ontouchstart' in window); // && window.ontouchstart != null); // this breaks iOS 7
-
- // Borrowed from `Modernizr.svgasimg`, sources:
- // - https://github.com/Modernizr/Modernizr/issues/687
- // - https://github.com/Modernizr/Modernizr/pull/1209/files
- t.svgAsImg = !!document.implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#Image', '1.1');
-
- // create HTML5 media elements for IE before 9, get a <video> element for fullscreen detection
- for (i=0; i<html5Elements.length; i++) {
- v = document.createElement(html5Elements[i]);
- }
-
- t.supportsMediaTag = (typeof v.canPlayType !== 'undefined' || t.isBustedAndroid);
-
- // Fix for IE9 on Windows 7N / Windows 7KN (Media Player not installer)
- try{
- v.canPlayType("video/mp4");
- }catch(e){
- t.supportsMediaTag = false;
- }
-
- t.supportsPointerEvents = (function() {
- // TAKEN FROM MODERNIZR
- var element = document.createElement('x'),
- documentElement = document.documentElement,
- getComputedStyle = window.getComputedStyle,
- supports;
- if(!('pointerEvents' in element.style)){
- return false;
- }
- element.style.pointerEvents = 'auto';
- element.style.pointerEvents = 'x';
- documentElement.appendChild(element);
- supports = getComputedStyle &&
- getComputedStyle(element, '').pointerEvents === 'auto';
- documentElement.removeChild(element);
- return !!supports;
- })();
-
-
- // Older versions of Firefox can't move plugins around without it resetting,
- t.hasFirefoxPluginMovingProblem = false;
-
- // detect native JavaScript fullscreen (Safari/Firefox only, Chrome still fails)
-
- // iOS
- t.hasiOSFullScreen = (typeof v.webkitEnterFullscreen !== 'undefined');
-
- // W3C
- t.hasNativeFullscreen = (typeof v.requestFullscreen !== 'undefined');
-
- // webkit/firefox/IE11+
- t.hasWebkitNativeFullScreen = (typeof v.webkitRequestFullScreen !== 'undefined');
- t.hasMozNativeFullScreen = (typeof v.mozRequestFullScreen !== 'undefined');
- t.hasMsNativeFullScreen = (typeof v.msRequestFullscreen !== 'undefined');
-
- t.hasTrueNativeFullScreen = (t.hasWebkitNativeFullScreen || t.hasMozNativeFullScreen || t.hasMsNativeFullScreen);
- t.nativeFullScreenEnabled = t.hasTrueNativeFullScreen;
-
- // Enabled?
- if (t.hasMozNativeFullScreen) {
- t.nativeFullScreenEnabled = document.mozFullScreenEnabled;
- } else if (t.hasMsNativeFullScreen) {
- t.nativeFullScreenEnabled = document.msFullscreenEnabled;
- }
-
- if (t.isChrome) {
- t.hasiOSFullScreen = false;
- }
-
- if (t.hasTrueNativeFullScreen) {
-
- t.fullScreenEventName = '';
- if (t.hasWebkitNativeFullScreen) {
- t.fullScreenEventName = 'webkitfullscreenchange';
-
- } else if (t.hasMozNativeFullScreen) {
- t.fullScreenEventName = 'mozfullscreenchange';
-
- } else if (t.hasMsNativeFullScreen) {
- t.fullScreenEventName = 'MSFullscreenChange';
- }
-
- t.isFullScreen = function() {
- if (t.hasMozNativeFullScreen) {
- return d.mozFullScreen;
-
- } else if (t.hasWebkitNativeFullScreen) {
- return d.webkitIsFullScreen;
-
- } else if (t.hasMsNativeFullScreen) {
- return d.msFullscreenElement !== null;
- }
- }
-
- t.requestFullScreen = function(el) {
-
- if (t.hasWebkitNativeFullScreen) {
- el.webkitRequestFullScreen();
-
- } else if (t.hasMozNativeFullScreen) {
- el.mozRequestFullScreen();
-
- } else if (t.hasMsNativeFullScreen) {
- el.msRequestFullscreen();
-
- }
- }
-
- t.cancelFullScreen = function() {
- if (t.hasWebkitNativeFullScreen) {
- document.webkitCancelFullScreen();
-
- } else if (t.hasMozNativeFullScreen) {
- document.mozCancelFullScreen();
-
- } else if (t.hasMsNativeFullScreen) {
- document.msExitFullscreen();
-
- }
- }
-
- }
-
-
- // OS X 10.5 can't do this even if it says it can :(
- if (t.hasiOSFullScreen && ua.match(/mac os x 10_5/i)) {
- t.hasNativeFullScreen = false;
- t.hasiOSFullScreen = false;
- }
-
- }
-};
-mejs.MediaFeatures.init();
-
-/*
-extension methods to <video> or <audio> object to bring it into parity with PluginMediaElement (see below)
-*/
-mejs.HtmlMediaElement = {
- pluginType: 'native',
- isFullScreen: false,
-
- setCurrentTime: function (time) {
- this.currentTime = time;
- },
-
- setMuted: function (muted) {
- this.muted = muted;
- },
-
- setVolume: function (volume) {
- this.volume = volume;
- },
-
- // for parity with the plugin versions
- stop: function () {
- this.pause();
- },
-
- // This can be a url string
- // or an array [{src:'file.mp4',type:'video/mp4'},{src:'file.webm',type:'video/webm'}]
- setSrc: function (url) {
-
- // Fix for IE9 which can't set .src when there are <source> elements. Awesome, right?
- var
- existingSources = this.getElementsByTagName('source');
- while (existingSources.length > 0){
- this.removeChild(existingSources[0]);
- }
-
- if (typeof url == 'string') {
- this.src = url;
- } else {
- var i, media;
-
- for (i=0; i<url.length; i++) {
- media = url[i];
- if (this.canPlayType(media.type)) {
- this.src = media.src;
- break;
- }
- }
- }
- },
-
- setVideoSize: function (width, height) {
- this.width = width;
- this.height = height;
- }
-};
-
-/*
-Mimics the <video/audio> element by calling Flash's External Interface or Silverlights [ScriptableMember]
-*/
-mejs.PluginMediaElement = function (pluginid, pluginType, mediaUrl) {
- this.id = pluginid;
- this.pluginType = pluginType;
- this.src = mediaUrl;
- this.events = {};
- this.attributes = {};
-};
-
-// JavaScript values and ExternalInterface methods that match HTML5 video properties methods
-// http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/fl/video/FLVPlayback.html
-// http://www.whatwg.org/specs/web-apps/current-work/multipage/video.html
-mejs.PluginMediaElement.prototype = {
-
- // special
- pluginElement: null,
- pluginType: '',
- isFullScreen: false,
-
- // not implemented :(
- playbackRate: -1,
- defaultPlaybackRate: -1,
- seekable: [],
- played: [],
-
- // HTML5 read-only properties
- paused: true,
- ended: false,
- seeking: false,
- duration: 0,
- error: null,
- tagName: '',
-
- // HTML5 get/set properties, but only set (updated by event handlers)
- muted: false,
- volume: 1,
- currentTime: 0,
-
- // HTML5 methods
- play: function () {
- if (this.pluginApi != null) {
- if (this.pluginType == 'youtube' || this.pluginType == 'vimeo') {
- this.pluginApi.playVideo();
- } else {
- this.pluginApi.playMedia();
- }
- this.paused = false;
- }
- },
- load: function () {
- if (this.pluginApi != null) {
- if (this.pluginType == 'youtube' || this.pluginType == 'vimeo') {
- } else {
- this.pluginApi.loadMedia();
- }
-
- this.paused = false;
- }
- },
- pause: function () {
- if (this.pluginApi != null) {
- if (this.pluginType == 'youtube' || this.pluginType == 'vimeo') {
- if( this.pluginApi.getPlayerState() == 1 ) {
- this.pluginApi.pauseVideo();
- }
- } else {
- this.pluginApi.pauseMedia();
- }
-
-
- this.paused = true;
- }
- },
- stop: function () {
- if (this.pluginApi != null) {
- if (this.pluginType == 'youtube' || this.pluginType == 'vimeo') {
- this.pluginApi.stopVideo();
- } else {
- this.pluginApi.stopMedia();
- }
- this.paused = true;
- }
- },
- canPlayType: function(type) {
- var i,
- j,
- pluginInfo,
- pluginVersions = mejs.plugins[this.pluginType];
-
- for (i=0; i<pluginVersions.length; i++) {
- pluginInfo = pluginVersions[i];
-
- // test if user has the correct plugin version
- if (mejs.PluginDetector.hasPluginVersion(this.pluginType, pluginInfo.version)) {
-
- // test for plugin playback types
- for (j=0; j<pluginInfo.types.length; j++) {
- // find plugin that can play the type
- if (type == pluginInfo.types[j]) {
- return 'probably';
- }
- }
- }
- }
-
- return '';
- },
-
- positionFullscreenButton: function(x,y,visibleAndAbove) {
- if (this.pluginApi != null && this.pluginApi.positionFullscreenButton) {
- this.pluginApi.positionFullscreenButton(Math.floor(x),Math.floor(y),visibleAndAbove);
- }
- },
-
- hideFullscreenButton: function() {
- if (this.pluginApi != null && this.pluginApi.hideFullscreenButton) {
- this.pluginApi.hideFullscreenButton();
- }
- },
-
-
- // custom methods since not all JavaScript implementations support get/set
-
- // This can be a url string
- // or an array [{src:'file.mp4',type:'video/mp4'},{src:'file.webm',type:'video/webm'}]
- setSrc: function (url) {
- if (typeof url == 'string') {
- this.pluginApi.setSrc(mejs.Utility.absolutizeUrl(url));
- this.src = mejs.Utility.absolutizeUrl(url);
- } else {
- var i, media;
-
- for (i=0; i<url.length; i++) {
- media = url[i];
- if (this.canPlayType(media.type)) {
- this.pluginApi.setSrc(mejs.Utility.absolutizeUrl(media.src));
- this.src = mejs.Utility.absolutizeUrl(media.src);
- break;
- }
- }
- }
-
- },
- setCurrentTime: function (time) {
- if (this.pluginApi != null) {
- if (this.pluginType == 'youtube' || this.pluginType == 'vimeo') {
- this.pluginApi.seekTo(time);
- } else {
- this.pluginApi.setCurrentTime(time);
- }
-
-
-
- this.currentTime = time;
- }
- },
- setVolume: function (volume) {
- if (this.pluginApi != null) {
- // same on YouTube and MEjs
- if (this.pluginType == 'youtube') {
- this.pluginApi.setVolume(volume * 100);
- } else {
- this.pluginApi.setVolume(volume);
- }
- this.volume = volume;
- }
- },
- setMuted: function (muted) {
- if (this.pluginApi != null) {
- if (this.pluginType == 'youtube') {
- if (muted) {
- this.pluginApi.mute();
- } else {
- this.pluginApi.unMute();
- }
- this.muted = muted;
- this.dispatchEvent({type:'volumechange'});
- } else {
- this.pluginApi.setMuted(muted);
- }
- this.muted = muted;
- }
- },
-
- // additional non-HTML5 methods
- setVideoSize: function (width, height) {
-
- //if (this.pluginType == 'flash' || this.pluginType == 'silverlight') {
- if (this.pluginElement && this.pluginElement.style) {
- this.pluginElement.style.width = width + 'px';
- this.pluginElement.style.height = height + 'px';
- }
- if (this.pluginApi != null && this.pluginApi.setVideoSize) {
- this.pluginApi.setVideoSize(width, height);
- }
- //}
- },
-
- setFullscreen: function (fullscreen) {
- if (this.pluginApi != null && this.pluginApi.setFullscreen) {
- this.pluginApi.setFullscreen(fullscreen);
- }
- },
-
- enterFullScreen: function() {
- if (this.pluginApi != null && this.pluginApi.setFullscreen) {
- this.setFullscreen(true);
- }
-
- },
-
- exitFullScreen: function() {
- if (this.pluginApi != null && this.pluginApi.setFullscreen) {
- this.setFullscreen(false);
- }
- },
-
- // start: fake events
- addEventListener: function (eventName, callback, bubble) {
- this.events[eventName] = this.events[eventName] || [];
- this.events[eventName].push(callback);
- },
- removeEventListener: function (eventName, callback) {
- if (!eventName) { this.events = {}; return true; }
- var callbacks = this.events[eventName];
- if (!callbacks) return true;
- if (!callback) { this.events[eventName] = []; return true; }
- for (var i = 0; i < callbacks.length; i++) {
- if (callbacks[i] === callback) {
- this.events[eventName].splice(i, 1);
- return true;
- }
- }
- return false;
- },
- dispatchEvent: function (event) {
- var i,
- args,
- callbacks = this.events[event.type];
-
- if (callbacks) {
- for (i = 0; i < callbacks.length; i++) {
- callbacks[i].apply(this, [event]);
- }
- }
- },
- // end: fake events
-
- // fake DOM attribute methods
- hasAttribute: function(name){
- return (name in this.attributes);
- },
- removeAttribute: function(name){
- delete this.attributes[name];
- },
- getAttribute: function(name){
- if (this.hasAttribute(name)) {
- return this.attributes[name];
- }
- return '';
- },
- setAttribute: function(name, value){
- this.attributes[name] = value;
- },
-
- remove: function() {
- mejs.Utility.removeSwf(this.pluginElement.id);
- mejs.MediaPluginBridge.unregisterPluginElement(this.pluginElement.id);
- }
-};
-
-/*
-Default options
-*/
-mejs.MediaElementDefaults = {
- // allows testing on HTML5, flash, silverlight
- // auto: attempts to detect what the browser can do
- // auto_plugin: prefer plugins and then attempt native HTML5
- // native: forces HTML5 playback
- // shim: disallows HTML5, will attempt either Flash or Silverlight
- // none: forces fallback view
- mode: 'auto',
- // remove or reorder to change plugin priority and availability
- plugins: ['flash','silverlight','youtube','vimeo'],
- // shows debug errors on screen
- enablePluginDebug: false,
- // use plugin for browsers that have trouble with Basic Authentication on HTTPS sites
- httpsBasicAuthSite: false,
- // overrides the type specified, useful for dynamic instantiation
- type: '',
- // path to Flash and Silverlight plugins
- pluginPath: mejs.Utility.getScriptPath(['mediaelement.js','mediaelement.min.js','mediaelement-and-player.js','mediaelement-and-player.min.js']),
- // name of flash file
- flashName: 'flashmediaelement.swf',
- // streamer for RTMP streaming
- flashStreamer: '',
- // set to 'always' for CDN version
- flashScriptAccess: 'sameDomain',
- // turns on the smoothing filter in Flash
- enablePluginSmoothing: false,
- // enabled pseudo-streaming (seek) on .mp4 files
- enablePseudoStreaming: false,
- // start query parameter sent to server for pseudo-streaming
- pseudoStreamingStartQueryParam: 'start',
- // name of silverlight file
- silverlightName: 'silverlightmediaelement.xap',
- // default if the <video width> is not specified
- defaultVideoWidth: 480,
- // default if the <video height> is not specified
- defaultVideoHeight: 270,
- // overrides <video width>
- pluginWidth: -1,
- // overrides <video height>
- pluginHeight: -1,
- // additional plugin variables in 'key=value' form
- pluginVars: [],
- // rate in milliseconds for Flash and Silverlight to fire the timeupdate event
- // larger number is less accurate, but less strain on plugin->JavaScript bridge
- timerRate: 250,
- // initial volume for player
- startVolume: 0.8,
- success: function () { },
- error: function () { }
-};
-
-/*
-Determines if a browser supports the <video> or <audio> element
-and returns either the native element or a Flash/Silverlight version that
-mimics HTML5 MediaElement
-*/
-mejs.MediaElement = function (el, o) {
- return mejs.HtmlMediaElementShim.create(el,o);
-};
-
-mejs.HtmlMediaElementShim = {
-
- create: function(el, o) {
- var
- options = {},
- htmlMediaElement = (typeof(el) == 'string') ? document.getElementById(el) : el,
- tagName = htmlMediaElement.tagName.toLowerCase(),
- isMediaTag = (tagName === 'audio' || tagName === 'video'),
- src = (isMediaTag) ? htmlMediaElement.getAttribute('src') : htmlMediaElement.getAttribute('href'),
- poster = htmlMediaElement.getAttribute('poster'),
- autoplay = htmlMediaElement.getAttribute('autoplay'),
- preload = htmlMediaElement.getAttribute('preload'),
- controls = htmlMediaElement.getAttribute('controls'),
- playback,
- prop;
-
- // extend options
- for (prop in mejs.MediaElementDefaults) {
- options[prop] = mejs.MediaElementDefaults[prop];
- }
- for (prop in o) {
- options[prop] = o[prop];
- }
-
-
- // clean up attributes
- src = (typeof src == 'undefined' || src === null || src == '') ? null : src;
- poster = (typeof poster == 'undefined' || poster === null) ? '' : poster;
- preload = (typeof preload == 'undefined' || preload === null || preload === 'false') ? 'none' : preload;
- autoplay = !(typeof autoplay == 'undefined' || autoplay === null || autoplay === 'false');
- controls = !(typeof controls == 'undefined' || controls === null || controls === 'false');
-
- // test for HTML5 and plugin capabilities
- playback = this.determinePlayback(htmlMediaElement, options, mejs.MediaFeatures.supportsMediaTag, isMediaTag, src);
- playback.url = (playback.url !== null) ? mejs.Utility.absolutizeUrl(playback.url) : '';
- playback.scheme = mejs.Utility.determineScheme(playback.url);
-
- if (playback.method == 'native') {
- // second fix for android
- if (mejs.MediaFeatures.isBustedAndroid) {
- htmlMediaElement.src = playback.url;
- htmlMediaElement.addEventListener('click', function() {
- htmlMediaElement.play();
- }, false);
- }
-
- // add methods to native HTMLMediaElement
- return this.updateNative(playback, options, autoplay, preload);
- } else if (playback.method !== '') {
- // create plugin to mimic HTMLMediaElement
-
- return this.createPlugin( playback, options, poster, autoplay, preload, controls);
- } else {
- // boo, no HTML5, no Flash, no Silverlight.
- this.createErrorMessage( playback, options, poster );
-
- return this;
- }
- },
-
- determinePlayback: function(htmlMediaElement, options, supportsMediaTag, isMediaTag, src) {
- var
- mediaFiles = [],
- i,
- j,
- k,
- l,
- n,
- type,
- result = { method: '', url: '', htmlMediaElement: htmlMediaElement, isVideo: (htmlMediaElement.tagName.toLowerCase() != 'audio'), scheme: ''},
- pluginName,
- pluginVersions,
- pluginInfo,
- dummy,
- media;
-
- // STEP 1: Get URL and type from <video src> or <source src>
-
- // supplied type overrides <video type> and <source type>
- if (typeof options.type != 'undefined' && options.type !== '') {
-
- // accept either string or array of types
- if (typeof options.type == 'string') {
- mediaFiles.push({type:options.type, url:src});
- } else {
-
- for (i=0; i<options.type.length; i++) {
- mediaFiles.push({type:options.type[i], url:src});
- }
- }
-
- // test for src attribute first
- } else if (src !== null) {
- type = this.formatType(src, htmlMediaElement.getAttribute('type'));
- mediaFiles.push({type:type, url:src});
-
- // then test for <source> elements
- } else {
- // test <source> types to see if they are usable
- for (i = 0; i < htmlMediaElement.childNodes.length; i++) {
- n = htmlMediaElement.childNodes[i];
- if (n.nodeType == 1 && n.tagName.toLowerCase() == 'source') {
- src = n.getAttribute('src');
- type = this.formatType(src, n.getAttribute('type'));
- media = n.getAttribute('media');
-
- if (!media || !window.matchMedia || (window.matchMedia && window.matchMedia(media).matches)) {
- mediaFiles.push({type:type, url:src});
- }
- }
- }
- }
-
- // in the case of dynamicly created players
- // check for audio types
- if (!isMediaTag && mediaFiles.length > 0 && mediaFiles[0].url !== null && this.getTypeFromFile(mediaFiles[0].url).indexOf('audio') > -1) {
- result.isVideo = false;
- }
-
-
- // STEP 2: Test for playback method
-
- // special case for Android which sadly doesn't implement the canPlayType function (always returns '')
- if (mejs.MediaFeatures.isBustedAndroid) {
- htmlMediaElement.canPlayType = function(type) {
- return (type.match(/video\/(mp4|m4v)/gi) !== null) ? 'maybe' : '';
- };
- }
-
- // special case for Chromium to specify natively supported video codecs (i.e. WebM and Theora)
- if (mejs.MediaFeatures.isChromium) {
- htmlMediaElement.canPlayType = function(type) {
- return (type.match(/video\/(webm|ogv|ogg)/gi) !== null) ? 'maybe' : '';
- };
- }
-
- // test for native playback first
- if (supportsMediaTag && (options.mode === 'auto' || options.mode === 'auto_plugin' || options.mode === 'native') && !(mejs.MediaFeatures.isBustedNativeHTTPS && options.httpsBasicAuthSite === true)) {
-
- if (!isMediaTag) {
-
- // create a real HTML5 Media Element
- dummy = document.createElement( result.isVideo ? 'video' : 'audio');
- htmlMediaElement.parentNode.insertBefore(dummy, htmlMediaElement);
- htmlMediaElement.style.display = 'none';
-
- // use this one from now on
- result.htmlMediaElement = htmlMediaElement = dummy;
- }
-
- for (i=0; i<mediaFiles.length; i++) {
- // normal check
- if (mediaFiles[i].type == "video/m3u8" || htmlMediaElement.canPlayType(mediaFiles[i].type).replace(/no/, '') !== ''
- // special case for Mac/Safari 5.0.3 which answers '' to canPlayType('audio/mp3') but 'maybe' to canPlayType('audio/mpeg')
- || htmlMediaElement.canPlayType(mediaFiles[i].type.replace(/mp3/,'mpeg')).replace(/no/, '') !== ''
- // special case for m4a supported by detecting mp4 support
- || htmlMediaElement.canPlayType(mediaFiles[i].type.replace(/m4a/,'mp4')).replace(/no/, '') !== '') {
- result.method = 'native';
- result.url = mediaFiles[i].url;
- break;
- }
- }
-
- if (result.method === 'native') {
- if (result.url !== null) {
- htmlMediaElement.src = result.url;
- }
-
- // if `auto_plugin` mode, then cache the native result but try plugins.
- if (options.mode !== 'auto_plugin') {
- return result;
- }
- }
- }
-
- // if native playback didn't work, then test plugins
- if (options.mode === 'auto' || options.mode === 'auto_plugin' || options.mode === 'shim') {
- for (i=0; i<mediaFiles.length; i++) {
- type = mediaFiles[i].type;
-
- // test all plugins in order of preference [silverlight, flash]
- for (j=0; j<options.plugins.length; j++) {
-
- pluginName = options.plugins[j];
-
- // test version of plugin (for future features)
- pluginVersions = mejs.plugins[pluginName];
-
- for (k=0; k<pluginVersions.length; k++) {
- pluginInfo = pluginVersions[k];
-
- // test if user has the correct plugin version
-
- // for youtube/vimeo
- if (pluginInfo.version == null ||
-
- mejs.PluginDetector.hasPluginVersion(pluginName, pluginInfo.version)) {
-
- // test for plugin playback types
- for (l=0; l<pluginInfo.types.length; l++) {
- // find plugin that can play the type
- if (type.toLowerCase() == pluginInfo.types[l].toLowerCase()) {
- result.method = pluginName;
- result.url = mediaFiles[i].url;
- return result;
- }
- }
- }
- }
- }
- }
- }
-
- // at this point, being in 'auto_plugin' mode implies that we tried plugins but failed.
- // if we have native support then return that.
- if (options.mode === 'auto_plugin' && result.method === 'native') {
- return result;
- }
-
- // what if there's nothing to play? just grab the first available
- if (result.method === '' && mediaFiles.length > 0) {
- result.url = mediaFiles[0].url;
- }
-
- return result;
- },
-
- formatType: function(url, type) {
- // if no type is supplied, fake it with the extension
- if (url && !type) {
- return this.getTypeFromFile(url);
- } else {
- // only return the mime part of the type in case the attribute contains the codec
- // see http://www.whatwg.org/specs/web-apps/current-work/multipage/video.html#the-source-element
- // `video/mp4; codecs="avc1.42E01E, mp4a.40.2"` becomes `video/mp4`
-
- if (type && ~type.indexOf(';')) {
- return type.substr(0, type.indexOf(';'));
- } else {
- return type;
- }
- }
- },
-
- getTypeFromFile: function(url) {
- url = url.split('?')[0];
- var
- ext = url.substring(url.lastIndexOf('.') + 1).toLowerCase(),
- av = /(mp4|m4v|ogg|ogv|m3u8|webm|webmv|flv|wmv|mpeg|mov)/gi.test(ext) ? 'video/' : 'audio/';
- return this.getTypeFromExtension(ext, av);
- },
-
- getTypeFromExtension: function(ext, av) {
- av = av || '';
-
- switch (ext) {
- case 'mp4':
- case 'm4v':
- case 'm4a':
- case 'f4v':
- case 'f4a':
- return av + 'mp4';
- case 'flv':
- return av + 'x-flv';
- case 'webm':
- case 'webma':
- case 'webmv':
- return av + 'webm';
- case 'ogg':
- case 'oga':
- case 'ogv':
- return av + 'ogg';
- case 'm3u8':
- return 'application/x-mpegurl';
- case 'ts':
- return av + 'mp2t';
- default:
- return av + ext;
- }
- },
-
- createErrorMessage: function(playback, options, poster) {
- var
- htmlMediaElement = playback.htmlMediaElement,
- errorContainer = document.createElement('div'),
- errorContent = options.customError;
-
- errorContainer.className = 'me-cannotplay';
-
- try {
- errorContainer.style.width = htmlMediaElement.width + 'px';
- errorContainer.style.height = htmlMediaElement.height + 'px';
- } catch (e) {}
-
- if (!errorContent) {
- errorContent = '<a href="' + playback.url + '">';
-
- if (poster !== '') {
- errorContent += '<img src="' + poster + '" width="100%" height="100%" alt="" />';
- }
-
- errorContent += '<span>' + mejs.i18n.t('Download File') + '</span></a>';
- }
-
- errorContainer.innerHTML = errorContent;
-
- htmlMediaElement.parentNode.insertBefore(errorContainer, htmlMediaElement);
- htmlMediaElement.style.display = 'none';
-
- options.error(htmlMediaElement);
- },
-
- createPlugin:function(playback, options, poster, autoplay, preload, controls) {
- var
- htmlMediaElement = playback.htmlMediaElement,
- width = 1,
- height = 1,
- pluginid = 'me_' + playback.method + '_' + (mejs.meIndex++),
- pluginMediaElement = new mejs.PluginMediaElement(pluginid, playback.method, playback.url),
- container = document.createElement('div'),
- specialIEContainer,
- node,
- initVars;
-
- // copy tagName from html media element
- pluginMediaElement.tagName = htmlMediaElement.tagName
-
- // copy attributes from html media element to plugin media element
- for (var i = 0; i < htmlMediaElement.attributes.length; i++) {
- var attribute = htmlMediaElement.attributes[i];
- if (attribute.specified) {
- pluginMediaElement.setAttribute(attribute.name, attribute.value);
- }
- }
-
- // check for placement inside a <p> tag (sometimes WYSIWYG editors do this)
- node = htmlMediaElement.parentNode;
-
- while (node !== null && node.tagName != null && node.tagName.toLowerCase() !== 'body' &&
- node.parentNode != null && node.parentNode.tagName != null && node.parentNode.constructor != null && node.parentNode.constructor.name === "ShadowRoot") {
- if (node.parentNode.tagName.toLowerCase() === 'p') {
- node.parentNode.parentNode.insertBefore(node, node.parentNode);
- break;
- }
- node = node.parentNode;
- }
-
- if (playback.isVideo) {
- width = (options.pluginWidth > 0) ? options.pluginWidth : (options.videoWidth > 0) ? options.videoWidth : (htmlMediaElement.getAttribute('width') !== null) ? htmlMediaElement.getAttribute('width') : options.defaultVideoWidth;
- height = (options.pluginHeight > 0) ? options.pluginHeight : (options.videoHeight > 0) ? options.videoHeight : (htmlMediaElement.getAttribute('height') !== null) ? htmlMediaElement.getAttribute('height') : options.defaultVideoHeight;
-
- // in case of '%' make sure it's encoded
- width = mejs.Utility.encodeUrl(width);
- height = mejs.Utility.encodeUrl(height);
-
- } else {
- if (options.enablePluginDebug) {
- width = 320;
- height = 240;
- }
- }
-
- // register plugin
- pluginMediaElement.success = options.success;
-
- // add container (must be added to DOM before inserting HTML for IE)
- container.className = 'me-plugin';
- container.id = pluginid + '_container';
-
- if (playback.isVideo) {
- htmlMediaElement.parentNode.insertBefore(container, htmlMediaElement);
- } else {
- document.body.insertBefore(container, document.body.childNodes[0]);
- }
-
- if (playback.method === 'flash' || playback.method === 'silverlight') {
-
- // flash/silverlight vars
- initVars = [
- 'id=' + pluginid,
- 'isvideo=' + ((playback.isVideo) ? "true" : "false"),
- 'autoplay=' + ((autoplay) ? "true" : "false"),
- 'preload=' + preload,
- 'width=' + width,
- 'startvolume=' + options.startVolume,
- 'timerrate=' + options.timerRate,
- 'flashstreamer=' + options.flashStreamer,
- 'height=' + height,
- 'pseudostreamstart=' + options.pseudoStreamingStartQueryParam];
-
- if (playback.url !== null) {
- if (playback.method == 'flash') {
- initVars.push('file=' + mejs.Utility.encodeUrl(playback.url));
- } else {
- initVars.push('file=' + playback.url);
- }
- }
- if (options.enablePluginDebug) {
- initVars.push('debug=true');
- }
- if (options.enablePluginSmoothing) {
- initVars.push('smoothing=true');
- }
- if (options.enablePseudoStreaming) {
- initVars.push('pseudostreaming=true');
- }
- if (controls) {
- initVars.push('controls=true'); // shows controls in the plugin if desired
- }
- if (options.pluginVars) {
- initVars = initVars.concat(options.pluginVars);
- }
-
- // call from plugin
- window[pluginid + '_init'] = function() {
- switch (pluginMediaElement.pluginType) {
- case 'flash':
- pluginMediaElement.pluginElement = pluginMediaElement.pluginApi = document.getElementById(pluginid);
- break;
- case 'silverlight':
- pluginMediaElement.pluginElement = document.getElementById(pluginMediaElement.id);
- pluginMediaElement.pluginApi = pluginMediaElement.pluginElement.Content.MediaElementJS;
- break;
- }
-
- if (pluginMediaElement.pluginApi != null && pluginMediaElement.success) {
- pluginMediaElement.success(pluginMediaElement, htmlMediaElement);
- }
- }
-
- // event call from plugin
- window[pluginid + '_event'] = function(eventName, values) {
-
- var
- e,
- i,
- bufferedTime;
-
- // fake event object to mimic real HTML media event.
- e = {
- type: eventName,
- target: pluginMediaElement
- };
-
- // attach all values to element and event object
- for (i in values) {
- pluginMediaElement[i] = values[i];
- e[i] = values[i];
- }
-
- // fake the newer W3C buffered TimeRange (loaded and total have been removed)
- bufferedTime = values.bufferedTime || 0;
-
- e.target.buffered = e.buffered = {
- start: function(index) {
- return 0;
- },
- end: function (index) {
- return bufferedTime;
- },
- length: 1
- };
-
- pluginMediaElement.dispatchEvent(e);
- }
-
-
- }
-
- switch (playback.method) {
- case 'silverlight':
- container.innerHTML =
-'<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" id="' + pluginid + '" name="' + pluginid + '" width="' + width + '" height="' + height + '" class="mejs-shim">' +
-'<param name="initParams" value="' + initVars.join(',') + '" />' +
-'<param name="windowless" value="true" />' +
-'<param name="background" value="black" />' +
-'<param name="minRuntimeVersion" value="3.0.0.0" />' +
-'<param name="autoUpgrade" value="true" />' +
-'<param name="source" value="' + options.pluginPath + options.silverlightName + '" />' +
-'</object>';
- break;
-
- case 'flash':
-
- if (mejs.MediaFeatures.isIE) {
- specialIEContainer = document.createElement('div');
- container.appendChild(specialIEContainer);
- specialIEContainer.outerHTML =
-'<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab" ' +
-'id="' + pluginid + '" width="' + width + '" height="' + height + '" class="mejs-shim">' +
-'<param name="movie" value="' + options.pluginPath + options.flashName + '?' + (new Date().getTime()) + '" />' +
-'<param name="flashvars" value="' + initVars.join('&amp;') + '" />' +
-'<param name="quality" value="high" />' +
-'<param name="bgcolor" value="#000000" />' +
-'<param name="wmode" value="transparent" />' +
-'<param name="allowScriptAccess" value="' + options.flashScriptAccess + '" />' +
-'<param name="allowFullScreen" value="true" />' +
-'<param name="scale" value="default" />' +
-'</object>';
-
- } else {
-
- container.innerHTML =
-'<embed id="' + pluginid + '" name="' + pluginid + '" ' +
-'play="true" ' +
-'loop="false" ' +
-'quality="high" ' +
-'bgcolor="#000000" ' +
-'wmode="transparent" ' +
-'allowScriptAccess="' + options.flashScriptAccess + '" ' +
-'allowFullScreen="true" ' +
-'type="application/x-shockwave-flash" pluginspage="//www.macromedia.com/go/getflashplayer" ' +
-'src="' + options.pluginPath + options.flashName + '" ' +
-'flashvars="' + initVars.join('&') + '" ' +
-'width="' + width + '" ' +
-'height="' + height + '" ' +
-'scale="default"' +
-'class="mejs-shim"></embed>';
- }
- break;
-
- case 'youtube':
-
-
- var videoId;
- // youtu.be url from share button
- if (playback.url.lastIndexOf("youtu.be") != -1) {
- videoId = playback.url.substr(playback.url.lastIndexOf('/')+1);
- if (videoId.indexOf('?') != -1) {
- videoId = videoId.substr(0, videoId.indexOf('?'));
- }
- }
- else {
- videoId = playback.url.substr(playback.url.lastIndexOf('=')+1);
- }
- youtubeSettings = {
- container: container,
- containerId: container.id,
- pluginMediaElement: pluginMediaElement,
- pluginId: pluginid,
- videoId: videoId,
- height: height,
- width: width,
- scheme: playback.scheme
- };
-
- // favor iframe version of YouTube
- if (window.postMessage) {
- mejs.YouTubeApi.enqueueIframe(youtubeSettings);
- } else if (mejs.PluginDetector.hasPluginVersion('flash', [10,0,0]) ) {
- mejs.YouTubeApi.createFlash(youtubeSettings, options);
- }
-
- break;
-
- // DEMO Code. Does NOT work.
- case 'vimeo':
- var player_id = pluginid + "_player";
- pluginMediaElement.vimeoid = playback.url.substr(playback.url.lastIndexOf('/')+1);
-
- container.innerHTML ='<iframe src="' + playback.scheme + 'player.vimeo.com/video/' + pluginMediaElement.vimeoid + '?api=1&portrait=0&byline=0&title=0&player_id=' + player_id + '" width="' + width +'" height="' + height +'" frameborder="0" class="mejs-shim" id="' + player_id + '" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>';
- if (typeof($f) == 'function') { // froogaloop available
- var player = $f(container.childNodes[0]),
- playerState = -1;
-
- player.addEvent('ready', function() {
-
- player.playVideo = function() {
- player.api( 'play' );
- }
- player.stopVideo = function() {
- player.api( 'unload' );
- }
- player.pauseVideo = function() {
- player.api( 'pause' );
- }
- player.seekTo = function( seconds ) {
- player.api( 'seekTo', seconds );
- }
- player.setVolume = function( volume ) {
- player.api( 'setVolume', volume );
- }
- player.setMuted = function( muted ) {
- if( muted ) {
- player.lastVolume = player.api( 'getVolume' );
- player.api( 'setVolume', 0 );
- } else {
- player.api( 'setVolume', player.lastVolume );
- delete player.lastVolume;
- }
- }
- // parity with YT player
- player.getPlayerState = function() {
- return playerState;
- }
-
- function createEvent(player, pluginMediaElement, eventName, e) {
- var event = {
- type: eventName,
- target: pluginMediaElement
- };
- if (eventName == 'timeupdate') {
- pluginMediaElement.currentTime = event.currentTime = e.seconds;
- pluginMediaElement.duration = event.duration = e.duration;
- }
- pluginMediaElement.dispatchEvent(event);
- }
-
- player.addEvent('play', function() {
- playerState = 1;
- createEvent(player, pluginMediaElement, 'play');
- createEvent(player, pluginMediaElement, 'playing');
- });
-
- player.addEvent('pause', function() {
- playerState = 2;
- createEvent(player, pluginMediaElement, 'pause');
- });
-
- player.addEvent('finish', function() {
- playerState = 0;
- createEvent(player, pluginMediaElement, 'ended');
- });
-
- player.addEvent('playProgress', function(e) {
- createEvent(player, pluginMediaElement, 'timeupdate', e);
- });
-
- player.addEvent('seek', function(e) {
- playerState = 3;
- createEvent(player, pluginMediaElement, 'seeked', e);
- });
-
- player.addEvent('loadProgress', function(e) {
- playerState = 3;
- createEvent(player, pluginMediaElement, 'progress', e);
- });
-
- pluginMediaElement.pluginElement = container;
- pluginMediaElement.pluginApi = player;
-
- pluginMediaElement.success(pluginMediaElement, pluginMediaElement.pluginElement);
- });
- }
- else {
- console.warn("You need to include froogaloop for vimeo to work");
- }
- break;
- }
- // hide original element
- htmlMediaElement.style.display = 'none';
- // prevent browser from autoplaying when using a plugin
- htmlMediaElement.removeAttribute('autoplay');
-
- return pluginMediaElement;
- },
-
- updateNative: function(playback, options, autoplay, preload) {
-
- var htmlMediaElement = playback.htmlMediaElement,
- m;
-
-
- // add methods to video object to bring it into parity with Flash Object
- for (m in mejs.HtmlMediaElement) {
- htmlMediaElement[m] = mejs.HtmlMediaElement[m];
- }
-
- /*
- Chrome now supports preload="none"
- if (mejs.MediaFeatures.isChrome) {
-
- // special case to enforce preload attribute (Chrome doesn't respect this)
- if (preload === 'none' && !autoplay) {
-
- // forces the browser to stop loading (note: fails in IE9)
- htmlMediaElement.src = '';
- htmlMediaElement.load();
- htmlMediaElement.canceledPreload = true;
-
- htmlMediaElement.addEventListener('play',function() {
- if (htmlMediaElement.canceledPreload) {
- htmlMediaElement.src = playback.url;
- htmlMediaElement.load();
- htmlMediaElement.play();
- htmlMediaElement.canceledPreload = false;
- }
- }, false);
- // for some reason Chrome forgets how to autoplay sometimes.
- } else if (autoplay) {
- htmlMediaElement.load();
- htmlMediaElement.play();
- }
- }
- */
-
- // fire success code
- options.success(htmlMediaElement, htmlMediaElement);
-
- return htmlMediaElement;
- }
-};
-
-/*
- - test on IE (object vs. embed)
- - determine when to use iframe (Firefox, Safari, Mobile) vs. Flash (Chrome, IE)
- - fullscreen?
-*/
-
-// YouTube Flash and Iframe API
-mejs.YouTubeApi = {
- isIframeStarted: false,
- isIframeLoaded: false,
- loadIframeApi: function(yt) {
- if (!this.isIframeStarted) {
- var tag = document.createElement('script');
- tag.src = yt.scheme + "www.youtube.com/player_api";
- var firstScriptTag = document.getElementsByTagName('script')[0];
- firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
- this.isIframeStarted = true;
- }
- },
- iframeQueue: [],
- enqueueIframe: function(yt) {
-
- if (this.isLoaded) {
- this.createIframe(yt);
- } else {
- this.loadIframeApi(yt);
- this.iframeQueue.push(yt);
- }
- },
- createIframe: function(settings) {
-
- var
- pluginMediaElement = settings.pluginMediaElement,
- player = new YT.Player(settings.containerId, {
- height: settings.height,
- width: settings.width,
- videoId: settings.videoId,
- playerVars: {controls:0,wmode:'transparent'},
- events: {
- 'onReady': function() {
-
- // wrapper to match
- player.setVideoSize = function(width, height) {
- player.setSize(width, height);
- }
-
- // hook up iframe object to MEjs
- settings.pluginMediaElement.pluginApi = player;
- settings.pluginMediaElement.pluginElement = document.getElementById(settings.containerId);
-
- // init mejs
- pluginMediaElement.success(pluginMediaElement, pluginMediaElement.pluginElement);
-
- // create timer
- setInterval(function() {
- mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'timeupdate');
- }, 250);
- },
- 'onStateChange': function(e) {
-
- mejs.YouTubeApi.handleStateChange(e.data, player, pluginMediaElement);
-
- }
- }
- });
- },
-
- createEvent: function (player, pluginMediaElement, eventName) {
- var event = {
- type: eventName,
- target: pluginMediaElement
- };
-
- if (player && player.getDuration) {
-
- // time
- pluginMediaElement.currentTime = event.currentTime = player.getCurrentTime();
- pluginMediaElement.duration = event.duration = player.getDuration();
-
- // state
- event.paused = pluginMediaElement.paused;
- event.ended = pluginMediaElement.ended;
-
- // sound
- event.muted = player.isMuted();
- event.volume = player.getVolume() / 100;
-
- // progress
- event.bytesTotal = player.getVideoBytesTotal();
- event.bufferedBytes = player.getVideoBytesLoaded();
-
- // fake the W3C buffered TimeRange
- var bufferedTime = event.bufferedBytes / event.bytesTotal * event.duration;
-
- event.target.buffered = event.buffered = {
- start: function(index) {
- return 0;
- },
- end: function (index) {
- return bufferedTime;
- },
- length: 1
- };
-
- }
-
- // send event up the chain
- pluginMediaElement.dispatchEvent(event);
- },
-
- iFrameReady: function() {
-
- this.isLoaded = true;
- this.isIframeLoaded = true;
-
- while (this.iframeQueue.length > 0) {
- var settings = this.iframeQueue.pop();
- this.createIframe(settings);
- }
- },
-
- // FLASH!
- flashPlayers: {},
- createFlash: function(settings) {
-
- this.flashPlayers[settings.pluginId] = settings;
-
- /*
- settings.container.innerHTML =
- '<object type="application/x-shockwave-flash" id="' + settings.pluginId + '" data="' + settings.scheme + 'www.youtube.com/apiplayer?enablejsapi=1&amp;playerapiid=' + settings.pluginId + '&amp;version=3&amp;autoplay=0&amp;controls=0&amp;modestbranding=1&loop=0" ' +
- 'width="' + settings.width + '" height="' + settings.height + '" style="visibility: visible; " class="mejs-shim">' +
- '<param name="allowScriptAccess" value="sameDomain">' +
- '<param name="wmode" value="transparent">' +
- '</object>';
- */
-
- var specialIEContainer,
- youtubeUrl = settings.scheme + 'www.youtube.com/apiplayer?enablejsapi=1&amp;playerapiid=' + settings.pluginId + '&amp;version=3&amp;autoplay=0&amp;controls=0&amp;modestbranding=1&loop=0';
-
- if (mejs.MediaFeatures.isIE) {
-
- specialIEContainer = document.createElement('div');
- settings.container.appendChild(specialIEContainer);
- specialIEContainer.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="' + settings.scheme + 'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab" ' +
-'id="' + settings.pluginId + '" width="' + settings.width + '" height="' + settings.height + '" class="mejs-shim">' +
- '<param name="movie" value="' + youtubeUrl + '" />' +
- '<param name="wmode" value="transparent" />' +
- '<param name="allowScriptAccess" value="' + options.flashScriptAccess + '" />' +
- '<param name="allowFullScreen" value="true" />' +
-'</object>';
- } else {
- settings.container.innerHTML =
- '<object type="application/x-shockwave-flash" id="' + settings.pluginId + '" data="' + youtubeUrl + '" ' +
- 'width="' + settings.width + '" height="' + settings.height + '" style="visibility: visible; " class="mejs-shim">' +
- '<param name="allowScriptAccess" value="' + options.flashScriptAccess + '">' +
- '<param name="wmode" value="transparent">' +
- '</object>';
- }
-
- },
-
- flashReady: function(id) {
- var
- settings = this.flashPlayers[id],
- player = document.getElementById(id),
- pluginMediaElement = settings.pluginMediaElement;
-
- // hook up and return to MediaELementPlayer.success
- pluginMediaElement.pluginApi =
- pluginMediaElement.pluginElement = player;
-
- settings.success(pluginMediaElement, pluginMediaElement.pluginElement);
-
- // load the youtube video
- player.cueVideoById(settings.videoId);
-
- var callbackName = settings.containerId + '_callback';
-
- window[callbackName] = function(e) {
- mejs.YouTubeApi.handleStateChange(e, player, pluginMediaElement);
- }
-
- player.addEventListener('onStateChange', callbackName);
-
- setInterval(function() {
- mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'timeupdate');
- }, 250);
-
- mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'canplay');
- },
-
- handleStateChange: function(youTubeState, player, pluginMediaElement) {
- switch (youTubeState) {
- case -1: // not started
- pluginMediaElement.paused = true;
- pluginMediaElement.ended = true;
- mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'loadedmetadata');
- //createYouTubeEvent(player, pluginMediaElement, 'loadeddata');
- break;
- case 0:
- pluginMediaElement.paused = false;
- pluginMediaElement.ended = true;
- mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'ended');
- break;
- case 1:
- pluginMediaElement.paused = false;
- pluginMediaElement.ended = false;
- mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'play');
- mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'playing');
- break;
- case 2:
- pluginMediaElement.paused = true;
- pluginMediaElement.ended = false;
- mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'pause');
- break;
- case 3: // buffering
- mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'progress');
- break;
- case 5:
- // cued?
- break;
-
- }
-
- }
-}
-// IFRAME
-window.onYouTubePlayerAPIReady = function() {
- mejs.YouTubeApi.iFrameReady();
-};
-// FLASH
-window.onYouTubePlayerReady = function(id) {
- mejs.YouTubeApi.flashReady(id);
-};
-
-window.mejs = mejs;
-window.MediaElement = mejs.MediaElement;
-
-/*
- * Adds Internationalization and localization to mediaelement.
- *
- * This file does not contain translations, you have to add them manually.
- * The schema is always the same: me-i18n-locale-[IETF-language-tag].js
- *
- * Examples are provided both for german and chinese translation.
- *
- *
- * What is the concept beyond i18n?
- * http://en.wikipedia.org/wiki/Internationalization_and_localization
- *
- * What langcode should i use?
- * http://en.wikipedia.org/wiki/IETF_language_tag
- * https://tools.ietf.org/html/rfc5646
- *
- *
- * License?
- *
- * The i18n file uses methods from the Drupal project (drupal.js):
- * - i18n.methods.t() (modified)
- * - i18n.methods.checkPlain() (full copy)
- *
- * The Drupal project is (like mediaelementjs) licensed under GPLv2.
- * - http://drupal.org/licensing/faq/#q1
- * - https://github.com/johndyer/mediaelement
- * - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
- *
- *
- * @author
- * Tim Latz (latz.tim@gmail.com)
- *
- *
- * @params
- * - context - document, iframe ..
- * - exports - CommonJS, window ..
- *
- */
-;(function(context, exports, undefined) {
- "use strict";
-
- var i18n = {
- "locale": {
- // Ensure previous values aren't overwritten.
- "language" : (exports.i18n && exports.i18n.locale.language) || '',
- "strings" : (exports.i18n && exports.i18n.locale.strings) || {}
- },
- "ietf_lang_regex" : /^(x\-)?[a-z]{2,}(\-\w{2,})?(\-\w{2,})?$/,
- "methods" : {}
- };
-// start i18n
-
-
- /**
- * Get language, fallback to browser's language if empty
- *
- * IETF: RFC 5646, https://tools.ietf.org/html/rfc5646
- * Examples: en, zh-CN, cmn-Hans-CN, sr-Latn-RS, es-419, x-private
- */
- i18n.getLanguage = function () {
- var language = i18n.locale.language || window.navigator.userLanguage || window.navigator.language;
- return i18n.ietf_lang_regex.exec(language) ? language : null;
-
- //(WAS: convert to iso 639-1 (2-letters, lower case))
- //return language.substr(0, 2).toLowerCase();
- };
-
- // i18n fixes for compatibility with WordPress
- if ( typeof mejsL10n != 'undefined' ) {
- i18n.locale.language = mejsL10n.language;
- }
-
-
-
- /**
- * Encode special characters in a plain-text string for display as HTML.
- */
- i18n.methods.checkPlain = function (str) {
- var character, regex,
- replace = {
- '&': '&amp;',
- '"': '&quot;',
- '<': '&lt;',
- '>': '&gt;'
- };
- str = String(str);
- for (character in replace) {
- if (replace.hasOwnProperty(character)) {
- regex = new RegExp(character, 'g');
- str = str.replace(regex, replace[character]);
- }
- }
- return str;
- };
-
- /**
- * Translate strings to the page language or a given language.
- *
- *
- * @param str
- * A string containing the English string to translate.
- *
- * @param options
- * - 'context' (defaults to the default context): The context the source string
- * belongs to.
- *
- * @return
- * The translated string, escaped via i18n.methods.checkPlain()
- */
- i18n.methods.t = function (str, options) {
-
- // Fetch the localized version of the string.
- if (i18n.locale.strings && i18n.locale.strings[options.context] && i18n.locale.strings[options.context][str]) {
- str = i18n.locale.strings[options.context][str];
- }
-
- return i18n.methods.checkPlain(str);
- };
-
-
- /**
- * Wrapper for i18n.methods.t()
- *
- * @see i18n.methods.t()
- * @throws InvalidArgumentException
- */
- i18n.t = function(str, options) {
-
- if (typeof str === 'string' && str.length > 0) {
-
- // check every time due language can change for
- // different reasons (translation, lang switcher ..)
- var language = i18n.getLanguage();
-
- options = options || {
- "context" : language
- };
-
- return i18n.methods.t(str, options);
- }
- else {
- throw {
- "name" : 'InvalidArgumentException',
- "message" : 'First argument is either not a string or empty.'
- };
- }
- };
-
-// end i18n
- exports.i18n = i18n;
-}(document, mejs));
-
-// i18n fixes for compatibility with WordPress
-;(function(exports, undefined) {
-
- "use strict";
-
- if ( typeof mejsL10n != 'undefined' ) {
- exports[mejsL10n.language] = mejsL10n.strings;
- }
-
-}(mejs.i18n.locale.strings));
-
-/*!
- *
- * MediaElementPlayer
- * http://mediaelementjs.com/
- *
- * Creates a controller bar for HTML5 <video> add <audio> tags
- * using jQuery and MediaElement.js (HTML5 Flash/Silverlight wrapper)
- *
- * Copyright 2010-2013, John Dyer (http://j.hn/)
- * License: MIT
- *
- */
-if (typeof jQuery != 'undefined') {
- mejs.$ = jQuery;
-} else if (typeof Zepto != 'undefined') {
- mejs.$ = Zepto;
-
- // define `outerWidth` method which has not been realized in Zepto
- Zepto.fn.outerWidth = function(includeMargin) {
- var width = $(this).width();
- if (includeMargin) {
- width += parseInt($(this).css('margin-right'), 10);
- width += parseInt($(this).css('margin-left'), 10);
- }
- return width
- }
-
-} else if (typeof ender != 'undefined') {
- mejs.$ = ender;
-}
-(function ($) {
-
- // default player values
- mejs.MepDefaults = {
- // url to poster (to fix iOS 3.x)
- poster: '',
- // When the video is ended, we can show the poster.
- showPosterWhenEnded: false,
- // default if the <video width> is not specified
- defaultVideoWidth: 480,
- // default if the <video height> is not specified
- defaultVideoHeight: 270,
- // if set, overrides <video width>
- videoWidth: -1,
- // if set, overrides <video height>
- videoHeight: -1,
- // default if the user doesn't specify
- defaultAudioWidth: 400,
- // default if the user doesn't specify
- defaultAudioHeight: 30,
-
- // default amount to move back when back key is pressed
- defaultSeekBackwardInterval: function(media) {
- return (media.duration * 0.05);
- },
- // default amount to move forward when forward key is pressed
- defaultSeekForwardInterval: function(media) {
- return (media.duration * 0.05);
- },
-
- // set dimensions via JS instead of CSS
- setDimensions: true,
-
- // width of audio player
- audioWidth: -1,
- // height of audio player
- audioHeight: -1,
- // initial volume when the player starts (overrided by user cookie)
- startVolume: 0.8,
- // useful for <audio> player loops
- loop: false,
- // rewind to beginning when media ends
- autoRewind: true,
- // resize to media dimensions
- enableAutosize: true,
-
- /*
- * Time format to use. Default: 'mm:ss'
- * Supported units:
- * h: hour
- * m: minute
- * s: second
- * f: frame count
- * When using 'hh', 'mm', 'ss' or 'ff' we always display 2 digits.
- * If you use 'h', 'm', 's' or 'f' we display 1 digit if possible.
- *
- * Example to display 75 seconds:
- * Format 'mm:ss': 01:15
- * Format 'm:ss': 1:15
- * Format 'm:s': 1:15
- */
- timeFormat: '',
- // forces the hour marker (##:00:00)
- alwaysShowHours: false,
- // show framecount in timecode (##:00:00:00)
- showTimecodeFrameCount: false,
- // used when showTimecodeFrameCount is set to true
- framesPerSecond: 25,
-
- // automatically calculate the width of the progress bar based on the sizes of other elements
- autosizeProgress : true,
- // Hide controls when playing and mouse is not over the video
- alwaysShowControls: false,
- // Display the video control
- hideVideoControlsOnLoad: false,
- // Enable click video element to toggle play/pause
- clickToPlayPause: true,
- // force iPad's native controls
- iPadUseNativeControls: false,
- // force iPhone's native controls
- iPhoneUseNativeControls: false,
- // force Android's native controls
- AndroidUseNativeControls: false,
- // features to show
- features: ['playpause','current','progress','duration','tracks','volume','fullscreen'],
- // only for dynamic
- isVideo: true,
-
- // turns keyboard support on and off for this instance
- enableKeyboard: true,
-
- // whenthis player starts, it will pause other players
- pauseOtherPlayers: true,
-
- // array of keyboard actions such as play pause
- keyActions: [
- {
- keys: [
- 32, // SPACE
- 179 // GOOGLE play/pause button
- ],
- action: function(player, media) {
- if (media.paused || media.ended) {
- media.play();
- } else {
- media.pause();
- }
- }
- },
- {
- keys: [38], // UP
- action: function(player, media) {
- player.container.find('.mejs-volume-slider').css('display','block');
- if (player.isVideo) {
- player.showControls();
- player.startControlsTimer();
- }
-
- var newVolume = Math.min(media.volume + 0.1, 1);
- media.setVolume(newVolume);
- }
- },
- {
- keys: [40], // DOWN
- action: function(player, media) {
- player.container.find('.mejs-volume-slider').css('display','block');
- if (player.isVideo) {
- player.showControls();
- player.startControlsTimer();
- }
-
- var newVolume = Math.max(media.volume - 0.1, 0);
- media.setVolume(newVolume);
- }
- },
- {
- keys: [
- 37, // LEFT
- 227 // Google TV rewind
- ],
- action: function(player, media) {
- if (!isNaN(media.duration) && media.duration > 0) {
- if (player.isVideo) {
- player.showControls();
- player.startControlsTimer();
- }
-
- // 5%
- var newTime = Math.max(media.currentTime - player.options.defaultSeekBackwardInterval(media), 0);
- media.setCurrentTime(newTime);
- }
- }
- },
- {
- keys: [
- 39, // RIGHT
- 228 // Google TV forward
- ],
- action: function(player, media) {
- if (!isNaN(media.duration) && media.duration > 0) {
- if (player.isVideo) {
- player.showControls();
- player.startControlsTimer();
- }
-
- // 5%
- var newTime = Math.min(media.currentTime + player.options.defaultSeekForwardInterval(media), media.duration);
- media.setCurrentTime(newTime);
- }
- }
- },
- {
- keys: [70], // F
- action: function(player, media) {
- if (typeof player.enterFullScreen != 'undefined') {
- if (player.isFullScreen) {
- player.exitFullScreen();
- } else {
- player.enterFullScreen();
- }
- }
- }
- },
- {
- keys: [77], // M
- action: function(player, media) {
- player.container.find('.mejs-volume-slider').css('display','block');
- if (player.isVideo) {
- player.showControls();
- player.startControlsTimer();
- }
- if (player.media.muted) {
- player.setMuted(false);
- } else {
- player.setMuted(true);
- }
- }
- }
- ]
- };
-
- mejs.mepIndex = 0;
-
- mejs.players = {};
-
- // wraps a MediaElement object in player controls
- mejs.MediaElementPlayer = function(node, o) {
- // enforce object, even without "new" (via John Resig)
- if ( !(this instanceof mejs.MediaElementPlayer) ) {
- return new mejs.MediaElementPlayer(node, o);
- }
-
- var t = this;
-
- // these will be reset after the MediaElement.success fires
- t.$media = t.$node = $(node);
- t.node = t.media = t.$media[0];
-
- if(!t.node) {
- return
- }
-
- // check for existing player
- if (typeof t.node.player != 'undefined') {
- return t.node.player;
- }
-
-
- // try to get options from data-mejsoptions
- if (typeof o == 'undefined') {
- o = t.$node.data('mejsoptions');
- }
-
- // extend default options
- t.options = $.extend({},mejs.MepDefaults,o);
-
- if (!t.options.timeFormat) {
- // Generate the time format according to options
- t.options.timeFormat = 'mm:ss';
- if (t.options.alwaysShowHours) {
- t.options.timeFormat = 'hh:mm:ss';
- }
- if (t.options.showTimecodeFrameCount) {
- t.options.timeFormat += ':ff';
- }
- }
-
- mejs.Utility.calculateTimeFormat(0, t.options, t.options.framesPerSecond || 25);
-
- // unique ID
- t.id = 'mep_' + mejs.mepIndex++;
-
- // add to player array (for focus events)
- mejs.players[t.id] = t;
-
- // start up
- t.init();
-
- return t;
- };
-
- // actual player
- mejs.MediaElementPlayer.prototype = {
-
- hasFocus: false,
-
- controlsAreVisible: true,
-
- init: function() {
-
- var
- t = this,
- mf = mejs.MediaFeatures,
- // options for MediaElement (shim)
- meOptions = $.extend(true, {}, t.options, {
- success: function(media, domNode) { t.meReady(media, domNode); },
- error: function(e) { t.handleError(e);}
- }),
- tagName = t.media.tagName.toLowerCase();
-
- t.isDynamic = (tagName !== 'audio' && tagName !== 'video');
-
- if (t.isDynamic) {
- // get video from src or href?
- t.isVideo = t.options.isVideo;
- } else {
- t.isVideo = (tagName !== 'audio' && t.options.isVideo);
- }
-
- // use native controls in iPad, iPhone, and Android
- if ((mf.isiPad && t.options.iPadUseNativeControls) || (mf.isiPhone && t.options.iPhoneUseNativeControls)) {
-
- // add controls and stop
- t.$media.attr('controls', 'controls');
-
- // attempt to fix iOS 3 bug
- //t.$media.removeAttr('poster');
- // no Issue found on iOS3 -ttroxell
-
- // override Apple's autoplay override for iPads
- if (mf.isiPad && t.media.getAttribute('autoplay') !== null) {
- t.play();
- }
-
- } else if (mf.isAndroid && t.options.AndroidUseNativeControls) {
-
- // leave default player
-
- } else {
-
- // DESKTOP: use MediaElementPlayer controls
-
- // remove native controls
- t.$media.removeAttr('controls');
- var videoPlayerTitle = t.isVideo ?
- mejs.i18n.t('Video Player') : mejs.i18n.t('Audio Player');
- // insert description for screen readers
- $('<span class="mejs-offscreen">' + videoPlayerTitle + '</span>').insertBefore(t.$media);
- // build container
- t.container =
- $('<div id="' + t.id + '" class="mejs-container ' + (mejs.MediaFeatures.svgAsImg ? 'svg' : 'no-svg') +
- '" tabindex="0" role="application" aria-label="' + videoPlayerTitle + '">'+
- '<div class="mejs-inner">'+
- '<div class="mejs-mediaelement"></div>'+
- '<div class="mejs-layers"></div>'+
- '<div class="mejs-controls"></div>'+
- '<div class="mejs-clear"></div>'+
- '</div>' +
- '</div>')
- .addClass(t.$media[0].className)
- .insertBefore(t.$media)
- .focus(function ( e ) {
- if( !t.controlsAreVisible ) {
- t.showControls(true);
- var playButton = t.container.find('.mejs-playpause-button > button');
- playButton.focus();
- }
- });
-
- // add classes for user and content
- t.container.addClass(
- (mf.isAndroid ? 'mejs-android ' : '') +
- (mf.isiOS ? 'mejs-ios ' : '') +
- (mf.isiPad ? 'mejs-ipad ' : '') +
- (mf.isiPhone ? 'mejs-iphone ' : '') +
- (t.isVideo ? 'mejs-video ' : 'mejs-audio ')
- );
-
-
- // move the <video/video> tag into the right spot
- t.container.find('.mejs-mediaelement').append(t.$media);
-
- // needs to be assigned here, after iOS remap
- t.node.player = t;
-
- // find parts
- t.controls = t.container.find('.mejs-controls');
- t.layers = t.container.find('.mejs-layers');
-
- // determine the size
-
- /* size priority:
- (1) videoWidth (forced),
- (2) style="width;height;"
- (3) width attribute,
- (4) defaultVideoWidth (for unspecified cases)
- */
-
- var tagType = (t.isVideo ? 'video' : 'audio'),
- capsTagName = tagType.substring(0,1).toUpperCase() + tagType.substring(1);
-
-
-
- if (t.options[tagType + 'Width'] > 0 || t.options[tagType + 'Width'].toString().indexOf('%') > -1) {
- t.width = t.options[tagType + 'Width'];
- } else if (t.media.style.width !== '' && t.media.style.width !== null) {
- t.width = t.media.style.width;
- } else if (t.media.getAttribute('width') !== null) {
- t.width = t.$media.attr('width');
- } else {
- t.width = t.options['default' + capsTagName + 'Width'];
- }
-
- if (t.options[tagType + 'Height'] > 0 || t.options[tagType + 'Height'].toString().indexOf('%') > -1) {
- t.height = t.options[tagType + 'Height'];
- } else if (t.media.style.height !== '' && t.media.style.height !== null) {
- t.height = t.media.style.height;
- } else if (t.$media[0].getAttribute('height') !== null) {
- t.height = t.$media.attr('height');
- } else {
- t.height = t.options['default' + capsTagName + 'Height'];
- }
-
- // set the size, while we wait for the plugins to load below
- t.setPlayerSize(t.width, t.height);
-
- // create MediaElementShim
- meOptions.pluginWidth = t.width;
- meOptions.pluginHeight = t.height;
- }
-
- // create MediaElement shim
- mejs.MediaElement(t.$media[0], meOptions);
-
- if (typeof(t.container) != 'undefined' && t.controlsAreVisible){
- // controls are shown when loaded
- t.container.trigger('controlsshown');
- }
- },
-
- showControls: function(doAnimation) {
- var t = this;
-
- doAnimation = typeof doAnimation == 'undefined' || doAnimation;
-
- if (t.controlsAreVisible)
- return;
-
- if (doAnimation) {
- t.controls
- .removeClass('mejs-offscreen')
- .stop(true, true).fadeIn(200, function() {
- t.controlsAreVisible = true;
- t.container.trigger('controlsshown');
- });
-
- // any additional controls people might add and want to hide
- t.container.find('.mejs-control')
- .removeClass('mejs-offscreen')
- .stop(true, true).fadeIn(200, function() {t.controlsAreVisible = true;});
-
- } else {
- t.controls
- .removeClass('mejs-offscreen')
- .css('display','block');
-
- // any additional controls people might add and want to hide
- t.container.find('.mejs-control')
- .removeClass('mejs-offscreen')
- .css('display','block');
-
- t.controlsAreVisible = true;
- t.container.trigger('controlsshown');
- }
-
- t.setControlsSize();
-
- },
-
- hideControls: function(doAnimation) {
- var t = this;
-
- doAnimation = typeof doAnimation == 'undefined' || doAnimation;
-
- if (!t.controlsAreVisible || t.options.alwaysShowControls || t.keyboardAction)
- return;
-
- if (doAnimation) {
- // fade out main controls
- t.controls.stop(true, true).fadeOut(200, function() {
- $(this)
- .addClass('mejs-offscreen')
- .css('display','block');
-
- t.controlsAreVisible = false;
- t.container.trigger('controlshidden');
- });
-
- // any additional controls people might add and want to hide
- t.container.find('.mejs-control').stop(true, true).fadeOut(200, function() {
- $(this)
- .addClass('mejs-offscreen')
- .css('display','block');
- });
- } else {
-
- // hide main controls
- t.controls
- .addClass('mejs-offscreen')
- .css('display','block');
-
- // hide others
- t.container.find('.mejs-control')
- .addClass('mejs-offscreen')
- .css('display','block');
-
- t.controlsAreVisible = false;
- t.container.trigger('controlshidden');
- }
- },
-
- controlsTimer: null,
-
- startControlsTimer: function(timeout) {
-
- var t = this;
-
- timeout = typeof timeout != 'undefined' ? timeout : 1500;
-
- t.killControlsTimer('start');
-
- t.controlsTimer = setTimeout(function() {
- //
- t.hideControls();
- t.killControlsTimer('hide');
- }, timeout);
- },
-
- killControlsTimer: function(src) {
-
- var t = this;
-
- if (t.controlsTimer !== null) {
- clearTimeout(t.controlsTimer);
- delete t.controlsTimer;
- t.controlsTimer = null;
- }
- },
-
- controlsEnabled: true,
-
- disableControls: function() {
- var t= this;
-
- t.killControlsTimer();
- t.hideControls(false);
- this.controlsEnabled = false;
- },
-
- enableControls: function() {
- var t= this;
-
- t.showControls(false);
-
- t.controlsEnabled = true;
- },
-
-
- // Sets up all controls and events
- meReady: function(media, domNode) {
-
-
- var t = this,
- mf = mejs.MediaFeatures,
- autoplayAttr = domNode.getAttribute('autoplay'),
- autoplay = !(typeof autoplayAttr == 'undefined' || autoplayAttr === null || autoplayAttr === 'false'),
- featureIndex,
- feature;
-
- // make sure it can't create itself again if a plugin reloads
- if (t.created) {
- return;
- } else {
- t.created = true;
- }
-
- t.media = media;
- t.domNode = domNode;
-
- if (!(mf.isAndroid && t.options.AndroidUseNativeControls) && !(mf.isiPad && t.options.iPadUseNativeControls) && !(mf.isiPhone && t.options.iPhoneUseNativeControls)) {
-
- // two built in features
- t.buildposter(t, t.controls, t.layers, t.media);
- t.buildkeyboard(t, t.controls, t.layers, t.media);
- t.buildoverlays(t, t.controls, t.layers, t.media);
-
- // grab for use by features
- t.findTracks();
-
- // add user-defined features/controls
- for (featureIndex in t.options.features) {
- feature = t.options.features[featureIndex];
- if (t['build' + feature]) {
- try {
- t['build' + feature](t, t.controls, t.layers, t.media);
- } catch (e) {
- // TODO: report control error
- //throw e;
-
-
- }
- }
- }
-
- t.container.trigger('controlsready');
-
- // reset all layers and controls
- t.setPlayerSize(t.width, t.height);
- t.setControlsSize();
-
-
- // controls fade
- if (t.isVideo) {
-
- if (mejs.MediaFeatures.hasTouch) {
-
- // for touch devices (iOS, Android)
- // show/hide without animation on touch
-
- t.$media.bind('touchstart', function() {
-
-
- // toggle controls
- if (t.controlsAreVisible) {
- t.hideControls(false);
- } else {
- if (t.controlsEnabled) {
- t.showControls(false);
- }
- }
- });
-
- } else {
-
- // create callback here since it needs access to current
- // MediaElement object
- t.clickToPlayPauseCallback = function() {
- //
-
- if (t.options.clickToPlayPause) {
- if (t.media.paused) {
- t.play();
- } else {
- t.pause();
- }
- }
- };
-
- // click to play/pause
- t.media.addEventListener('click', t.clickToPlayPauseCallback, false);
-
- // show/hide controls
- t.container
- .bind('mouseenter', function () {
- if (t.controlsEnabled) {
- if (!t.options.alwaysShowControls ) {
- t.killControlsTimer('enter');
- t.showControls();
- t.startControlsTimer(2500);
- }
- }
- })
- .bind('mousemove', function() {
- if (t.controlsEnabled) {
- if (!t.controlsAreVisible) {
- t.showControls();
- }
- if (!t.options.alwaysShowControls) {
- t.startControlsTimer(2500);
- }
- }
- })
- .bind('mouseleave', function () {
- if (t.controlsEnabled) {
- if (!t.media.paused && !t.options.alwaysShowControls) {
- t.startControlsTimer(1000);
- }
- }
- });
- }
-
- if(t.options.hideVideoControlsOnLoad) {
- t.hideControls(false);
- }
-
- // check for autoplay
- if (autoplay && !t.options.alwaysShowControls) {
- t.hideControls();
- }
-
- // resizer
- if (t.options.enableAutosize) {
- t.media.addEventListener('loadedmetadata', function(e) {
- // if the <video height> was not set and the options.videoHeight was not set
- // then resize to the real dimensions
- if (t.options.videoHeight <= 0 && t.domNode.getAttribute('height') === null && !isNaN(e.target.videoHeight)) {
- t.setPlayerSize(e.target.videoWidth, e.target.videoHeight);
- t.setControlsSize();
- t.media.setVideoSize(e.target.videoWidth, e.target.videoHeight);
- }
- }, false);
- }
- }
-
- // EVENTS
-
- // FOCUS: when a video starts playing, it takes focus from other players (possibily pausing them)
- media.addEventListener('play', function() {
- var playerIndex;
-
- // go through all other players
- for (playerIndex in mejs.players) {
- var p = mejs.players[playerIndex];
- if (p.id != t.id && t.options.pauseOtherPlayers && !p.paused && !p.ended) {
- p.pause();
- }
- p.hasFocus = false;
- }
-
- t.hasFocus = true;
- },false);
-
-
- // ended for all
- t.media.addEventListener('ended', function (e) {
- if(t.options.autoRewind) {
- try{
- t.media.setCurrentTime(0);
- // Fixing an Android stock browser bug, where "seeked" isn't fired correctly after ending the video and jumping to the beginning
- window.setTimeout(function(){
- $(t.container).find('.mejs-overlay-loading').parent().hide();
- }, 20);
- } catch (exp) {
-
- }
- }
- t.media.pause();
-
- if (t.setProgressRail) {
- t.setProgressRail();
- }
- if (t.setCurrentRail) {
- t.setCurrentRail();
- }
-
- if (t.options.loop) {
- t.play();
- } else if (!t.options.alwaysShowControls && t.controlsEnabled) {
- t.showControls();
- }
- }, false);
-
- // resize on the first play
- t.media.addEventListener('loadedmetadata', function(e) {
- if (t.updateDuration) {
- t.updateDuration();
- }
- if (t.updateCurrent) {
- t.updateCurrent();
- }
-
- if (!t.isFullScreen) {
- t.setPlayerSize(t.width, t.height);
- t.setControlsSize();
- }
- }, false);
-
- // Only change the time format when necessary
- var duration = null;
- t.media.addEventListener('timeupdate',function() {
- if (duration !== this.duration) {
- duration = this.duration;
- mejs.Utility.calculateTimeFormat(duration, t.options, t.options.framesPerSecond || 25);
-
- // make sure to fill in and resize the controls (e.g., 00:00 => 01:13:15
- if (t.updateDuration) {
- t.updateDuration();
- }
- if (t.updateCurrent) {
- t.updateCurrent();
- }
- t.setControlsSize();
-
- }
- }, false);
-
- t.container.focusout(function (e) {
- if( e.relatedTarget ) { //FF is working on supporting focusout https://bugzilla.mozilla.org/show_bug.cgi?id=687787
- var $target = $(e.relatedTarget);
- if (t.keyboardAction && $target.parents('.mejs-container').length === 0) {
- t.keyboardAction = false;
- t.hideControls(true);
- }
- }
- });
-
- // webkit has trouble doing this without a delay
- setTimeout(function () {
- t.setPlayerSize(t.width, t.height);
- t.setControlsSize();
- }, 50);
-
- // adjust controls whenever window sizes (used to be in fullscreen only)
- t.globalBind('resize', function() {
-
- // don't resize for fullscreen mode
- if ( !(t.isFullScreen || (mejs.MediaFeatures.hasTrueNativeFullScreen && document.webkitIsFullScreen)) ) {
- t.setPlayerSize(t.width, t.height);
- }
-
- // always adjust controls
- t.setControlsSize();
- });
-
- // This is a work-around for a bug in the YouTube iFrame player, which means
- // we can't use the play() API for the initial playback on iOS or Android;
- // user has to start playback directly by tapping on the iFrame.
- if (t.media.pluginType == 'youtube' && ( mf.isiOS || mf.isAndroid ) ) {
- t.container.find('.mejs-overlay-play').hide();
- t.container.find('.mejs-poster').hide();
- }
- }
-
- // force autoplay for HTML5
- if (autoplay && media.pluginType == 'native') {
- t.play();
- }
-
-
- if (t.options.success) {
-
- if (typeof t.options.success == 'string') {
- window[t.options.success](t.media, t.domNode, t);
- } else {
- t.options.success(t.media, t.domNode, t);
- }
- }
- },
-
- handleError: function(e) {
- var t = this;
-
- if (t.controls) {
- t.controls.hide();
- }
-
- // Tell user that the file cannot be played
- if (t.options.error) {
- t.options.error(e);
- }
- },
-
- setPlayerSize: function(width,height) {
- var t = this;
-
- if( !t.options.setDimensions ) {
- return false;
- }
-
- if (typeof width != 'undefined') {
- t.width = width;
- }
-
- if (typeof height != 'undefined') {
- t.height = height;
- }
-
- // detect 100% mode - use currentStyle for IE since css() doesn't return percentages
- if (t.height.toString().indexOf('%') > 0 || (t.$node.css('max-width') !== 'none' && t.$node.css('max-width') !== 't.width') || (t.$node[0].currentStyle && t.$node[0].currentStyle.maxWidth === '100%')) {
-
- // do we have the native dimensions yet?
- var nativeWidth = (function() {
- if (t.isVideo) {
- if (t.media.videoWidth && t.media.videoWidth > 0) {
- return t.media.videoWidth;
- } else if (t.media.getAttribute('width') !== null) {
- return t.media.getAttribute('width');
- } else {
- return t.options.defaultVideoWidth;
- }
- } else {
- return t.options.defaultAudioWidth;
- }
- })();
-
- var nativeHeight = (function() {
- if (t.isVideo) {
- if (t.media.videoHeight && t.media.videoHeight > 0) {
- return t.media.videoHeight;
- } else if (t.media.getAttribute('height') !== null) {
- return t.media.getAttribute('height');
- } else {
- return t.options.defaultVideoHeight;
- }
- } else {
- return t.options.defaultAudioHeight;
- }
- })();
-
- var
- parentWidth = t.container.parent().closest(':visible').width(),
- parentHeight = t.container.parent().closest(':visible').height(),
- newHeight = t.isVideo || !t.options.autosizeProgress ? parseInt(parentWidth * nativeHeight/nativeWidth, 10) : nativeHeight;
-
- // When we use percent, the newHeight can't be calculated so we get the container height
- if (isNaN(newHeight)) {
- newHeight = parentHeight;
- }
-
- if (t.container.parent().length > 0 && t.container.parent()[0].tagName.toLowerCase() === 'body') { // && t.container.siblings().count == 0) {
- parentWidth = $(window).width();
- newHeight = $(window).height();
- }
-
- if ( newHeight && parentWidth ) {
-
- // set outer container size
- t.container
- .width(parentWidth)
- .height(newHeight);
-
- // set native <video> or <audio> and shims
- t.$media.add(t.container.find('.mejs-shim'))
- .width('100%')
- .height('100%');
-
- // if shim is ready, send the size to the embeded plugin
- if (t.isVideo) {
- if (t.media.setVideoSize) {
- t.media.setVideoSize(parentWidth, newHeight);
- }
- }
-
- // set the layers
- t.layers.children('.mejs-layer')
- .width('100%')
- .height('100%');
- }
-
-
- } else {
-
- t.container
- .width(t.width)
- .height(t.height);
-
- t.layers.children('.mejs-layer')
- .width(t.width)
- .height(t.height);
-
- }
-
- },
-
- setControlsSize: function() {
- var t = this,
- usedWidth = 0,
- railWidth = 0,
- rail = t.controls.find('.mejs-time-rail'),
- total = t.controls.find('.mejs-time-total'),
- others = rail.siblings(),
- lastControl = others.last(),
- lastControlPosition = null;
-
- // skip calculation if hidden
- if (!t.container.is(':visible') || !rail.length || !rail.is(':visible')) {
- return;
- }
-
-
- // allow the size to come from custom CSS
- if (t.options && !t.options.autosizeProgress) {
- // Also, frontends devs can be more flexible
- // due the opportunity of absolute positioning.
- railWidth = parseInt(rail.css('width'), 10);
- }
-
- // attempt to autosize
- if (railWidth === 0 || !railWidth) {
-
- // find the size of all the other controls besides the rail
- others.each(function() {
- var $this = $(this);
- if ($this.css('position') != 'absolute' && $this.is(':visible')) {
- usedWidth += $(this).outerWidth(true);
- }
- });
-
- // fit the rail into the remaining space
- railWidth = t.controls.width() - usedWidth - (rail.outerWidth(true) - rail.width());
- }
-
- // resize the rail,
- // but then check if the last control (say, the fullscreen button) got pushed down
- // this often happens when zoomed
- do {
- // outer area
- rail.width(railWidth);
- // dark space
- total.width(railWidth - (total.outerWidth(true) - total.width()));
-
- if (lastControl.css('position') != 'absolute') {
- lastControlPosition = lastControl.length ? lastControl.position() : null;
- railWidth--;
- }
- } while (lastControlPosition !== null && lastControlPosition.top.toFixed(2) > 0 && railWidth > 0);
-
- t.container.trigger('controlsresize');
- },
-
-
- buildposter: function(player, controls, layers, media) {
- var t = this,
- poster =
- $('<div class="mejs-poster mejs-layer">' +
- '</div>')
- .appendTo(layers),
- posterUrl = player.$media.attr('poster');
-
- // prioriy goes to option (this is useful if you need to support iOS 3.x (iOS completely fails with poster)
- if (player.options.poster !== '') {
- posterUrl = player.options.poster;
- }
-
- // second, try the real poster
- if ( posterUrl ) {
- t.setPoster(posterUrl);
- } else {
- poster.hide();
- }
-
- media.addEventListener('play',function() {
- poster.hide();
- }, false);
-
- if(player.options.showPosterWhenEnded && player.options.autoRewind){
- media.addEventListener('ended',function() {
- poster.show();
- }, false);
- }
- },
-
- setPoster: function(url) {
- var t = this,
- posterDiv = t.container.find('.mejs-poster'),
- posterImg = posterDiv.find('img');
-
- if (posterImg.length === 0) {
- posterImg = $('<img width="100%" height="100%" alt="" />').appendTo(posterDiv);
- }
-
- posterImg.attr('src', url);
- posterDiv.css({'background-image' : 'url(' + url + ')'});
- },
-
- buildoverlays: function(player, controls, layers, media) {
- var t = this;
- if (!player.isVideo)
- return;
-
- var
- loading =
- $('<div class="mejs-overlay mejs-layer">'+
- '<div class="mejs-overlay-loading"><span></span></div>'+
- '</div>')
- .hide() // start out hidden
- .appendTo(layers),
- error =
- $('<div class="mejs-overlay mejs-layer">'+
- '<div class="mejs-overlay-error"></div>'+
- '</div>')
- .hide() // start out hidden
- .appendTo(layers),
- // this needs to come last so it's on top
- bigPlay =
- $('<div class="mejs-overlay mejs-layer mejs-overlay-play">'+
- '<div class="mejs-overlay-button"></div>'+
- '</div>')
- .appendTo(layers)
- .bind('click', function() { // Removed 'touchstart' due issues on Samsung Android devices where a tap on bigPlay started and immediately stopped the video
- if (t.options.clickToPlayPause) {
- if (media.paused) {
- media.play();
- }
- }
- });
-
- /*
- if (mejs.MediaFeatures.isiOS || mejs.MediaFeatures.isAndroid) {
- bigPlay.remove();
- loading.remove();
- }
- */
-
-
- // show/hide big play button
- media.addEventListener('play',function() {
- bigPlay.hide();
- loading.hide();
- controls.find('.mejs-time-buffering').hide();
- error.hide();
- }, false);
-
- media.addEventListener('playing', function() {
- bigPlay.hide();
- loading.hide();
- controls.find('.mejs-time-buffering').hide();
- error.hide();
- }, false);
-
- media.addEventListener('seeking', function() {
- loading.show();
- controls.find('.mejs-time-buffering').show();
- }, false);
-
- media.addEventListener('seeked', function() {
- loading.hide();
- controls.find('.mejs-time-buffering').hide();
- }, false);
-
- media.addEventListener('pause',function() {
- if (!mejs.MediaFeatures.isiPhone) {
- bigPlay.show();
- }
- }, false);
-
- media.addEventListener('waiting', function() {
- loading.show();
- controls.find('.mejs-time-buffering').show();
- }, false);
-
-
- // show/hide loading
- media.addEventListener('loadeddata',function() {
- // for some reason Chrome is firing this event
- //if (mejs.MediaFeatures.isChrome && media.getAttribute && media.getAttribute('preload') === 'none')
- // return;
-
- loading.show();
- controls.find('.mejs-time-buffering').show();
- // Firing the 'canplay' event after a timeout which isn't getting fired on some Android 4.1 devices (https://github.com/johndyer/mediaelement/issues/1305)
- if (mejs.MediaFeatures.isAndroid) {
- media.canplayTimeout = window.setTimeout(
- function() {
- if (document.createEvent) {
- var evt = document.createEvent('HTMLEvents');
- evt.initEvent('canplay', true, true);
- return media.dispatchEvent(evt);
- }
- }, 300
- );
- }
- }, false);
- media.addEventListener('canplay',function() {
- loading.hide();
- controls.find('.mejs-time-buffering').hide();
- clearTimeout(media.canplayTimeout); // Clear timeout inside 'loadeddata' to prevent 'canplay' to fire twice
- }, false);
-
- // error handling
- media.addEventListener('error',function(e) {
- t.handleError(e);
- loading.hide();
- bigPlay.hide();
- error.show();
- error.find('.mejs-overlay-error').html("Error loading this resource");
- }, false);
-
- media.addEventListener('keydown', function(e) {
- t.onkeydown(player, media, e);
- }, false);
- },
-
- buildkeyboard: function(player, controls, layers, media) {
-
- var t = this;
-
- t.container.keydown(function () {
- t.keyboardAction = true;
- });
-
- // listen for key presses
- t.globalBind('keydown', function(event) {
- player.hasFocus = $(event.target).closest('.mejs-container').length !== 0
- && $(event.target).closest('.mejs-container').attr('id') === player.$media.closest('.mejs-container').attr('id');
- return t.onkeydown(player, media, event);
- });
-
-
- // check if someone clicked outside a player region, then kill its focus
- t.globalBind('click', function(event) {
- player.hasFocus = $(event.target).closest('.mejs-container').length !== 0;
- });
-
- },
- onkeydown: function(player, media, e) {
- if (player.hasFocus && player.options.enableKeyboard) {
- // find a matching key
- for (var i = 0, il = player.options.keyActions.length; i < il; i++) {
- var keyAction = player.options.keyActions[i];
-
- for (var j = 0, jl = keyAction.keys.length; j < jl; j++) {
- if (e.keyCode == keyAction.keys[j]) {
- if (typeof(e.preventDefault) == "function") e.preventDefault();
- keyAction.action(player, media, e.keyCode, e);
- return false;
- }
- }
- }
- }
-
- return true;
- },
-
- findTracks: function() {
- var t = this,
- tracktags = t.$media.find('track');
-
- // store for use by plugins
- t.tracks = [];
- tracktags.each(function(index, track) {
-
- track = $(track);
-
- t.tracks.push({
- srclang: (track.attr('srclang')) ? track.attr('srclang').toLowerCase() : '',
- src: track.attr('src'),
- kind: track.attr('kind'),
- label: track.attr('label') || '',
- entries: [],
- isLoaded: false
- });
- });
- },
- changeSkin: function(className) {
- this.container[0].className = 'mejs-container ' + className;
- this.setPlayerSize(this.width, this.height);
- this.setControlsSize();
- },
- play: function() {
- this.load();
- this.media.play();
- },
- pause: function() {
- try {
- this.media.pause();
- } catch (e) {}
- },
- load: function() {
- if (!this.isLoaded) {
- this.media.load();
- }
-
- this.isLoaded = true;
- },
- setMuted: function(muted) {
- this.media.setMuted(muted);
- },
- setCurrentTime: function(time) {
- this.media.setCurrentTime(time);
- },
- getCurrentTime: function() {
- return this.media.currentTime;
- },
- setVolume: function(volume) {
- this.media.setVolume(volume);
- },
- getVolume: function() {
- return this.media.volume;
- },
- setSrc: function(src) {
- this.media.setSrc(src);
- },
- remove: function() {
- var t = this, featureIndex, feature;
-
- t.container.prev('.mejs-offscreen').remove();
-
- // invoke features cleanup
- for (featureIndex in t.options.features) {
- feature = t.options.features[featureIndex];
- if (t['clean' + feature]) {
- try {
- t['clean' + feature](t);
- } catch (e) {
- // TODO: report control error
- //throw e;
- //
- //
- }
- }
- }
-
- // grab video and put it back in place
- if (!t.isDynamic) {
- t.$media.prop('controls', true);
- // detach events from the video
- // TODO: detach event listeners better than this;
- // also detach ONLY the events attached by this plugin!
- t.$node.clone().insertBefore(t.container).show();
- t.$node.remove();
- } else {
- t.$node.insertBefore(t.container);
- }
-
- if (t.media.pluginType !== 'native') {
- t.media.remove();
- }
-
- // Remove the player from the mejs.players object so that pauseOtherPlayers doesn't blow up when trying to pause a non existance flash api.
- delete mejs.players[t.id];
-
- if (typeof t.container == 'object') {
- t.container.remove();
- }
- t.globalUnbind();
- delete t.node.player;
- },
- rebuildtracks: function(){
- var t = this;
- t.findTracks();
- t.buildtracks(t, t.controls, t.layers, t.media);
- },
- resetSize: function(){
- var t = this;
- // webkit has trouble doing this without a delay
- setTimeout(function () {
- //
- t.setPlayerSize(t.width, t.height);
- t.setControlsSize();
- }, 50);
- }
- };
-
- (function(){
- var rwindow = /^((after|before)print|(before)?unload|hashchange|message|o(ff|n)line|page(hide|show)|popstate|resize|storage)\b/;
-
- function splitEvents(events, id) {
- // add player ID as an event namespace so it's easier to unbind them all later
- var ret = {d: [], w: []};
- $.each((events || '').split(' '), function(k, v){
- var eventname = v + '.' + id;
- if (eventname.indexOf('.') === 0) {
- ret.d.push(eventname);
- ret.w.push(eventname);
- }
- else {
- ret[rwindow.test(v) ? 'w' : 'd'].push(eventname);
- }
- });
- ret.d = ret.d.join(' ');
- ret.w = ret.w.join(' ');
- return ret;
- }
-
- mejs.MediaElementPlayer.prototype.globalBind = function(events, data, callback) {
- var t = this;
- var doc = t.node ? t.node.ownerDocument : document;
-
- events = splitEvents(events, t.id);
- if (events.d) $(doc).bind(events.d, data, callback);
- if (events.w) $(window).bind(events.w, data, callback);
- };
-
- mejs.MediaElementPlayer.prototype.globalUnbind = function(events, callback) {
- var t = this;
- var doc = t.node ? t.node.ownerDocument : document;
-
- events = splitEvents(events, t.id);
- if (events.d) $(doc).unbind(events.d, callback);
- if (events.w) $(window).unbind(events.w, callback);
- };
- })();
-
- // turn into jQuery plugin
- if (typeof $ != 'undefined') {
- $.fn.mediaelementplayer = function (options) {
- if (options === false) {
- this.each(function () {
- var player = $(this).data('mediaelementplayer');
- if (player) {
- player.remove();
- }
- $(this).removeData('mediaelementplayer');
- });
- }
- else {
- this.each(function () {
- $(this).data('mediaelementplayer', new mejs.MediaElementPlayer(this, options));
- });
- }
- return this;
- };
-
-
- $(document).ready(function() {
- // auto enable using JSON attribute
- $('.mejs-player').mediaelementplayer();
- });
- }
-
- // push out to window
- window.MediaElementPlayer = mejs.MediaElementPlayer;
-
-})(mejs.$);
-
-(function($) {
-
- $.extend(mejs.MepDefaults, {
- playText: mejs.i18n.t('Play'),
- pauseText: mejs.i18n.t('Pause')
- });
-
- // PLAY/pause BUTTON
- $.extend(MediaElementPlayer.prototype, {
- buildplaypause: function(player, controls, layers, media) {
- var
- t = this,
- op = t.options,
- play =
- $('<div class="mejs-button mejs-playpause-button mejs-play" >' +
- '<button type="button" aria-controls="' + t.id + '" title="' + op.playText + '" aria-label="' + op.playText + '"></button>' +
- '</div>')
- .appendTo(controls)
- .click(function(e) {
- e.preventDefault();
-
- if (media.paused) {
- media.play();
- } else {
- media.pause();
- }
-
- return false;
- }),
- play_btn = play.find('button');
-
-
- function togglePlayPause(which) {
- if ('play' === which) {
- play.removeClass('mejs-play').addClass('mejs-pause');
- play_btn.attr({
- 'title': op.pauseText,
- 'aria-label': op.pauseText
- });
- } else {
- play.removeClass('mejs-pause').addClass('mejs-play');
- play_btn.attr({
- 'title': op.playText,
- 'aria-label': op.playText
- });
- }
- };
- togglePlayPause('pse');
-
-
- media.addEventListener('play',function() {
- togglePlayPause('play');
- }, false);
- media.addEventListener('playing',function() {
- togglePlayPause('play');
- }, false);
-
-
- media.addEventListener('pause',function() {
- togglePlayPause('pse');
- }, false);
- media.addEventListener('paused',function() {
- togglePlayPause('pse');
- }, false);
- }
- });
-
-})(mejs.$);
-
-(function($) {
-
- $.extend(mejs.MepDefaults, {
- stopText: 'Stop'
- });
-
- // STOP BUTTON
- $.extend(MediaElementPlayer.prototype, {
- buildstop: function(player, controls, layers, media) {
- var t = this;
-
- $('<div class="mejs-button mejs-stop-button mejs-stop">' +
- '<button type="button" aria-controls="' + t.id + '" title="' + t.options.stopText + '" aria-label="' + t.options.stopText + '"></button>' +
- '</div>')
- .appendTo(controls)
- .click(function() {
- if (!media.paused) {
- media.pause();
- }
- if (media.currentTime > 0) {
- media.setCurrentTime(0);
- media.pause();
- controls.find('.mejs-time-current').width('0px');
- controls.find('.mejs-time-handle').css('left', '0px');
- controls.find('.mejs-time-float-current').html( mejs.Utility.secondsToTimeCode(0, player.options));
- controls.find('.mejs-currenttime').html( mejs.Utility.secondsToTimeCode(0, player.options));
- layers.find('.mejs-poster').show();
- }
- });
- }
- });
-
-})(mejs.$);
-
-(function($) {
-
- $.extend(mejs.MepDefaults, {
- progessHelpText: mejs.i18n.t(
- 'Use Left/Right Arrow keys to advance one second, Up/Down arrows to advance ten seconds.')
- });
-
- // progress/loaded bar
- $.extend(MediaElementPlayer.prototype, {
- buildprogress: function(player, controls, layers, media) {
-
- $('<div class="mejs-time-rail">' +
- '<span class="mejs-time-total mejs-time-slider">' +
- //'<span class="mejs-offscreen">' + this.options.progessHelpText + '</span>' +
- '<span class="mejs-time-buffering"></span>' +
- '<span class="mejs-time-loaded"></span>' +
- '<span class="mejs-time-current"></span>' +
- '<span class="mejs-time-handle"></span>' +
- '<span class="mejs-time-float">' +
- '<span class="mejs-time-float-current">00:00</span>' +
- '<span class="mejs-time-float-corner"></span>' +
- '</span>' +
- '</span>' +
- '</div>')
- .appendTo(controls);
- controls.find('.mejs-time-buffering').hide();
-
- var
- t = this,
- total = controls.find('.mejs-time-total'),
- loaded = controls.find('.mejs-time-loaded'),
- current = controls.find('.mejs-time-current'),
- handle = controls.find('.mejs-time-handle'),
- timefloat = controls.find('.mejs-time-float'),
- timefloatcurrent = controls.find('.mejs-time-float-current'),
- slider = controls.find('.mejs-time-slider'),
- handleMouseMove = function (e) {
-
- var offset = total.offset(),
- width = total.width(),
- percentage = 0,
- newTime = 0,
- pos = 0,
- x;
-
- // mouse or touch position relative to the object
- if (e.originalEvent && e.originalEvent.changedTouches) {
- x = e.originalEvent.changedTouches[0].pageX;
- } else if (e.changedTouches) { // for Zepto
- x = e.changedTouches[0].pageX;
- } else {
- x = e.pageX;
- }
-
- if (media.duration) {
- if (x < offset.left) {
- x = offset.left;
- } else if (x > width + offset.left) {
- x = width + offset.left;
- }
-
- pos = x - offset.left;
- percentage = (pos / width);
- newTime = (percentage <= 0.02) ? 0 : percentage * media.duration;
-
- // seek to where the mouse is
- if (mouseIsDown && newTime !== media.currentTime) {
- media.setCurrentTime(newTime);
- }
-
- // position floating time box
- if (!mejs.MediaFeatures.hasTouch) {
- timefloat.css('left', pos);
- timefloatcurrent.html( mejs.Utility.secondsToTimeCode(newTime, player.options) );
- timefloat.show();
- }
- }
- },
- mouseIsDown = false,
- mouseIsOver = false,
- lastKeyPressTime = 0,
- startedPaused = false,
- autoRewindInitial = player.options.autoRewind;
- // Accessibility for slider
- var updateSlider = function (e) {
-
- var seconds = media.currentTime,
- timeSliderText = mejs.i18n.t('Time Slider'),
- time = mejs.Utility.secondsToTimeCode(seconds, player.options),
- duration = media.duration;
-
- slider.attr({
- 'aria-label': timeSliderText,
- 'aria-valuemin': 0,
- 'aria-valuemax': duration,
- 'aria-valuenow': seconds,
- 'aria-valuetext': time,
- 'role': 'slider',
- 'tabindex': 0
- });
-
- };
-
- var restartPlayer = function () {
- var now = new Date();
- if (now - lastKeyPressTime >= 1000) {
- media.play();
- }
- };
-
- slider.bind('focus', function (e) {
- player.options.autoRewind = false;
- });
-
- slider.bind('blur', function (e) {
- player.options.autoRewind = autoRewindInitial;
- });
-
- slider.bind('keydown', function (e) {
-
- if ((new Date() - lastKeyPressTime) >= 1000) {
- startedPaused = media.paused;
- }
-
- var keyCode = e.keyCode,
- duration = media.duration,
- seekTime = media.currentTime,
- seekForward = player.options.defaultSeekForwardInterval(duration),
- seekBackward = player.options.defaultSeekBackwardInterval(duration);
-
- switch (keyCode) {
- case 37: // left
- case 40: // Down
- seekTime -= seekBackward;
- break;
- case 39: // Right
- case 38: // Up
- seekTime += seekForward;
- break;
- case 36: // Home
- seekTime = 0;
- break;
- case 35: // end
- seekTime = duration;
- break;
- case 32: // space
- case 13: // enter
- media.paused ? media.play() : media.pause();
- return;
- default:
- return;
- }
-
- seekTime = seekTime < 0 ? 0 : (seekTime >= duration ? duration : Math.floor(seekTime));
- lastKeyPressTime = new Date();
- if (!startedPaused) {
- media.pause();
- }
-
- if (seekTime < media.duration && !startedPaused) {
- setTimeout(restartPlayer, 1100);
- }
-
- media.setCurrentTime(seekTime);
-
- e.preventDefault();
- e.stopPropagation();
- return false;
- });
-
-
- // handle clicks
- //controls.find('.mejs-time-rail').delegate('span', 'click', handleMouseMove);
- total
- .bind('mousedown touchstart', function (e) {
- // only handle left clicks or touch
- if (e.which === 1 || e.which === 0) {
- mouseIsDown = true;
- handleMouseMove(e);
- t.globalBind('mousemove.dur touchmove.dur', function(e) {
- handleMouseMove(e);
- });
- t.globalBind('mouseup.dur touchend.dur', function (e) {
- mouseIsDown = false;
- timefloat.hide();
- t.globalUnbind('.dur');
- });
- }
- })
- .bind('mouseenter', function(e) {
- mouseIsOver = true;
- t.globalBind('mousemove.dur', function(e) {
- handleMouseMove(e);
- });
- if (!mejs.MediaFeatures.hasTouch) {
- timefloat.show();
- }
- })
- .bind('mouseleave',function(e) {
- mouseIsOver = false;
- if (!mouseIsDown) {
- t.globalUnbind('.dur');
- timefloat.hide();
- }
- });
-
- // loading
- media.addEventListener('progress', function (e) {
- player.setProgressRail(e);
- player.setCurrentRail(e);
- }, false);
-
- // current time
- media.addEventListener('timeupdate', function(e) {
- player.setProgressRail(e);
- player.setCurrentRail(e);
- updateSlider(e);
- }, false);
-
- t.container.on('controlsresize', function() {
- player.setProgressRail();
- player.setCurrentRail();
- });
-
- // store for later use
- t.loaded = loaded;
- t.total = total;
- t.current = current;
- t.handle = handle;
- },
- setProgressRail: function(e) {
-
- var
- t = this,
- target = (e !== undefined) ? e.target : t.media,
- percent = null;
-
- // newest HTML5 spec has buffered array (FF4, Webkit)
- if (target && target.buffered && target.buffered.length > 0 && target.buffered.end && target.duration) {
- // account for a real array with multiple values - always read the end of the last buffer
- percent = target.buffered.end(target.buffered.length - 1) / target.duration;
- }
- // Some browsers (e.g., FF3.6 and Safari 5) cannot calculate target.bufferered.end()
- // to be anything other than 0. If the byte count is available we use this instead.
- // Browsers that support the else if do not seem to have the bufferedBytes value and
- // should skip to there. Tested in Safari 5, Webkit head, FF3.6, Chrome 6, IE 7/8.
- else if (target && target.bytesTotal !== undefined && target.bytesTotal > 0 && target.bufferedBytes !== undefined) {
- percent = target.bufferedBytes / target.bytesTotal;
- }
- // Firefox 3 with an Ogg file seems to go this way
- else if (e && e.lengthComputable && e.total !== 0) {
- percent = e.loaded / e.total;
- }
-
- // finally update the progress bar
- if (percent !== null) {
- percent = Math.min(1, Math.max(0, percent));
- // update loaded bar
- if (t.loaded && t.total) {
- t.loaded.width(t.total.width() * percent);
- }
- }
- },
- setCurrentRail: function() {
-
- var t = this;
-
- if (t.media.currentTime !== undefined && t.media.duration) {
-
- // update bar and handle
- if (t.total && t.handle) {
- var
- newWidth = Math.round(t.total.width() * t.media.currentTime / t.media.duration),
- handlePos = newWidth - Math.round(t.handle.outerWidth(true) / 2);
-
- t.current.width(newWidth);
- t.handle.css('left', handlePos);
- }
- }
-
- }
- });
-})(mejs.$);
-
-(function($) {
-
- // options
- $.extend(mejs.MepDefaults, {
- duration: -1,
- timeAndDurationSeparator: '<span> | </span>'
- });
-
-
- // current and duration 00:00 / 00:00
- $.extend(MediaElementPlayer.prototype, {
- buildcurrent: function(player, controls, layers, media) {
- var t = this;
-
- $('<div class="mejs-time" role="timer" aria-live="off">' +
- '<span class="mejs-currenttime">' +
- mejs.Utility.secondsToTimeCode(0, player.options) +
- '</span>'+
- '</div>')
- .appendTo(controls);
-
- t.currenttime = t.controls.find('.mejs-currenttime');
-
- media.addEventListener('timeupdate',function() {
- player.updateCurrent();
- }, false);
- },
-
-
- buildduration: function(player, controls, layers, media) {
- var t = this;
-
- if (controls.children().last().find('.mejs-currenttime').length > 0) {
- $(t.options.timeAndDurationSeparator +
- '<span class="mejs-duration">' +
- mejs.Utility.secondsToTimeCode(t.options.duration, t.options) +
- '</span>')
- .appendTo(controls.find('.mejs-time'));
- } else {
-
- // add class to current time
- controls.find('.mejs-currenttime').parent().addClass('mejs-currenttime-container');
-
- $('<div class="mejs-time mejs-duration-container">'+
- '<span class="mejs-duration">' +
- mejs.Utility.secondsToTimeCode(t.options.duration, t.options) +
- '</span>' +
- '</div>')
- .appendTo(controls);
- }
-
- t.durationD = t.controls.find('.mejs-duration');
-
- media.addEventListener('timeupdate',function() {
- player.updateDuration();
- }, false);
- },
-
- updateCurrent: function() {
- var t = this;
-
- var currentTime = t.media.currentTime;
-
- if (isNaN(currentTime)) {
- currentTime = 0;
- }
-
- if (t.currenttime) {
- t.currenttime.html(mejs.Utility.secondsToTimeCode(currentTime, t.options));
- }
- },
-
- updateDuration: function() {
- var t = this;
-
- var duration = t.media.duration;
- if (t.options.duration > 0) {
- duration = t.options.duration;
- }
-
- if (isNaN(duration)) {
- duration = 0;
- }
-
- //Toggle the long video class if the video is longer than an hour.
- t.container.toggleClass("mejs-long-video", duration > 3600);
-
- if (t.durationD && duration > 0) {
- t.durationD.html(mejs.Utility.secondsToTimeCode(duration, t.options));
- }
- }
- });
-
-})(mejs.$);
-
-(function($) {
-
- $.extend(mejs.MepDefaults, {
- muteText: mejs.i18n.t('Mute Toggle'),
- allyVolumeControlText: mejs.i18n.t('Use Up/Down Arrow keys to increase or decrease volume.'),
- hideVolumeOnTouchDevices: true,
-
- audioVolume: 'horizontal',
- videoVolume: 'vertical'
- });
-
- $.extend(MediaElementPlayer.prototype, {
- buildvolume: function(player, controls, layers, media) {
-
- // Android and iOS don't support volume controls
- if ((mejs.MediaFeatures.isAndroid || mejs.MediaFeatures.isiOS) && this.options.hideVolumeOnTouchDevices)
- return;
-
- var t = this,
- mode = (t.isVideo) ? t.options.videoVolume : t.options.audioVolume,
- mute = (mode == 'horizontal') ?
-
- // horizontal version
- $('<div class="mejs-button mejs-volume-button mejs-mute">' +
- '<button type="button" aria-controls="' + t.id +
- '" title="' + t.options.muteText +
- '" aria-label="' + t.options.muteText +
- '"></button>'+
- '</div>' +
- '<a href="javascript:void(0);" class="mejs-horizontal-volume-slider">' + // outer background
- '<span class="mejs-offscreen">' + t.options.allyVolumeControlText + '</span>' +
- '<div class="mejs-horizontal-volume-total"></div>'+ // line background
- '<div class="mejs-horizontal-volume-current"></div>'+ // current volume
- '<div class="mejs-horizontal-volume-handle"></div>'+ // handle
- '</a>'
- )
- .appendTo(controls) :
-
- // vertical version
- $('<div class="mejs-button mejs-volume-button mejs-mute">'+
- '<button type="button" aria-controls="' + t.id +
- '" title="' + t.options.muteText +
- '" aria-label="' + t.options.muteText +
- '"></button>'+
- '<a href="javascript:void(0);" class="mejs-volume-slider">'+ // outer background
- '<span class="mejs-offscreen">' + t.options.allyVolumeControlText + '</span>' +
- '<div class="mejs-volume-total"></div>'+ // line background
- '<div class="mejs-volume-current"></div>'+ // current volume
- '<div class="mejs-volume-handle"></div>'+ // handle
- '</a>'+
- '</div>')
- .appendTo(controls),
- volumeSlider = t.container.find('.mejs-volume-slider, .mejs-horizontal-volume-slider'),
- volumeTotal = t.container.find('.mejs-volume-total, .mejs-horizontal-volume-total'),
- volumeCurrent = t.container.find('.mejs-volume-current, .mejs-horizontal-volume-current'),
- volumeHandle = t.container.find('.mejs-volume-handle, .mejs-horizontal-volume-handle'),
-
- positionVolumeHandle = function(volume, secondTry) {
-
- if (!volumeSlider.is(':visible') && typeof secondTry == 'undefined') {
- volumeSlider.show();
- positionVolumeHandle(volume, true);
- volumeSlider.hide();
- return;
- }
-
- // correct to 0-1
- volume = Math.max(0,volume);
- volume = Math.min(volume,1);
-
- // ajust mute button style
- if (volume === 0) {
- mute.removeClass('mejs-mute').addClass('mejs-unmute');
- mute.children('button').attr('title', mejs.i18n.t('Unmute')).attr('aria-label', mejs.i18n.t('Unmute'));
- } else {
- mute.removeClass('mejs-unmute').addClass('mejs-mute');
- mute.children('button').attr('title', mejs.i18n.t('Mute')).attr('aria-label', mejs.i18n.t('Mute'));
- }
-
- // top/left of full size volume slider background
- var totalPosition = volumeTotal.position();
- // position slider
- if (mode == 'vertical') {
- var
- // height of the full size volume slider background
- totalHeight = volumeTotal.height(),
-
- // the new top position based on the current volume
- // 70% volume on 100px height == top:30px
- newTop = totalHeight - (totalHeight * volume);
-
- // handle
- volumeHandle.css('top', Math.round(totalPosition.top + newTop - (volumeHandle.height() / 2)));
-
- // show the current visibility
- volumeCurrent.height(totalHeight - newTop );
- volumeCurrent.css('top', totalPosition.top + newTop);
- } else {
- var
- // height of the full size volume slider background
- totalWidth = volumeTotal.width(),
-
- // the new left position based on the current volume
- newLeft = totalWidth * volume;
-
- // handle
- volumeHandle.css('left', Math.round(totalPosition.left + newLeft - (volumeHandle.width() / 2)));
-
- // rezize the current part of the volume bar
- volumeCurrent.width( Math.round(newLeft) );
- }
- },
- handleVolumeMove = function(e) {
-
- var volume = null,
- totalOffset = volumeTotal.offset();
-
- // calculate the new volume based on the moust position
- if (mode === 'vertical') {
-
- var
- railHeight = volumeTotal.height(),
- newY = e.pageY - totalOffset.top;
-
- volume = (railHeight - newY) / railHeight;
-
- // the controls just hide themselves (usually when mouse moves too far up)
- if (totalOffset.top === 0 || totalOffset.left === 0) {
- return;
- }
-
- } else {
- var
- railWidth = volumeTotal.width(),
- newX = e.pageX - totalOffset.left;
-
- volume = newX / railWidth;
- }
-
- // ensure the volume isn't outside 0-1
- volume = Math.max(0,volume);
- volume = Math.min(volume,1);
-
- // position the slider and handle
- positionVolumeHandle(volume);
-
- // set the media object (this will trigger the volumechanged event)
- if (volume === 0) {
- media.setMuted(true);
- } else {
- media.setMuted(false);
- }
- media.setVolume(volume);
- },
- mouseIsDown = false,
- mouseIsOver = false;
-
- // SLIDER
-
- mute
- .hover(function() {
- volumeSlider.show();
- mouseIsOver = true;
- }, function() {
- mouseIsOver = false;
-
- if (!mouseIsDown && mode == 'vertical') {
- volumeSlider.hide();
- }
- });
-
- var updateVolumeSlider = function (e) {
-
- var volume = Math.floor(media.volume*100);
-
- volumeSlider.attr({
- 'aria-label': mejs.i18n.t('Volume Slider'),
- 'aria-valuemin': 0,
- 'aria-valuemax': 100,
- 'aria-valuenow': volume,
- 'aria-valuetext': volume+'%',
- 'role': 'slider',
- 'tabindex': 0
- });
-
- };
-
- volumeSlider
- .bind('mouseover', function() {
- mouseIsOver = true;
- })
- .bind('mousedown', function (e) {
- handleVolumeMove(e);
- t.globalBind('mousemove.vol', function(e) {
- handleVolumeMove(e);
- });
- t.globalBind('mouseup.vol', function () {
- mouseIsDown = false;
- t.globalUnbind('.vol');
-
- if (!mouseIsOver && mode == 'vertical') {
- volumeSlider.hide();
- }
- });
- mouseIsDown = true;
-
- return false;
- })
- .bind('keydown', function (e) {
- var keyCode = e.keyCode;
- var volume = media.volume;
- switch (keyCode) {
- case 38: // Up
- volume = Math.min(volume + 0.1, 1);
- break;
- case 40: // Down
- volume = Math.max(0, volume - 0.1);
- break;
- default:
- return true;
- }
-
- mouseIsDown = false;
- positionVolumeHandle(volume);
- media.setVolume(volume);
- return false;
- });
-
- // MUTE button
- mute.find('button').click(function() {
- media.setMuted( !media.muted );
- });
-
- //Keyboard input
- mute.find('button').bind('focus', function () {
- volumeSlider.show();
- });
-
- // listen for volume change events from other sources
- media.addEventListener('volumechange', function(e) {
- if (!mouseIsDown) {
- if (media.muted) {
- positionVolumeHandle(0);
- mute.removeClass('mejs-mute').addClass('mejs-unmute');
- } else {
- positionVolumeHandle(media.volume);
- mute.removeClass('mejs-unmute').addClass('mejs-mute');
- }
- }
- updateVolumeSlider(e);
- }, false);
-
- // mutes the media and sets the volume icon muted if the initial volume is set to 0
- if (player.options.startVolume === 0) {
- media.setMuted(true);
- }
-
- // shim gets the startvolume as a parameter, but we have to set it on the native <video> and <audio> elements
- if (media.pluginType === 'native') {
- media.setVolume(player.options.startVolume);
- }
-
- t.container.on('controlsresize', function() {
- positionVolumeHandle(media.volume);
- });
- }
- });
-
-})(mejs.$);
-
-(function($) {
-
- $.extend(mejs.MepDefaults, {
- usePluginFullScreen: true,
- newWindowCallback: function() { return '';},
- fullscreenText: mejs.i18n.t('Fullscreen')
- });
-
- $.extend(MediaElementPlayer.prototype, {
-
- isFullScreen: false,
-
- isNativeFullScreen: false,
-
- isInIframe: false,
-
- // Possible modes
- // (1) 'native-native' HTML5 video + browser fullscreen (IE10+, etc.)
- // (2) 'plugin-native' plugin video + browser fullscreen (fails in some versions of Firefox)
- // (3) 'fullwindow' Full window (retains all UI)
- // usePluginFullScreen = true
- // (4) 'plugin-click' Flash 1 - click through with pointer events
- // (5) 'plugin-hover' Flash 2 - hover popup in flash (IE6-8)
- fullscreenMode: '',
-
- buildfullscreen: function(player, controls, layers, media) {
-
- if (!player.isVideo)
- return;
-
- player.isInIframe = (window.location != window.parent.location);
-
- // detect on start
- media.addEventListener('play', function() { player.detectFullscreenMode(); });
-
- // build button
- var t = this,
- hideTimeout = null,
- fullscreenBtn =
- $('<div class="mejs-button mejs-fullscreen-button">' +
- '<button type="button" aria-controls="' + t.id + '" title="' + t.options.fullscreenText + '" aria-label="' + t.options.fullscreenText + '"></button>' +
- '</div>')
- .appendTo(controls)
- .on('click', function() {
-
- // toggle fullscreen
- var isFullScreen = (mejs.MediaFeatures.hasTrueNativeFullScreen && mejs.MediaFeatures.isFullScreen()) || player.isFullScreen;
-
- if (isFullScreen) {
- player.exitFullScreen();
- } else {
- player.enterFullScreen();
- }
- })
- .on('mouseover', function() {
-
- // very old browsers with a plugin
- if (t.fullscreenMode == 'plugin-hover') {
- if (hideTimeout !== null) {
- clearTimeout(hideTimeout);
- delete hideTimeout;
- }
-
- var buttonPos = fullscreenBtn.offset(),
- containerPos = player.container.offset();
-
- media.positionFullscreenButton(buttonPos.left - containerPos.left, buttonPos.top - containerPos.top, true);
- }
-
- })
- .on('mouseout', function() {
-
- if (t.fullscreenMode == 'plugin-hover') {
- if (hideTimeout !== null) {
- clearTimeout(hideTimeout);
- delete hideTimeout;
- }
-
- hideTimeout = setTimeout(function() {
- media.hideFullscreenButton();
- }, 1500);
- }
-
- });
-
-
-
- player.fullscreenBtn = fullscreenBtn;
-
- t.globalBind('keydown',function (e) {
- if (e.keyCode == 27 && ((mejs.MediaFeatures.hasTrueNativeFullScreen && mejs.MediaFeatures.isFullScreen()) || t.isFullScreen)) {
- player.exitFullScreen();
- }
- });
-
- t.normalHeight = 0;
- t.normalWidth = 0;
-
- // setup native fullscreen event
- if (mejs.MediaFeatures.hasTrueNativeFullScreen) {
-
- // chrome doesn't alays fire this in an iframe
- var fullscreenChanged = function(e) {
- if (player.isFullScreen) {
- if (mejs.MediaFeatures.isFullScreen()) {
- player.isNativeFullScreen = true;
- // reset the controls once we are fully in full screen
- player.setControlsSize();
- } else {
- player.isNativeFullScreen = false;
- // when a user presses ESC
- // make sure to put the player back into place
- player.exitFullScreen();
- }
- }
- };
-
- player.globalBind(mejs.MediaFeatures.fullScreenEventName, fullscreenChanged);
- }
-
- },
-
- detectFullscreenMode: function() {
-
- var t = this,
- mode = '',
- features = mejs.MediaFeatures;
-
- if (features.hasTrueNativeFullScreen && t.media.pluginType === 'native') {
- mode = 'native-native';
- } else if (features.hasTrueNativeFullScreen && t.media.pluginType !== 'native' && !features.hasFirefoxPluginMovingProblem) {
- mode = 'plugin-native';
- } else if (t.usePluginFullScreen) {
- if (mejs.MediaFeatures.supportsPointerEvents) {
- mode = 'plugin-click';
- // this needs some special setup
- t.createPluginClickThrough();
- } else {
- mode = 'plugin-hover';
- }
-
- } else {
- mode = 'fullwindow';
- }
-
-
- t.fullscreenMode = mode;
- return mode;
- },
-
- isPluginClickThroughCreated: false,
-
- createPluginClickThrough: function() {
-
- var t = this;
-
- // don't build twice
- if (t.isPluginClickThroughCreated) {
- return;
- }
-
- // allows clicking through the fullscreen button and controls down directly to Flash
-
- /*
- When a user puts his mouse over the fullscreen button, we disable the controls so that mouse events can go down to flash (pointer-events)
- We then put a divs over the video and on either side of the fullscreen button
- to capture mouse movement and restore the controls once the mouse moves outside of the fullscreen button
- */
-
- var fullscreenIsDisabled = false,
- restoreControls = function() {
- if (fullscreenIsDisabled) {
- // hide the hovers
- for (var i in hoverDivs) {
- hoverDivs[i].hide();
- }
-
- // restore the control bar
- t.fullscreenBtn.css('pointer-events', '');
- t.controls.css('pointer-events', '');
-
- // prevent clicks from pausing video
- t.media.removeEventListener('click', t.clickToPlayPauseCallback);
-
- // store for later
- fullscreenIsDisabled = false;
- }
- },
- hoverDivs = {},
- hoverDivNames = ['top', 'left', 'right', 'bottom'],
- i, len,
- positionHoverDivs = function() {
- var fullScreenBtnOffsetLeft = fullscreenBtn.offset().left - t.container.offset().left,
- fullScreenBtnOffsetTop = fullscreenBtn.offset().top - t.container.offset().top,
- fullScreenBtnWidth = fullscreenBtn.outerWidth(true),
- fullScreenBtnHeight = fullscreenBtn.outerHeight(true),
- containerWidth = t.container.width(),
- containerHeight = t.container.height();
-
- for (i in hoverDivs) {
- hoverDivs[i].css({position: 'absolute', top: 0, left: 0}); //, backgroundColor: '#f00'});
- }
-
- // over video, but not controls
- hoverDivs['top']
- .width( containerWidth )
- .height( fullScreenBtnOffsetTop );
-
- // over controls, but not the fullscreen button
- hoverDivs['left']
- .width( fullScreenBtnOffsetLeft )
- .height( fullScreenBtnHeight )
- .css({top: fullScreenBtnOffsetTop});
-
- // after the fullscreen button
- hoverDivs['right']
- .width( containerWidth - fullScreenBtnOffsetLeft - fullScreenBtnWidth )
- .height( fullScreenBtnHeight )
- .css({top: fullScreenBtnOffsetTop,
- left: fullScreenBtnOffsetLeft + fullScreenBtnWidth});
-
- // under the fullscreen button
- hoverDivs['bottom']
- .width( containerWidth )
- .height( containerHeight - fullScreenBtnHeight - fullScreenBtnOffsetTop )
- .css({top: fullScreenBtnOffsetTop + fullScreenBtnHeight});
- };
-
- t.globalBind('resize', function() {
- positionHoverDivs();
- });
-
- for (i = 0, len = hoverDivNames.length; i < len; i++) {
- hoverDivs[hoverDivNames[i]] = $('<div class="mejs-fullscreen-hover" />').appendTo(t.container).mouseover(restoreControls).hide();
- }
-
- // on hover, kill the fullscreen button's HTML handling, allowing clicks down to Flash
- fullscreenBtn.on('mouseover',function() {
-
- if (!t.isFullScreen) {
-
- var buttonPos = fullscreenBtn.offset(),
- containerPos = player.container.offset();
-
- // move the button in Flash into place
- media.positionFullscreenButton(buttonPos.left - containerPos.left, buttonPos.top - containerPos.top, false);
-
- // allows click through
- t.fullscreenBtn.css('pointer-events', 'none');
- t.controls.css('pointer-events', 'none');
-
- // restore click-to-play
- t.media.addEventListener('click', t.clickToPlayPauseCallback);
-
- // show the divs that will restore things
- for (i in hoverDivs) {
- hoverDivs[i].show();
- }
-
- positionHoverDivs();
-
- fullscreenIsDisabled = true;
- }
-
- });
-
- // restore controls anytime the user enters or leaves fullscreen
- media.addEventListener('fullscreenchange', function(e) {
- t.isFullScreen = !t.isFullScreen;
- // don't allow plugin click to pause video - messes with
- // plugin's controls
- if (t.isFullScreen) {
- t.media.removeEventListener('click', t.clickToPlayPauseCallback);
- } else {
- t.media.addEventListener('click', t.clickToPlayPauseCallback);
- }
- restoreControls();
- });
-
-
- // the mouseout event doesn't work on the fullscren button, because we already killed the pointer-events
- // so we use the document.mousemove event to restore controls when the mouse moves outside the fullscreen button
-
- t.globalBind('mousemove', function(e) {
-
- // if the mouse is anywhere but the fullsceen button, then restore it all
- if (fullscreenIsDisabled) {
-
- var fullscreenBtnPos = fullscreenBtn.offset();
-
-
- if (e.pageY < fullscreenBtnPos.top || e.pageY > fullscreenBtnPos.top + fullscreenBtn.outerHeight(true) ||
- e.pageX < fullscreenBtnPos.left || e.pageX > fullscreenBtnPos.left + fullscreenBtn.outerWidth(true)
- ) {
-
- fullscreenBtn.css('pointer-events', '');
- t.controls.css('pointer-events', '');
-
- fullscreenIsDisabled = false;
- }
- }
- });
-
-
- t.isPluginClickThroughCreated = true;
- },
-
- cleanfullscreen: function(player) {
- player.exitFullScreen();
- },
-
- containerSizeTimeout: null,
-
- enterFullScreen: function() {
-
- var t = this;
-
- if (mejs.MediaFeatures.hasiOSFullScreen) {
- t.media.webkitEnterFullscreen();
- return;
- }
-
- // set it to not show scroll bars so 100% will work
- $(document.documentElement).addClass('mejs-fullscreen');
-
- // store sizing
- t.normalHeight = t.container.height();
- t.normalWidth = t.container.width();
-
-
-
- // attempt to do true fullscreen
- if (t.fullscreenMode === 'native-native' || t.fullscreenMode === 'plugin-native') {
-
- mejs.MediaFeatures.requestFullScreen(t.container[0]);
- //return;
-
- if (t.isInIframe) {
- // sometimes exiting from fullscreen doesn't work
- // notably in Chrome <iframe>. Fixed in version 17
- setTimeout(function checkFullscreen() {
-
- if (t.isNativeFullScreen) {
- var percentErrorMargin = 0.002, // 0.2%
- windowWidth = $(window).width(),
- screenWidth = screen.width,
- absDiff = Math.abs(screenWidth - windowWidth),
- marginError = screenWidth * percentErrorMargin;
-
- // check if the video is suddenly not really fullscreen
- if (absDiff > marginError) {
- // manually exit
- t.exitFullScreen();
- } else {
- // test again
- setTimeout(checkFullscreen, 500);
- }
- }
-
- }, 1000);
- }
-
- } else if (t.fullscreeMode == 'fullwindow') {
- // move into position
-
- }
-
- // make full size
- t.container
- .addClass('mejs-container-fullscreen')
- .width('100%')
- .height('100%');
- //.css({position: 'fixed', left: 0, top: 0, right: 0, bottom: 0, overflow: 'hidden', width: '100%', height: '100%', 'z-index': 1000});
-
- // Only needed for safari 5.1 native full screen, can cause display issues elsewhere
- // Actually, it seems to be needed for IE8, too
- //if (mejs.MediaFeatures.hasTrueNativeFullScreen) {
- t.containerSizeTimeout = setTimeout(function() {
- t.container.css({width: '100%', height: '100%'});
- t.setControlsSize();
- }, 500);
- //}
-
- if (t.media.pluginType === 'native') {
- t.$media
- .width('100%')
- .height('100%');
- } else {
- t.container.find('.mejs-shim')
- .width('100%')
- .height('100%');
-
- setTimeout(function() {
- var win = $(window),
- winW = win.width(),
- winH = win.height();
-
- t.media.setVideoSize(winW,winH);
- }, 500);
- }
-
- t.layers.children('div')
- .width('100%')
- .height('100%');
-
- if (t.fullscreenBtn) {
- t.fullscreenBtn
- .removeClass('mejs-fullscreen')
- .addClass('mejs-unfullscreen');
- }
-
- t.setControlsSize();
- t.isFullScreen = true;
-
- t.container.find('.mejs-captions-text').css('font-size', screen.width / t.width * 1.00 * 100 + '%');
- t.container.find('.mejs-captions-position').css('bottom', '45px');
-
- t.container.trigger('enteredfullscreen');
- },
-
- exitFullScreen: function() {
-
- var t = this;
-
- // Prevent container from attempting to stretch a second time
- clearTimeout(t.containerSizeTimeout);
-
- // firefox can't adjust plugins
- /*
- if (t.media.pluginType !== 'native' && mejs.MediaFeatures.isFirefox) {
- t.media.setFullscreen(false);
- //player.isFullScreen = false;
- return;
- }
- */
-
- // come out of native fullscreen
- if (mejs.MediaFeatures.hasTrueNativeFullScreen && (mejs.MediaFeatures.isFullScreen() || t.isFullScreen)) {
- mejs.MediaFeatures.cancelFullScreen();
- }
-
- // restore scroll bars to document
- $(document.documentElement).removeClass('mejs-fullscreen');
-
- t.container
- .removeClass('mejs-container-fullscreen')
- .width(t.normalWidth)
- .height(t.normalHeight);
-
- if (t.media.pluginType === 'native') {
- t.$media
- .width(t.normalWidth)
- .height(t.normalHeight);
- } else {
- t.container.find('.mejs-shim')
- .width(t.normalWidth)
- .height(t.normalHeight);
-
- t.media.setVideoSize(t.normalWidth, t.normalHeight);
- }
-
- t.layers.children('div')
- .width(t.normalWidth)
- .height(t.normalHeight);
-
- t.fullscreenBtn
- .removeClass('mejs-unfullscreen')
- .addClass('mejs-fullscreen');
-
- t.setControlsSize();
- t.isFullScreen = false;
-
- t.container.find('.mejs-captions-text').css('font-size','');
- t.container.find('.mejs-captions-position').css('bottom', '');
-
- t.container.trigger('exitedfullscreen');
- }
- });
-
-})(mejs.$);
-
-(function($) {
-
- // Speed
- $.extend(mejs.MepDefaults, {
-
- // We also support to pass object like this:
- // [{name: 'Slow', value: '0.75'}, {name: 'Normal', value: '1.00'}, ...]
- speeds: ['2.00', '1.50', '1.25', '1.00', '0.75'],
-
- defaultSpeed: '1.00',
-
- speedChar: 'x'
-
- });
-
- $.extend(MediaElementPlayer.prototype, {
-
- buildspeed: function(player, controls, layers, media) {
- var t = this;
-
- if (t.media.pluginType == 'native') {
- var
- speedButton = null,
- speedSelector = null,
- playbackSpeed = null,
- inputId = null;
-
- var speeds = [];
- var defaultInArray = false;
- for (var i=0, len=t.options.speeds.length; i < len; i++) {
- var s = t.options.speeds[i];
- if (typeof(s) === 'string'){
- speeds.push({
- name: s + t.options.speedChar,
- value: s
- });
- if(s === t.options.defaultSpeed) {
- defaultInArray = true;
- }
- }
- else {
- speeds.push(s);
- if(s.value === t.options.defaultSpeed) {
- defaultInArray = true;
- }
- }
- }
-
- if (!defaultInArray) {
- speeds.push({
- name: t.options.defaultSpeed + t.options.speedChar,
- value: t.options.defaultSpeed
- });
- }
-
- speeds.sort(function(a, b) {
- return parseFloat(b.value) - parseFloat(a.value);
- });
-
- var getSpeedNameFromValue = function(value) {
- for(i=0,len=speeds.length; i <len; i++) {
- if (speeds[i].value === value) {
- return speeds[i].name;
- }
- }
- };
-
- var html = '<div class="mejs-button mejs-speed-button">' +
- '<button type="button">' + getSpeedNameFromValue(t.options.defaultSpeed) + '</button>' +
- '<div class="mejs-speed-selector">' +
- '<ul>';
-
- for (i = 0, il = speeds.length; i<il; i++) {
- inputId = t.id + '-speed-' + speeds[i].value;
- html += '<li>' +
- '<input type="radio" name="speed" ' +
- 'value="' + speeds[i].value + '" ' +
- 'id="' + inputId + '" ' +
- (speeds[i].value === t.options.defaultSpeed ? ' checked' : '') +
- ' />' +
- '<label for="' + inputId + '" ' +
- (speeds[i].value === t.options.defaultSpeed ? ' class="mejs-speed-selected"' : '') +
- '>' + speeds[i].name + '</label>' +
- '</li>';
- }
- html += '</ul></div></div>';
-
- speedButton = $(html).appendTo(controls);
- speedSelector = speedButton.find('.mejs-speed-selector');
-
- playbackSpeed = t.options.defaultSpeed;
-
- media.addEventListener('loadedmetadata', function(e) {
- if (playbackSpeed) {
- media.playbackRate = parseFloat(playbackSpeed);
- }
- }, true);
-
- speedSelector
- .on('click', 'input[type="radio"]', function() {
- var newSpeed = $(this).attr('value');
- playbackSpeed = newSpeed;
- media.playbackRate = parseFloat(newSpeed);
- speedButton.find('button').html(getSpeedNameFromValue(newSpeed));
- speedButton.find('.mejs-speed-selected').removeClass('mejs-speed-selected');
- speedButton.find('input[type="radio"]:checked').next().addClass('mejs-speed-selected');
- });
- speedButton
- .one( 'mouseenter focusin', function() {
- speedSelector
- .height(
- speedButton.find('.mejs-speed-selector ul').outerHeight(true) +
- speedButton.find('.mejs-speed-translations').outerHeight(true))
- .css('top', (-1 * speedSelector.height()) + 'px');
- });
- }
- }
- });
-
-})(mejs.$);
-
-(function($) {
-
- // add extra default options
- $.extend(mejs.MepDefaults, {
- // this will automatically turn on a <track>
- startLanguage: '',
-
- tracksText: mejs.i18n.t('Captions/Subtitles'),
-
- // By default, no WAI-ARIA live region - don't make a
- // screen reader speak captions over an audio track.
- tracksAriaLive: false,
-
- // option to remove the [cc] button when no <track kind="subtitles"> are present
- hideCaptionsButtonWhenEmpty: true,
-
- // If true and we only have one track, change captions to popup
- toggleCaptionsButtonWhenOnlyOne: false,
-
- // #id or .class
- slidesSelector: ''
- });
-
- $.extend(MediaElementPlayer.prototype, {
-
- hasChapters: false,
-
- cleartracks: function(player, controls, layers, media){
- if(player) {
- if(player.captions) player.captions.remove();
- if(player.chapters) player.chapters.remove();
- if(player.captionsText) player.captionsText.remove();
- if(player.captionsButton) player.captionsButton.remove();
- }
- },
- buildtracks: function(player, controls, layers, media) {
- if (player.tracks.length === 0)
- return;
-
- var t = this,
- attr = t.options.tracksAriaLive ?
- 'role="log" aria-live="assertive" aria-atomic="false"' : '',
- i;
-
- if (t.domNode.textTracks) { // if browser will do native captions, prefer mejs captions, loop through tracks and hide
- for (i = t.domNode.textTracks.length - 1; i >= 0; i--) {
- t.domNode.textTracks[i].mode = "hidden";
- }
- }
- t.cleartracks(player, controls, layers, media);
- player.chapters =
- $('<div class="mejs-chapters mejs-layer"></div>')
- .prependTo(layers).hide();
- player.captions =
- $('<div class="mejs-captions-layer mejs-layer"><div class="mejs-captions-position mejs-captions-position-hover" ' +
- attr + '><span class="mejs-captions-text"></span></div></div>')
- .prependTo(layers).hide();
- player.captionsText = player.captions.find('.mejs-captions-text');
- player.captionsButton =
- $('<div class="mejs-button mejs-captions-button">'+
- '<button type="button" aria-controls="' + t.id + '" title="' + t.options.tracksText + '" aria-label="' + t.options.tracksText + '"></button>'+
- '<div class="mejs-captions-selector">'+
- '<ul>'+
- '<li>'+
- '<input type="radio" name="' + player.id + '_captions" id="' + player.id + '_captions_none" value="none" checked="checked" />' +
- '<label for="' + player.id + '_captions_none">' + mejs.i18n.t('None') +'</label>'+
- '</li>' +
- '</ul>'+
- '</div>'+
- '</div>')
- .appendTo(controls);
-
-
- var subtitleCount = 0;
- for (i=0; i<player.tracks.length; i++) {
- if (player.tracks[i].kind == 'subtitles') {
- subtitleCount++;
- }
- }
-
- // if only one language then just make the button a toggle
- if (t.options.toggleCaptionsButtonWhenOnlyOne && subtitleCount == 1){
- // click
- player.captionsButton.on('click',function() {
- if (player.selectedTrack === null) {
- lang = player.tracks[0].srclang;
- } else {
- lang = 'none';
- }
- player.setTrack(lang);
- });
- } else {
- // hover or keyboard focus
- player.captionsButton.on( 'mouseenter focusin', function() {
- $(this).find('.mejs-captions-selector').removeClass('mejs-offscreen');
- })
-
- // handle clicks to the language radio buttons
- .on('click','input[type=radio]',function() {
- lang = this.value;
- player.setTrack(lang);
- });
-
- player.captionsButton.on( 'mouseleave focusout', function() {
- $(this).find(".mejs-captions-selector").addClass("mejs-offscreen");
- });
-
- }
-
- if (!player.options.alwaysShowControls) {
- // move with controls
- player.container
- .bind('controlsshown', function () {
- // push captions above controls
- player.container.find('.mejs-captions-position').addClass('mejs-captions-position-hover');
-
- })
- .bind('controlshidden', function () {
- if (!media.paused) {
- // move back to normal place
- player.container.find('.mejs-captions-position').removeClass('mejs-captions-position-hover');
- }
- });
- } else {
- player.container.find('.mejs-captions-position').addClass('mejs-captions-position-hover');
- }
-
- player.trackToLoad = -1;
- player.selectedTrack = null;
- player.isLoadingTrack = false;
-
- // add to list
- for (i=0; i<player.tracks.length; i++) {
- if (player.tracks[i].kind == 'subtitles') {
- player.addTrackButton(player.tracks[i].srclang, player.tracks[i].label);
- }
- }
-
- // start loading tracks
- player.loadNextTrack();
-
- media.addEventListener('timeupdate',function(e) {
- player.displayCaptions();
- }, false);
-
- if (player.options.slidesSelector !== '') {
- player.slidesContainer = $(player.options.slidesSelector);
-
- media.addEventListener('timeupdate',function(e) {
- player.displaySlides();
- }, false);
-
- }
-
- media.addEventListener('loadedmetadata', function(e) {
- player.displayChapters();
- }, false);
-
- player.container.hover(
- function () {
- // chapters
- if (player.hasChapters) {
- player.chapters.removeClass('mejs-offscreen');
- player.chapters.fadeIn(200).height(player.chapters.find('.mejs-chapter').outerHeight());
- }
- },
- function () {
- if (player.hasChapters && !media.paused) {
- player.chapters.fadeOut(200, function() {
- $(this).addClass('mejs-offscreen');
- $(this).css('display','block');
- });
- }
- });
-
- t.container.on('controlsresize', function() {
- t.adjustLanguageBox();
- });
-
- // check for autoplay
- if (player.node.getAttribute('autoplay') !== null) {
- player.chapters.addClass('mejs-offscreen');
- }
- },
-
- setTrack: function(lang){
-
- var t = this,
- i;
-
- if (lang == 'none') {
- t.selectedTrack = null;
- t.captionsButton.removeClass('mejs-captions-enabled');
- } else {
- for (i=0; i<t.tracks.length; i++) {
- if (t.tracks[i].srclang == lang) {
- if (t.selectedTrack === null)
- t.captionsButton.addClass('mejs-captions-enabled');
- t.selectedTrack = t.tracks[i];
- t.captions.attr('lang', t.selectedTrack.srclang);
- t.displayCaptions();
- break;
- }
- }
- }
- },
-
- loadNextTrack: function() {
- var t = this;
-
- t.trackToLoad++;
- if (t.trackToLoad < t.tracks.length) {
- t.isLoadingTrack = true;
- t.loadTrack(t.trackToLoad);
- } else {
- // add done?
- t.isLoadingTrack = false;
-
- t.checkForTracks();
- }
- },
-
- loadTrack: function(index){
- var
- t = this,
- track = t.tracks[index],
- after = function() {
-
- track.isLoaded = true;
-
- t.enableTrackButton(track.srclang, track.label);
-
- t.loadNextTrack();
-
- };
-
-
- $.ajax({
- url: track.src,
- dataType: "text",
- success: function(d) {
-
- // parse the loaded file
- if (typeof d == "string" && (/<tt\s+xml/ig).exec(d)) {
- track.entries = mejs.TrackFormatParser.dfxp.parse(d);
- } else {
- track.entries = mejs.TrackFormatParser.webvtt.parse(d);
- }
-
- after();
-
- if (track.kind == 'chapters') {
- t.media.addEventListener('play', function(e) {
- if (t.media.duration > 0) {
- t.displayChapters(track);
- }
- }, false);
- }
-
- if (track.kind == 'slides') {
- t.setupSlides(track);
- }
- },
- error: function() {
- t.removeTrackButton(track.srclang);
- t.loadNextTrack();
- }
- });
- },
-
- enableTrackButton: function(lang, label) {
- var t = this;
-
- if (label === '') {
- label = mejs.language.codes[lang] || lang;
- }
-
- t.captionsButton
- .find('input[value=' + lang + ']')
- .prop('disabled',false)
- .siblings('label')
- .html( label );
-
- // auto select
- if (t.options.startLanguage == lang) {
- $('#' + t.id + '_captions_' + lang).prop('checked', true).trigger('click');
- }
-
- t.adjustLanguageBox();
- },
-
- removeTrackButton: function(lang) {
- var t = this;
-
- t.captionsButton.find('input[value=' + lang + ']').closest('li').remove();
-
- t.adjustLanguageBox();
- },
-
- addTrackButton: function(lang, label) {
- var t = this;
- if (label === '') {
- label = mejs.language.codes[lang] || lang;
- }
-
- t.captionsButton.find('ul').append(
- $('<li>'+
- '<input type="radio" name="' + t.id + '_captions" id="' + t.id + '_captions_' + lang + '" value="' + lang + '" disabled="disabled" />' +
- '<label for="' + t.id + '_captions_' + lang + '">' + label + ' (loading)' + '</label>'+
- '</li>')
- );
-
- t.adjustLanguageBox();
-
- // remove this from the dropdownlist (if it exists)
- t.container.find('.mejs-captions-translations option[value=' + lang + ']').remove();
- },
-
- adjustLanguageBox:function() {
- var t = this;
- // adjust the size of the outer box
- t.captionsButton.find('.mejs-captions-selector').height(
- t.captionsButton.find('.mejs-captions-selector ul').outerHeight(true) +
- t.captionsButton.find('.mejs-captions-translations').outerHeight(true)
- );
- },
-
- checkForTracks: function() {
- var
- t = this,
- hasSubtitles = false;
-
- // check if any subtitles
- if (t.options.hideCaptionsButtonWhenEmpty) {
- for (i=0; i<t.tracks.length; i++) {
- if (t.tracks[i].kind == 'subtitles' && t.tracks[i].isLoaded) {
- hasSubtitles = true;
- break;
- }
- }
-
- if (!hasSubtitles) {
- t.captionsButton.hide();
- t.setControlsSize();
- }
- }
- },
-
- displayCaptions: function() {
-
- if (typeof this.tracks == 'undefined')
- return;
-
- var
- t = this,
- i,
- track = t.selectedTrack;
-
- if (track !== null && track.isLoaded) {
- for (i=0; i<track.entries.times.length; i++) {
- if (t.media.currentTime >= track.entries.times[i].start && t.media.currentTime <= track.entries.times[i].stop) {
- // Set the line before the timecode as a class so the cue can be targeted if needed
- t.captionsText.html(track.entries.text[i]).attr('class', 'mejs-captions-text ' + (track.entries.times[i].identifier || ''));
- t.captions.show().height(0);
- return; // exit out if one is visible;
- }
- }
- t.captions.hide();
- } else {
- t.captions.hide();
- }
- },
-
- setupSlides: function(track) {
- var t = this;
-
- t.slides = track;
- t.slides.entries.imgs = [t.slides.entries.text.length];
- t.showSlide(0);
-
- },
-
- showSlide: function(index) {
- if (typeof this.tracks == 'undefined' || typeof this.slidesContainer == 'undefined') {
- return;
- }
-
- var t = this,
- url = t.slides.entries.text[index],
- img = t.slides.entries.imgs[index];
-
- if (typeof img == 'undefined' || typeof img.fadeIn == 'undefined') {
-
- t.slides.entries.imgs[index] = img = $('<img src="' + url + '">')
- .on('load', function() {
- img.appendTo(t.slidesContainer)
- .hide()
- .fadeIn()
- .siblings(':visible')
- .fadeOut();
-
- });
-
- } else {
-
- if (!img.is(':visible') && !img.is(':animated')) {
-
- //
-
- img.fadeIn()
- .siblings(':visible')
- .fadeOut();
- }
- }
-
- },
-
- displaySlides: function() {
-
- if (typeof this.slides == 'undefined')
- return;
-
- var
- t = this,
- slides = t.slides,
- i;
-
- for (i=0; i<slides.entries.times.length; i++) {
- if (t.media.currentTime >= slides.entries.times[i].start && t.media.currentTime <= slides.entries.times[i].stop){
-
- t.showSlide(i);
-
- return; // exit out if one is visible;
- }
- }
- },
-
- displayChapters: function() {
- var
- t = this,
- i;
-
- for (i=0; i<t.tracks.length; i++) {
- if (t.tracks[i].kind == 'chapters' && t.tracks[i].isLoaded) {
- t.drawChapters(t.tracks[i]);
- t.hasChapters = true;
- break;
- }
- }
- },
-
- drawChapters: function(chapters) {
- var
- t = this,
- i,
- dur,
- //width,
- //left,
- percent = 0,
- usedPercent = 0;
-
- t.chapters.empty();
-
- for (i=0; i<chapters.entries.times.length; i++) {
- dur = chapters.entries.times[i].stop - chapters.entries.times[i].start;
- percent = Math.floor(dur / t.media.duration * 100);
- if (percent + usedPercent > 100 || // too large
- i == chapters.entries.times.length-1 && percent + usedPercent < 100) // not going to fill it in
- {
- percent = 100 - usedPercent;
- }
- //width = Math.floor(t.width * dur / t.media.duration);
- //left = Math.floor(t.width * chapters.entries.times[i].start / t.media.duration);
- //if (left + width > t.width) {
- // width = t.width - left;
- //}
-
- t.chapters.append( $(
- '<div class="mejs-chapter" rel="' + chapters.entries.times[i].start + '" style="left: ' + usedPercent.toString() + '%;width: ' + percent.toString() + '%;">' +
- '<div class="mejs-chapter-block' + ((i==chapters.entries.times.length-1) ? ' mejs-chapter-block-last' : '') + '">' +
- '<span class="ch-title">' + chapters.entries.text[i] + '</span>' +
- '<span class="ch-time">' + mejs.Utility.secondsToTimeCode(chapters.entries.times[i].start, t.options) + '&ndash;' + mejs.Utility.secondsToTimeCode(chapters.entries.times[i].stop, t.options) + '</span>' +
- '</div>' +
- '</div>'));
- usedPercent += percent;
- }
-
- t.chapters.find('div.mejs-chapter').click(function() {
- t.media.setCurrentTime( parseFloat( $(this).attr('rel') ) );
- if (t.media.paused) {
- t.media.play();
- }
- });
-
- t.chapters.show();
- }
- });
-
-
-
- mejs.language = {
- codes: {
- af:'Afrikaans',
- sq:'Albanian',
- ar:'Arabic',
- be:'Belarusian',
- bg:'Bulgarian',
- ca:'Catalan',
- zh:'Chinese',
- 'zh-cn':'Chinese Simplified',
- 'zh-tw':'Chinese Traditional',
- hr:'Croatian',
- cs:'Czech',
- da:'Danish',
- nl:'Dutch',
- en:'English',
- et:'Estonian',
- fl:'Filipino',
- fi:'Finnish',
- fr:'French',
- gl:'Galician',
- de:'German',
- el:'Greek',
- ht:'Haitian Creole',
- iw:'Hebrew',
- hi:'Hindi',
- hu:'Hungarian',
- is:'Icelandic',
- id:'Indonesian',
- ga:'Irish',
- it:'Italian',
- ja:'Japanese',
- ko:'Korean',
- lv:'Latvian',
- lt:'Lithuanian',
- mk:'Macedonian',
- ms:'Malay',
- mt:'Maltese',
- no:'Norwegian',
- fa:'Persian',
- pl:'Polish',
- pt:'Portuguese',
- // 'pt-pt':'Portuguese (Portugal)',
- ro:'Romanian',
- ru:'Russian',
- sr:'Serbian',
- sk:'Slovak',
- sl:'Slovenian',
- es:'Spanish',
- sw:'Swahili',
- sv:'Swedish',
- tl:'Tagalog',
- th:'Thai',
- tr:'Turkish',
- uk:'Ukrainian',
- vi:'Vietnamese',
- cy:'Welsh',
- yi:'Yiddish'
- }
- };
-
- /*
- Parses WebVTT format which should be formatted as
- ================================
- WEBVTT
-
- 1
- 00:00:01,1 --> 00:00:05,000
- A line of text
-
- 2
- 00:01:15,1 --> 00:02:05,000
- A second line of text
-
- ===============================
-
- Adapted from: http://www.delphiki.com/html5/playr
- */
- mejs.TrackFormatParser = {
- webvtt: {
- pattern_timecode: /^((?:[0-9]{1,2}:)?[0-9]{2}:[0-9]{2}([,.][0-9]{1,3})?) --\> ((?:[0-9]{1,2}:)?[0-9]{2}:[0-9]{2}([,.][0-9]{3})?)(.*)$/,
-
- parse: function(trackText) {
- var
- i = 0,
- lines = mejs.TrackFormatParser.split2(trackText, /\r?\n/),
- entries = {text:[], times:[]},
- timecode,
- text,
- identifier;
- for(; i<lines.length; i++) {
- timecode = this.pattern_timecode.exec(lines[i]);
-
- if (timecode && i<lines.length) {
- if ((i - 1) >= 0 && lines[i - 1] !== '') {
- identifier = lines[i - 1];
- }
- i++;
- // grab all the (possibly multi-line) text that follows
- text = lines[i];
- i++;
- while(lines[i] !== '' && i<lines.length){
- text = text + '\n' + lines[i];
- i++;
- }
- text = $.trim(text).replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig, "<a href='$1' target='_blank'>$1</a>");
- // Text is in a different array so I can use .join
- entries.text.push(text);
- entries.times.push(
- {
- identifier: identifier,
- start: (mejs.Utility.convertSMPTEtoSeconds(timecode[1]) === 0) ? 0.200 : mejs.Utility.convertSMPTEtoSeconds(timecode[1]),
- stop: mejs.Utility.convertSMPTEtoSeconds(timecode[3]),
- settings: timecode[5]
- });
- }
- identifier = '';
- }
- return entries;
- }
- },
- // Thanks to Justin Capella: https://github.com/johndyer/mediaelement/pull/420
- dfxp: {
- parse: function(trackText) {
- trackText = $(trackText).filter("tt");
- var
- i = 0,
- container = trackText.children("div").eq(0),
- lines = container.find("p"),
- styleNode = trackText.find("#" + container.attr("style")),
- styles,
- text,
- entries = {text:[], times:[]};
-
-
- if (styleNode.length) {
- var attributes = styleNode.removeAttr("id").get(0).attributes;
- if (attributes.length) {
- styles = {};
- for (i = 0; i < attributes.length; i++) {
- styles[attributes[i].name.split(":")[1]] = attributes[i].value;
- }
- }
- }
-
- for(i = 0; i<lines.length; i++) {
- var style;
- var _temp_times = {
- start: null,
- stop: null,
- style: null
- };
- if (lines.eq(i).attr("begin")) _temp_times.start = mejs.Utility.convertSMPTEtoSeconds(lines.eq(i).attr("begin"));
- if (!_temp_times.start && lines.eq(i-1).attr("end")) _temp_times.start = mejs.Utility.convertSMPTEtoSeconds(lines.eq(i-1).attr("end"));
- if (lines.eq(i).attr("end")) _temp_times.stop = mejs.Utility.convertSMPTEtoSeconds(lines.eq(i).attr("end"));
- if (!_temp_times.stop && lines.eq(i+1).attr("begin")) _temp_times.stop = mejs.Utility.convertSMPTEtoSeconds(lines.eq(i+1).attr("begin"));
- if (styles) {
- style = "";
- for (var _style in styles) {
- style += _style + ":" + styles[_style] + ";";
- }
- }
- if (style) _temp_times.style = style;
- if (_temp_times.start === 0) _temp_times.start = 0.200;
- entries.times.push(_temp_times);
- text = $.trim(lines.eq(i).html()).replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig, "<a href='$1' target='_blank'>$1</a>");
- entries.text.push(text);
- if (entries.times.start === 0) entries.times.start = 2;
- }
- return entries;
- }
- },
- split2: function (text, regex) {
- // normal version for compliant browsers
- // see below for IE fix
- return text.split(regex);
- }
- };
-
- // test for browsers with bad String.split method.
- if ('x\n\ny'.split(/\n/gi).length != 3) {
- // add super slow IE8 and below version
- mejs.TrackFormatParser.split2 = function(text, regex) {
- var
- parts = [],
- chunk = '',
- i;
-
- for (i=0; i<text.length; i++) {
- chunk += text.substring(i,i+1);
- if (regex.test(chunk)) {
- parts.push(chunk.replace(regex, ''));
- chunk = '';
- }
- }
- parts.push(chunk);
- return parts;
- };
- }
-
-})(mejs.$);
-
-/*
-* ContextMenu Plugin
-*
-*
-*/
-
-(function($) {
-
-$.extend(mejs.MepDefaults,
- { 'contextMenuItems': [
- // demo of a fullscreen option
- {
- render: function(player) {
-
- // check for fullscreen plugin
- if (typeof player.enterFullScreen == 'undefined')
- return null;
-
- if (player.isFullScreen) {
- return mejs.i18n.t('Turn off Fullscreen');
- } else {
- return mejs.i18n.t('Go Fullscreen');
- }
- },
- click: function(player) {
- if (player.isFullScreen) {
- player.exitFullScreen();
- } else {
- player.enterFullScreen();
- }
- }
- }
- ,
- // demo of a mute/unmute button
- {
- render: function(player) {
- if (player.media.muted) {
- return mejs.i18n.t('Unmute');
- } else {
- return mejs.i18n.t('Mute');
- }
- },
- click: function(player) {
- if (player.media.muted) {
- player.setMuted(false);
- } else {
- player.setMuted(true);
- }
- }
- },
- // separator
- {
- isSeparator: true
- }
- ,
- // demo of simple download video
- {
- render: function(player) {
- return mejs.i18n.t('Download Video');
- },
- click: function(player) {
- window.location.href = player.media.currentSrc;
- }
- }
- ]}
-);
-
-
- $.extend(MediaElementPlayer.prototype, {
- buildcontextmenu: function(player, controls, layers, media) {
-
- // create context menu
- player.contextMenu = $('<div class="mejs-contextmenu"></div>')
- .appendTo($('body'))
- .hide();
-
- // create events for showing context menu
- player.container.bind('contextmenu', function(e) {
- if (player.isContextMenuEnabled) {
- e.preventDefault();
- player.renderContextMenu(e.clientX-1, e.clientY-1);
- return false;
- }
- });
- player.container.bind('click', function() {
- player.contextMenu.hide();
- });
- player.contextMenu.bind('mouseleave', function() {
-
- //
- player.startContextMenuTimer();
-
- });
- },
-
- cleancontextmenu: function(player) {
- player.contextMenu.remove();
- },
-
- isContextMenuEnabled: true,
- enableContextMenu: function() {
- this.isContextMenuEnabled = true;
- },
- disableContextMenu: function() {
- this.isContextMenuEnabled = false;
- },
-
- contextMenuTimeout: null,
- startContextMenuTimer: function() {
- //
-
- var t = this;
-
- t.killContextMenuTimer();
-
- t.contextMenuTimer = setTimeout(function() {
- t.hideContextMenu();
- t.killContextMenuTimer();
- }, 750);
- },
- killContextMenuTimer: function() {
- var timer = this.contextMenuTimer;
-
- //
-
- if (timer != null) {
- clearTimeout(timer);
- delete timer;
- timer = null;
- }
- },
-
- hideContextMenu: function() {
- this.contextMenu.hide();
- },
-
- renderContextMenu: function(x,y) {
-
- // alway re-render the items so that things like "turn fullscreen on" and "turn fullscreen off" are always written correctly
- var t = this,
- html = '',
- items = t.options.contextMenuItems;
-
- for (var i=0, il=items.length; i<il; i++) {
-
- if (items[i].isSeparator) {
- html += '<div class="mejs-contextmenu-separator"></div>';
- } else {
-
- var rendered = items[i].render(t);
-
- // render can return null if the item doesn't need to be used at the moment
- if (rendered != null) {
- html += '<div class="mejs-contextmenu-item" data-itemindex="' + i + '" id="element-' + (Math.random()*1000000) + '">' + rendered + '</div>';
- }
- }
- }
-
- // position and show the context menu
- t.contextMenu
- .empty()
- .append($(html))
- .css({top:y, left:x})
- .show();
-
- // bind events
- t.contextMenu.find('.mejs-contextmenu-item').each(function() {
-
- // which one is this?
- var $dom = $(this),
- itemIndex = parseInt( $dom.data('itemindex'), 10 ),
- item = t.options.contextMenuItems[itemIndex];
-
- // bind extra functionality?
- if (typeof item.show != 'undefined')
- item.show( $dom , t);
-
- // bind click action
- $dom.click(function() {
- // perform click action
- if (typeof item.click != 'undefined')
- item.click(t);
-
- // close
- t.contextMenu.hide();
- });
- });
-
- // stop the controls from hiding
- setTimeout(function() {
- t.killControlsTimer('rev3');
- }, 100);
-
- }
- });
-
-})(mejs.$);
-(function($) {
- // skip back button
-
- $.extend(mejs.MepDefaults, {
- skipBackInterval: 30,
- // %1 will be replaced with skipBackInterval in this string
- skipBackText: mejs.i18n.t('Skip back %1 seconds')
- });
-
- $.extend(MediaElementPlayer.prototype, {
- buildskipback: function(player, controls, layers, media) {
- var
- t = this,
- // Replace %1 with skip back interval
- backText = t.options.skipBackText.replace('%1', t.options.skipBackInterval),
- // create the loop button
- loop =
- $('<div class="mejs-button mejs-skip-back-button">' +
- '<button type="button" aria-controls="' + t.id + '" title="' + backText + '" aria-label="' + backText + '">' + t.options.skipBackInterval + '</button>' +
- '</div>')
- // append it to the toolbar
- .appendTo(controls)
- // add a click toggle event
- .click(function() {
- media.setCurrentTime(Math.max(media.currentTime - t.options.skipBackInterval, 0));
- $(this).find('button').blur();
- });
- }
- });
-
-})(mejs.$);
-
-/**
- * Postroll plugin
- */
-(function($) {
-
- $.extend(mejs.MepDefaults, {
- postrollCloseText: mejs.i18n.t('Close')
- });
-
- // Postroll
- $.extend(MediaElementPlayer.prototype, {
- buildpostroll: function(player, controls, layers, media) {
- var
- t = this,
- postrollLink = t.container.find('link[rel="postroll"]').attr('href');
-
- if (typeof postrollLink !== 'undefined') {
- player.postroll =
- $('<div class="mejs-postroll-layer mejs-layer"><a class="mejs-postroll-close" onclick="$(this).parent().hide();return false;">' + t.options.postrollCloseText + '</a><div class="mejs-postroll-layer-content"></div></div>').prependTo(layers).hide();
-
- t.media.addEventListener('ended', function (e) {
- $.ajax({
- dataType: 'html',
- url: postrollLink,
- success: function (data, textStatus) {
- layers.find('.mejs-postroll-layer-content').html(data);
- }
- });
- player.postroll.show();
- }, false);
- }
- }
- });
-
-})(mejs.$); \ No newline at end of file
diff --git a/files_videoviewer/js/mediaelement-and-player.min.js b/files_videoviewer/js/mediaelement-and-player.min.js
deleted file mode 100755
index 6c05593c7..000000000
--- a/files_videoviewer/js/mediaelement-and-player.min.js
+++ /dev/null
@@ -1,28 +0,0 @@
-/*!
- *
- * MediaElement.js
- * HTML5 <video> and <audio> shim and player
- * http://mediaelementjs.com/
- *
- * Creates a JavaScript object that mimics HTML5 MediaElement API
- * for browsers that don't understand HTML5 or can't play the provided codec
- * Can play MP4 (H.264), Ogg, WebM, FLV, WMV, WMA, ACC, and MP3
- *
- * Copyright 2010-2014, John Dyer (http://j.hn)
- * License: MIT
- *
- */
-var mejs=mejs||{};mejs.version="2.21.2",mejs.meIndex=0,mejs.plugins={silverlight:[{version:[3,0],types:["video/mp4","video/m4v","video/mov","video/wmv","audio/wma","audio/m4a","audio/mp3","audio/wav","audio/mpeg"]}],flash:[{version:[9,0,124],types:["video/mp4","video/m4v","video/mov","video/flv","video/rtmp","video/x-flv","audio/flv","audio/x-flv","audio/mp3","audio/m4a","audio/mpeg","video/dailymotion","video/x-dailymotion","application/x-mpegURL"]}],youtube:[{version:null,types:["video/youtube","video/x-youtube","audio/youtube","audio/x-youtube"]}],vimeo:[{version:null,types:["video/vimeo","video/x-vimeo"]}]},mejs.Utility={encodeUrl:function(a){return encodeURIComponent(a)},escapeHTML:function(a){return a.toString().split("&").join("&amp;").split("<").join("&lt;").split('"').join("&quot;")},absolutizeUrl:function(a){var b=document.createElement("div");return b.innerHTML='<a href="'+this.escapeHTML(a)+'">x</a>',b.firstChild.href},getScriptPath:function(a){for(var b,c,d,e,f,g,h=0,i="",j="",k=document.getElementsByTagName("script"),l=k.length,m=a.length;l>h;h++){for(e=k[h].src,c=e.lastIndexOf("/"),c>-1?(g=e.substring(c+1),f=e.substring(0,c+1)):(g=e,f=""),b=0;m>b;b++)if(j=a[b],d=g.indexOf(j),d>-1){i=f;break}if(""!==i)break}return i},calculateTimeFormat:function(a,b,c){0>a&&(a=0),"undefined"==typeof c&&(c=25);var d=b.timeFormat,e=d[0],f=d[1]==d[0],g=f?2:1,h=":",i=Math.floor(a/3600)%24,j=Math.floor(a/60)%60,k=Math.floor(a%60),l=Math.floor((a%1*c).toFixed(3)),m=[[l,"f"],[k,"s"],[j,"m"],[i,"h"]];d.length<g&&(h=d[g]);for(var n=!1,o=0,p=m.length;p>o;o++)if(-1!==d.indexOf(m[o][1]))n=!0;else if(n){for(var q=!1,r=o;p>r;r++)if(m[r][0]>0){q=!0;break}if(!q)break;f||(d=e+d),d=m[o][1]+h+d,f&&(d=m[o][1]+d),e=m[o][1]}b.currentTimeFormat=d},twoDigitsString:function(a){return 10>a?"0"+a:String(a)},secondsToTimeCode:function(a,b){if(0>a&&(a=0),"object"!=typeof b){var c="m:ss";c=arguments[1]?"hh:mm:ss":c,c=arguments[2]?c+":ff":c,b={currentTimeFormat:c,framesPerSecond:arguments[3]||25}}var d=b.framesPerSecond;"undefined"==typeof d&&(d=25);var c=b.currentTimeFormat,e=Math.floor(a/3600)%24,f=Math.floor(a/60)%60,g=Math.floor(a%60),h=Math.floor((a%1*d).toFixed(3));lis=[[h,"f"],[g,"s"],[f,"m"],[e,"h"]];var j=c;for(i=0,len=lis.length;i<len;i++)j=j.replace(lis[i][1]+lis[i][1],this.twoDigitsString(lis[i][0])),j=j.replace(lis[i][1],lis[i][0]);return j},timeCodeToSeconds:function(a,b,c,d){"undefined"==typeof c?c=!1:"undefined"==typeof d&&(d=25);var e=a.split(":"),f=parseInt(e[0],10),g=parseInt(e[1],10),h=parseInt(e[2],10),i=0,j=0;return c&&(i=parseInt(e[3])/d),j=3600*f+60*g+h+i},convertSMPTEtoSeconds:function(a){if("string"!=typeof a)return!1;a=a.replace(",",".");var b=0,c=-1!=a.indexOf(".")?a.split(".")[1].length:0,d=1;a=a.split(":").reverse();for(var e=0;e<a.length;e++)d=1,e>0&&(d=Math.pow(60,e)),b+=Number(a[e])*d;return Number(b.toFixed(c))},removeSwf:function(a){var b=document.getElementById(a);b&&/object|embed/i.test(b.nodeName)&&(mejs.MediaFeatures.isIE?(b.style.display="none",function(){4==b.readyState?mejs.Utility.removeObjectInIE(a):setTimeout(arguments.callee,10)}()):b.parentNode.removeChild(b))},removeObjectInIE:function(a){var b=document.getElementById(a);if(b){for(var c in b)"function"==typeof b[c]&&(b[c]=null);b.parentNode.removeChild(b)}},determineScheme:function(a){return a&&-1!=a.indexOf("://")?a.substr(0,a.indexOf("://")+3):"//"}},mejs.PluginDetector={hasPluginVersion:function(a,b){var c=this.plugins[a];return b[1]=b[1]||0,b[2]=b[2]||0,c[0]>b[0]||c[0]==b[0]&&c[1]>b[1]||c[0]==b[0]&&c[1]==b[1]&&c[2]>=b[2]?!0:!1},nav:window.navigator,ua:window.navigator.userAgent.toLowerCase(),plugins:[],addPlugin:function(a,b,c,d,e){this.plugins[a]=this.detectPlugin(b,c,d,e)},detectPlugin:function(a,b,c,d){var e,f,g,h=[0,0,0];if("undefined"!=typeof this.nav.plugins&&"object"==typeof this.nav.plugins[a]){if(e=this.nav.plugins[a].description,e&&("undefined"==typeof this.nav.mimeTypes||!this.nav.mimeTypes[b]||this.nav.mimeTypes[b].enabledPlugin))for(h=e.replace(a,"").replace(/^\s+/,"").replace(/\sr/gi,".").split("."),f=0;f<h.length;f++)h[f]=parseInt(h[f].match(/\d+/),10)}else if("undefined"!=typeof window.ActiveXObject)try{g=new ActiveXObject(c),g&&(h=d(g))}catch(i){}return h}},mejs.PluginDetector.addPlugin("flash","Shockwave Flash","application/x-shockwave-flash","ShockwaveFlash.ShockwaveFlash",function(a){var b=[],c=a.GetVariable("$version");return c&&(c=c.split(" ")[1].split(","),b=[parseInt(c[0],10),parseInt(c[1],10),parseInt(c[2],10)]),b}),mejs.PluginDetector.addPlugin("silverlight","Silverlight Plug-In","application/x-silverlight-2","AgControl.AgControl",function(a){var b=[0,0,0,0],c=function(a,b,c,d){for(;a.isVersionSupported(b[0]+"."+b[1]+"."+b[2]+"."+b[3]);)b[c]+=d;b[c]-=d};return c(a,b,0,1),c(a,b,1,1),c(a,b,2,1e4),c(a,b,2,1e3),c(a,b,2,100),c(a,b,2,10),c(a,b,2,1),c(a,b,3,1),b}),mejs.MediaFeatures={init:function(){var a,b,c=this,d=document,e=mejs.PluginDetector.nav,f=mejs.PluginDetector.ua.toLowerCase(),g=["source","track","audio","video"];c.isiPad=null!==f.match(/ipad/i),c.isiPhone=null!==f.match(/iphone/i),c.isiOS=c.isiPhone||c.isiPad,c.isAndroid=null!==f.match(/android/i),c.isBustedAndroid=null!==f.match(/android 2\.[12]/),c.isBustedNativeHTTPS="https:"===location.protocol&&(null!==f.match(/android [12]\./)||null!==f.match(/macintosh.* version.* safari/)),c.isIE=-1!=e.appName.toLowerCase().indexOf("microsoft")||null!==e.appName.toLowerCase().match(/trident/gi),c.isChrome=null!==f.match(/chrome/gi),c.isChromium=null!==f.match(/chromium/gi),c.isFirefox=null!==f.match(/firefox/gi),c.isWebkit=null!==f.match(/webkit/gi),c.isGecko=null!==f.match(/gecko/gi)&&!c.isWebkit&&!c.isIE,c.isOpera=null!==f.match(/opera/gi),c.hasTouch="ontouchstart"in window,c.svgAsImg=!!document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Image","1.1");for(a=0;a<g.length;a++)b=document.createElement(g[a]);c.supportsMediaTag="undefined"!=typeof b.canPlayType||c.isBustedAndroid;try{b.canPlayType("video/mp4")}catch(h){c.supportsMediaTag=!1}c.supportsPointerEvents=function(){var a,b=document.createElement("x"),c=document.documentElement,d=window.getComputedStyle;return"pointerEvents"in b.style?(b.style.pointerEvents="auto",b.style.pointerEvents="x",c.appendChild(b),a=d&&"auto"===d(b,"").pointerEvents,c.removeChild(b),!!a):!1}(),c.hasFirefoxPluginMovingProblem=!1,c.hasiOSFullScreen="undefined"!=typeof b.webkitEnterFullscreen,c.hasNativeFullscreen="undefined"!=typeof b.requestFullscreen,c.hasWebkitNativeFullScreen="undefined"!=typeof b.webkitRequestFullScreen,c.hasMozNativeFullScreen="undefined"!=typeof b.mozRequestFullScreen,c.hasMsNativeFullScreen="undefined"!=typeof b.msRequestFullscreen,c.hasTrueNativeFullScreen=c.hasWebkitNativeFullScreen||c.hasMozNativeFullScreen||c.hasMsNativeFullScreen,c.nativeFullScreenEnabled=c.hasTrueNativeFullScreen,c.hasMozNativeFullScreen?c.nativeFullScreenEnabled=document.mozFullScreenEnabled:c.hasMsNativeFullScreen&&(c.nativeFullScreenEnabled=document.msFullscreenEnabled),c.isChrome&&(c.hasiOSFullScreen=!1),c.hasTrueNativeFullScreen&&(c.fullScreenEventName="",c.hasWebkitNativeFullScreen?c.fullScreenEventName="webkitfullscreenchange":c.hasMozNativeFullScreen?c.fullScreenEventName="mozfullscreenchange":c.hasMsNativeFullScreen&&(c.fullScreenEventName="MSFullscreenChange"),c.isFullScreen=function(){return c.hasMozNativeFullScreen?d.mozFullScreen:c.hasWebkitNativeFullScreen?d.webkitIsFullScreen:c.hasMsNativeFullScreen?null!==d.msFullscreenElement:void 0},c.requestFullScreen=function(a){c.hasWebkitNativeFullScreen?a.webkitRequestFullScreen():c.hasMozNativeFullScreen?a.mozRequestFullScreen():c.hasMsNativeFullScreen&&a.msRequestFullscreen()},c.cancelFullScreen=function(){c.hasWebkitNativeFullScreen?document.webkitCancelFullScreen():c.hasMozNativeFullScreen?document.mozCancelFullScreen():c.hasMsNativeFullScreen&&document.msExitFullscreen()}),c.hasiOSFullScreen&&f.match(/mac os x 10_5/i)&&(c.hasNativeFullScreen=!1,c.hasiOSFullScreen=!1)}},mejs.MediaFeatures.init(),mejs.HtmlMediaElement={pluginType:"native",isFullScreen:!1,setCurrentTime:function(a){this.currentTime=a},setMuted:function(a){this.muted=a},setVolume:function(a){this.volume=a},stop:function(){this.pause()},setSrc:function(a){for(var b=this.getElementsByTagName("source");b.length>0;)this.removeChild(b[0]);if("string"==typeof a)this.src=a;else{var c,d;for(c=0;c<a.length;c++)if(d=a[c],this.canPlayType(d.type)){this.src=d.src;break}}},setVideoSize:function(a,b){this.width=a,this.height=b}},mejs.PluginMediaElement=function(a,b,c){this.id=a,this.pluginType=b,this.src=c,this.events={},this.attributes={}},mejs.PluginMediaElement.prototype={pluginElement:null,pluginType:"",isFullScreen:!1,playbackRate:-1,defaultPlaybackRate:-1,seekable:[],played:[],paused:!0,ended:!1,seeking:!1,duration:0,error:null,tagName:"",muted:!1,volume:1,currentTime:0,play:function(){null!=this.pluginApi&&("youtube"==this.pluginType||"vimeo"==this.pluginType?this.pluginApi.playVideo():this.pluginApi.playMedia(),this.paused=!1)},load:function(){null!=this.pluginApi&&("youtube"==this.pluginType||"vimeo"==this.pluginType||this.pluginApi.loadMedia(),this.paused=!1)},pause:function(){null!=this.pluginApi&&("youtube"==this.pluginType||"vimeo"==this.pluginType?1==this.pluginApi.getPlayerState()&&this.pluginApi.pauseVideo():this.pluginApi.pauseMedia(),this.paused=!0)},stop:function(){null!=this.pluginApi&&("youtube"==this.pluginType||"vimeo"==this.pluginType?this.pluginApi.stopVideo():this.pluginApi.stopMedia(),this.paused=!0)},canPlayType:function(a){var b,c,d,e=mejs.plugins[this.pluginType];for(b=0;b<e.length;b++)if(d=e[b],mejs.PluginDetector.hasPluginVersion(this.pluginType,d.version))for(c=0;c<d.types.length;c++)if(a==d.types[c])return"probably";return""},positionFullscreenButton:function(a,b,c){null!=this.pluginApi&&this.pluginApi.positionFullscreenButton&&this.pluginApi.positionFullscreenButton(Math.floor(a),Math.floor(b),c)},hideFullscreenButton:function(){null!=this.pluginApi&&this.pluginApi.hideFullscreenButton&&this.pluginApi.hideFullscreenButton()},setSrc:function(a){if("string"==typeof a)this.pluginApi.setSrc(mejs.Utility.absolutizeUrl(a)),this.src=mejs.Utility.absolutizeUrl(a);else{var b,c;for(b=0;b<a.length;b++)if(c=a[b],this.canPlayType(c.type)){this.pluginApi.setSrc(mejs.Utility.absolutizeUrl(c.src)),this.src=mejs.Utility.absolutizeUrl(c.src);break}}},setCurrentTime:function(a){null!=this.pluginApi&&("youtube"==this.pluginType||"vimeo"==this.pluginType?this.pluginApi.seekTo(a):this.pluginApi.setCurrentTime(a),this.currentTime=a)},setVolume:function(a){null!=this.pluginApi&&("youtube"==this.pluginType?this.pluginApi.setVolume(100*a):this.pluginApi.setVolume(a),this.volume=a)},setMuted:function(a){null!=this.pluginApi&&("youtube"==this.pluginType?(a?this.pluginApi.mute():this.pluginApi.unMute(),this.muted=a,this.dispatchEvent({type:"volumechange"})):this.pluginApi.setMuted(a),this.muted=a)},setVideoSize:function(a,b){this.pluginElement&&this.pluginElement.style&&(this.pluginElement.style.width=a+"px",this.pluginElement.style.height=b+"px"),null!=this.pluginApi&&this.pluginApi.setVideoSize&&this.pluginApi.setVideoSize(a,b)},setFullscreen:function(a){null!=this.pluginApi&&this.pluginApi.setFullscreen&&this.pluginApi.setFullscreen(a)},enterFullScreen:function(){null!=this.pluginApi&&this.pluginApi.setFullscreen&&this.setFullscreen(!0)},exitFullScreen:function(){null!=this.pluginApi&&this.pluginApi.setFullscreen&&this.setFullscreen(!1)},addEventListener:function(a,b,c){this.events[a]=this.events[a]||[],this.events[a].push(b)},removeEventListener:function(a,b){if(!a)return this.events={},!0;var c=this.events[a];if(!c)return!0;if(!b)return this.events[a]=[],!0;for(var d=0;d<c.length;d++)if(c[d]===b)return this.events[a].splice(d,1),!0;return!1},dispatchEvent:function(a){var b,c=this.events[a.type];if(c)for(b=0;b<c.length;b++)c[b].apply(this,[a])},hasAttribute:function(a){return a in this.attributes},removeAttribute:function(a){delete this.attributes[a]},getAttribute:function(a){return this.hasAttribute(a)?this.attributes[a]:""},setAttribute:function(a,b){this.attributes[a]=b},remove:function(){mejs.Utility.removeSwf(this.pluginElement.id),mejs.MediaPluginBridge.unregisterPluginElement(this.pluginElement.id)}},mejs.MediaElementDefaults={mode:"auto",plugins:["flash","silverlight","youtube","vimeo"],enablePluginDebug:!1,httpsBasicAuthSite:!1,type:"",pluginPath:mejs.Utility.getScriptPath(["mediaelement.js","mediaelement.min.js","mediaelement-and-player.js","mediaelement-and-player.min.js"]),flashName:"flashmediaelement.swf",flashStreamer:"",flashScriptAccess:"sameDomain",enablePluginSmoothing:!1,enablePseudoStreaming:!1,pseudoStreamingStartQueryParam:"start",silverlightName:"silverlightmediaelement.xap",defaultVideoWidth:480,defaultVideoHeight:270,pluginWidth:-1,pluginHeight:-1,pluginVars:[],timerRate:250,startVolume:.8,success:function(){},error:function(){}},mejs.MediaElement=function(a,b){return mejs.HtmlMediaElementShim.create(a,b)},mejs.HtmlMediaElementShim={create:function(a,b){var c,d,e={},f="string"==typeof a?document.getElementById(a):a,g=f.tagName.toLowerCase(),h="audio"===g||"video"===g,i=h?f.getAttribute("src"):f.getAttribute("href"),j=f.getAttribute("poster"),k=f.getAttribute("autoplay"),l=f.getAttribute("preload"),m=f.getAttribute("controls");for(d in mejs.MediaElementDefaults)e[d]=mejs.MediaElementDefaults[d];for(d in b)e[d]=b[d];return i="undefined"==typeof i||null===i||""==i?null:i,j="undefined"==typeof j||null===j?"":j,l="undefined"==typeof l||null===l||"false"===l?"none":l,k=!("undefined"==typeof k||null===k||"false"===k),m=!("undefined"==typeof m||null===m||"false"===m),c=this.determinePlayback(f,e,mejs.MediaFeatures.supportsMediaTag,h,i),c.url=null!==c.url?mejs.Utility.absolutizeUrl(c.url):"",c.scheme=mejs.Utility.determineScheme(c.url),"native"==c.method?(mejs.MediaFeatures.isBustedAndroid&&(f.src=c.url,f.addEventListener("click",function(){f.play()},!1)),this.updateNative(c,e,k,l)):""!==c.method?this.createPlugin(c,e,j,k,l,m):(this.createErrorMessage(c,e,j),this)},determinePlayback:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=[],r={method:"",url:"",htmlMediaElement:a,isVideo:"audio"!=a.tagName.toLowerCase(),scheme:""};if("undefined"!=typeof b.type&&""!==b.type)if("string"==typeof b.type)q.push({type:b.type,url:e});else for(f=0;f<b.type.length;f++)q.push({type:b.type[f],url:e});else if(null!==e)k=this.formatType(e,a.getAttribute("type")),q.push({type:k,url:e});else for(f=0;f<a.childNodes.length;f++)j=a.childNodes[f],1==j.nodeType&&"source"==j.tagName.toLowerCase()&&(e=j.getAttribute("src"),k=this.formatType(e,j.getAttribute("type")),p=j.getAttribute("media"),(!p||!window.matchMedia||window.matchMedia&&window.matchMedia(p).matches)&&q.push({type:k,url:e}));if(!d&&q.length>0&&null!==q[0].url&&this.getTypeFromFile(q[0].url).indexOf("audio")>-1&&(r.isVideo=!1),mejs.MediaFeatures.isBustedAndroid&&(a.canPlayType=function(a){return null!==a.match(/video\/(mp4|m4v)/gi)?"maybe":""}),mejs.MediaFeatures.isChromium&&(a.canPlayType=function(a){return null!==a.match(/video\/(webm|ogv|ogg)/gi)?"maybe":""}),c&&("auto"===b.mode||"auto_plugin"===b.mode||"native"===b.mode)&&(!mejs.MediaFeatures.isBustedNativeHTTPS||b.httpsBasicAuthSite!==!0)){for(d||(o=document.createElement(r.isVideo?"video":"audio"),a.parentNode.insertBefore(o,a),a.style.display="none",r.htmlMediaElement=a=o),f=0;f<q.length;f++)if("video/m3u8"==q[f].type||""!==a.canPlayType(q[f].type).replace(/no/,"")||""!==a.canPlayType(q[f].type.replace(/mp3/,"mpeg")).replace(/no/,"")||""!==a.canPlayType(q[f].type.replace(/m4a/,"mp4")).replace(/no/,"")){r.method="native",r.url=q[f].url;break}if("native"===r.method&&(null!==r.url&&(a.src=r.url),"auto_plugin"!==b.mode))return r}if("auto"===b.mode||"auto_plugin"===b.mode||"shim"===b.mode)for(f=0;f<q.length;f++)for(k=q[f].type,g=0;g<b.plugins.length;g++)for(l=b.plugins[g],m=mejs.plugins[l],h=0;h<m.length;h++)if(n=m[h],null==n.version||mejs.PluginDetector.hasPluginVersion(l,n.version))for(i=0;i<n.types.length;i++)if(k.toLowerCase()==n.types[i].toLowerCase())return r.method=l,r.url=q[f].url,r;return"auto_plugin"===b.mode&&"native"===r.method?r:(""===r.method&&q.length>0&&(r.url=q[0].url),r)},formatType:function(a,b){return a&&!b?this.getTypeFromFile(a):b&&~b.indexOf(";")?b.substr(0,b.indexOf(";")):b},getTypeFromFile:function(a){a=a.split("?")[0];var b=a.substring(a.lastIndexOf(".")+1).toLowerCase(),c=/(mp4|m4v|ogg|ogv|m3u8|webm|webmv|flv|wmv|mpeg|mov)/gi.test(b)?"video/":"audio/";return this.getTypeFromExtension(b,c)},getTypeFromExtension:function(a,b){switch(b=b||"",a){case"mp4":case"m4v":case"m4a":case"f4v":case"f4a":return b+"mp4";case"flv":return b+"x-flv";case"webm":case"webma":case"webmv":return b+"webm";case"ogg":case"oga":case"ogv":return b+"ogg";case"m3u8":return"application/x-mpegurl";case"ts":return b+"mp2t";default:return b+a}},createErrorMessage:function(a,b,c){var d=a.htmlMediaElement,e=document.createElement("div"),f=b.customError;e.className="me-cannotplay";try{e.style.width=d.width+"px",e.style.height=d.height+"px"}catch(g){}f||(f='<a href="'+a.url+'">',""!==c&&(f+='<img src="'+c+'" width="100%" height="100%" alt="" />'),f+="<span>"+mejs.i18n.t("Download File")+"</span></a>"),e.innerHTML=f,d.parentNode.insertBefore(e,d),d.style.display="none",b.error(d)},createPlugin:function(a,b,c,d,e,f){var g,h,i,j=a.htmlMediaElement,k=1,l=1,m="me_"+a.method+"_"+mejs.meIndex++,n=new mejs.PluginMediaElement(m,a.method,a.url),o=document.createElement("div");n.tagName=j.tagName;for(var p=0;p<j.attributes.length;p++){var q=j.attributes[p];q.specified&&n.setAttribute(q.name,q.value)}for(h=j.parentNode;null!==h&&null!=h.tagName&&"body"!==h.tagName.toLowerCase()&&null!=h.parentNode&&null!=h.parentNode.tagName&&null!=h.parentNode.constructor&&"ShadowRoot"===h.parentNode.constructor.name;){if("p"===h.parentNode.tagName.toLowerCase()){h.parentNode.parentNode.insertBefore(h,h.parentNode);break}h=h.parentNode}switch(a.isVideo?(k=b.pluginWidth>0?b.pluginWidth:b.videoWidth>0?b.videoWidth:null!==j.getAttribute("width")?j.getAttribute("width"):b.defaultVideoWidth,l=b.pluginHeight>0?b.pluginHeight:b.videoHeight>0?b.videoHeight:null!==j.getAttribute("height")?j.getAttribute("height"):b.defaultVideoHeight,k=mejs.Utility.encodeUrl(k),l=mejs.Utility.encodeUrl(l)):b.enablePluginDebug&&(k=320,l=240),n.success=b.success,o.className="me-plugin",o.id=m+"_container",a.isVideo?j.parentNode.insertBefore(o,j):document.body.insertBefore(o,document.body.childNodes[0]),("flash"===a.method||"silverlight"===a.method)&&(i=["id="+m,"isvideo="+(a.isVideo?"true":"false"),"autoplay="+(d?"true":"false"),"preload="+e,"width="+k,"startvolume="+b.startVolume,"timerrate="+b.timerRate,"flashstreamer="+b.flashStreamer,"height="+l,"pseudostreamstart="+b.pseudoStreamingStartQueryParam],null!==a.url&&("flash"==a.method?i.push("file="+mejs.Utility.encodeUrl(a.url)):i.push("file="+a.url)),b.enablePluginDebug&&i.push("debug=true"),b.enablePluginSmoothing&&i.push("smoothing=true"),b.enablePseudoStreaming&&i.push("pseudostreaming=true"),f&&i.push("controls=true"),b.pluginVars&&(i=i.concat(b.pluginVars)),window[m+"_init"]=function(){switch(n.pluginType){case"flash":n.pluginElement=n.pluginApi=document.getElementById(m);break;case"silverlight":n.pluginElement=document.getElementById(n.id),n.pluginApi=n.pluginElement.Content.MediaElementJS}null!=n.pluginApi&&n.success&&n.success(n,j)},window[m+"_event"]=function(a,b){var c,d,e;c={type:a,target:n};for(d in b)n[d]=b[d],c[d]=b[d];e=b.bufferedTime||0,c.target.buffered=c.buffered={start:function(a){return 0},end:function(a){return e},length:1},n.dispatchEvent(c)}),a.method){case"silverlight":o.innerHTML='<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" id="'+m+'" name="'+m+'" width="'+k+'" height="'+l+'" class="mejs-shim"><param name="initParams" value="'+i.join(",")+'" /><param name="windowless" value="true" /><param name="background" value="black" /><param name="minRuntimeVersion" value="3.0.0.0" /><param name="autoUpgrade" value="true" /><param name="source" value="'+b.pluginPath+b.silverlightName+'" /></object>';break;case"flash":mejs.MediaFeatures.isIE?(g=document.createElement("div"),o.appendChild(g),g.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab" id="'+m+'" width="'+k+'" height="'+l+'" class="mejs-shim"><param name="movie" value="'+b.pluginPath+b.flashName+"?"+(new Date).getTime()+'" /><param name="flashvars" value="'+i.join("&amp;")+'" /><param name="quality" value="high" /><param name="bgcolor" value="#000000" /><param name="wmode" value="transparent" /><param name="allowScriptAccess" value="'+b.flashScriptAccess+'" /><param name="allowFullScreen" value="true" /><param name="scale" value="default" /></object>'):o.innerHTML='<embed id="'+m+'" name="'+m+'" play="true" loop="false" quality="high" bgcolor="#000000" wmode="transparent" allowScriptAccess="'+b.flashScriptAccess+'" allowFullScreen="true" type="application/x-shockwave-flash" pluginspage="//www.macromedia.com/go/getflashplayer" src="'+b.pluginPath+b.flashName+'" flashvars="'+i.join("&")+'" width="'+k+'" height="'+l+'" scale="default"class="mejs-shim"></embed>';break;case"youtube":var r;-1!=a.url.lastIndexOf("youtu.be")?(r=a.url.substr(a.url.lastIndexOf("/")+1),-1!=r.indexOf("?")&&(r=r.substr(0,r.indexOf("?")))):r=a.url.substr(a.url.lastIndexOf("=")+1),youtubeSettings={container:o,containerId:o.id,pluginMediaElement:n,pluginId:m,videoId:r,height:l,width:k,scheme:a.scheme},window.postMessage?mejs.YouTubeApi.enqueueIframe(youtubeSettings):mejs.PluginDetector.hasPluginVersion("flash",[10,0,0])&&mejs.YouTubeApi.createFlash(youtubeSettings,b);break;case"vimeo":var s=m+"_player";if(n.vimeoid=a.url.substr(a.url.lastIndexOf("/")+1),o.innerHTML='<iframe src="'+a.scheme+"player.vimeo.com/video/"+n.vimeoid+"?api=1&portrait=0&byline=0&title=0&player_id="+s+'" width="'+k+'" height="'+l+'" frameborder="0" class="mejs-shim" id="'+s+'" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>',"function"==typeof $f){var t=$f(o.childNodes[0]),u=-1;t.addEvent("ready",function(){function a(a,b,c,d){var e={type:c,target:b};"timeupdate"==c&&(b.currentTime=e.currentTime=d.seconds,b.duration=e.duration=d.duration),b.dispatchEvent(e)}t.playVideo=function(){t.api("play")},t.stopVideo=function(){t.api("unload")},t.pauseVideo=function(){t.api("pause")},t.seekTo=function(a){t.api("seekTo",a)},t.setVolume=function(a){t.api("setVolume",a)},t.setMuted=function(a){a?(t.lastVolume=t.api("getVolume"),t.api("setVolume",0)):(t.api("setVolume",t.lastVolume),delete t.lastVolume)},t.getPlayerState=function(){return u},t.addEvent("play",function(){u=1,a(t,n,"play"),a(t,n,"playing")}),t.addEvent("pause",function(){u=2,a(t,n,"pause")}),t.addEvent("finish",function(){u=0,a(t,n,"ended")}),t.addEvent("playProgress",function(b){a(t,n,"timeupdate",b)}),t.addEvent("seek",function(b){u=3,a(t,n,"seeked",b)}),t.addEvent("loadProgress",function(b){u=3,a(t,n,"progress",b)}),n.pluginElement=o,n.pluginApi=t,n.success(n,n.pluginElement)})}else console.warn("You need to include froogaloop for vimeo to work")}return j.style.display="none",j.removeAttribute("autoplay"),n},updateNative:function(a,b,c,d){var e,f=a.htmlMediaElement;for(e in mejs.HtmlMediaElement)f[e]=mejs.HtmlMediaElement[e];return b.success(f,f),f}},mejs.YouTubeApi={isIframeStarted:!1,isIframeLoaded:!1,loadIframeApi:function(a){if(!this.isIframeStarted){var b=document.createElement("script");b.src=a.scheme+"www.youtube.com/player_api";var c=document.getElementsByTagName("script")[0];c.parentNode.insertBefore(b,c),this.isIframeStarted=!0}},iframeQueue:[],enqueueIframe:function(a){this.isLoaded?this.createIframe(a):(this.loadIframeApi(a),this.iframeQueue.push(a))},createIframe:function(a){var b=a.pluginMediaElement,c=new YT.Player(a.containerId,{height:a.height,width:a.width,videoId:a.videoId,playerVars:{controls:0,wmode:"transparent"},events:{onReady:function(){c.setVideoSize=function(a,b){c.setSize(a,b)},a.pluginMediaElement.pluginApi=c,a.pluginMediaElement.pluginElement=document.getElementById(a.containerId),b.success(b,b.pluginElement),setInterval(function(){mejs.YouTubeApi.createEvent(c,b,"timeupdate")},250)},onStateChange:function(a){mejs.YouTubeApi.handleStateChange(a.data,c,b)}}})},createEvent:function(a,b,c){var d={type:c,target:b};if(a&&a.getDuration){b.currentTime=d.currentTime=a.getCurrentTime(),b.duration=d.duration=a.getDuration(),d.paused=b.paused,d.ended=b.ended,d.muted=a.isMuted(),d.volume=a.getVolume()/100,d.bytesTotal=a.getVideoBytesTotal(),d.bufferedBytes=a.getVideoBytesLoaded();var e=d.bufferedBytes/d.bytesTotal*d.duration;d.target.buffered=d.buffered={start:function(a){return 0},end:function(a){return e},length:1}}b.dispatchEvent(d)},iFrameReady:function(){for(this.isLoaded=!0,this.isIframeLoaded=!0;this.iframeQueue.length>0;){var a=this.iframeQueue.pop();this.createIframe(a)}},flashPlayers:{},createFlash:function(a){this.flashPlayers[a.pluginId]=a;var b,c=a.scheme+"www.youtube.com/apiplayer?enablejsapi=1&amp;playerapiid="+a.pluginId+"&amp;version=3&amp;autoplay=0&amp;controls=0&amp;modestbranding=1&loop=0";mejs.MediaFeatures.isIE?(b=document.createElement("div"),a.container.appendChild(b),b.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="'+a.scheme+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab" id="'+a.pluginId+'" width="'+a.width+'" height="'+a.height+'" class="mejs-shim"><param name="movie" value="'+c+'" /><param name="wmode" value="transparent" /><param name="allowScriptAccess" value="'+options.flashScriptAccess+'" /><param name="allowFullScreen" value="true" /></object>'):a.container.innerHTML='<object type="application/x-shockwave-flash" id="'+a.pluginId+'" data="'+c+'" width="'+a.width+'" height="'+a.height+'" style="visibility: visible; " class="mejs-shim"><param name="allowScriptAccess" value="'+options.flashScriptAccess+'"><param name="wmode" value="transparent"></object>'},flashReady:function(a){var b=this.flashPlayers[a],c=document.getElementById(a),d=b.pluginMediaElement;d.pluginApi=d.pluginElement=c,b.success(d,d.pluginElement),c.cueVideoById(b.videoId);var e=b.containerId+"_callback";window[e]=function(a){mejs.YouTubeApi.handleStateChange(a,c,d)},c.addEventListener("onStateChange",e),setInterval(function(){mejs.YouTubeApi.createEvent(c,d,"timeupdate")},250),mejs.YouTubeApi.createEvent(c,d,"canplay")},handleStateChange:function(a,b,c){switch(a){case-1:c.paused=!0,c.ended=!0,mejs.YouTubeApi.createEvent(b,c,"loadedmetadata");break;case 0:c.paused=!1,c.ended=!0,mejs.YouTubeApi.createEvent(b,c,"ended");break;case 1:c.paused=!1,c.ended=!1,mejs.YouTubeApi.createEvent(b,c,"play"),mejs.YouTubeApi.createEvent(b,c,"playing");break;case 2:c.paused=!0,c.ended=!1,mejs.YouTubeApi.createEvent(b,c,"pause");break;case 3:mejs.YouTubeApi.createEvent(b,c,"progress");break;case 5:}}},window.onYouTubePlayerAPIReady=function(){mejs.YouTubeApi.iFrameReady()},window.onYouTubePlayerReady=function(a){mejs.YouTubeApi.flashReady(a)},window.mejs=mejs,window.MediaElement=mejs.MediaElement,function(a,b,c){"use strict";var d={locale:{language:b.i18n&&b.i18n.locale.language||"",strings:b.i18n&&b.i18n.locale.strings||{}},ietf_lang_regex:/^(x\-)?[a-z]{2,}(\-\w{2,})?(\-\w{2,})?$/,methods:{}};d.getLanguage=function(){var a=d.locale.language||window.navigator.userLanguage||window.navigator.language;return d.ietf_lang_regex.exec(a)?a:null},"undefined"!=typeof mejsL10n&&(d.locale.language=mejsL10n.language),d.methods.checkPlain=function(a){var b,c,d={"&":"&amp;",'"':"&quot;","<":"&lt;",">":"&gt;"};a=String(a);for(b in d)d.hasOwnProperty(b)&&(c=new RegExp(b,"g"),a=a.replace(c,d[b]));return a},d.methods.t=function(a,b){return d.locale.strings&&d.locale.strings[b.context]&&d.locale.strings[b.context][a]&&(a=d.locale.strings[b.context][a]),d.methods.checkPlain(a)},d.t=function(a,b){if("string"==typeof a&&a.length>0){var c=d.getLanguage();return b=b||{context:c},d.methods.t(a,b)}throw{name:"InvalidArgumentException",message:"First argument is either not a string or empty."}},b.i18n=d}(document,mejs),function(a,b){"use strict";"undefined"!=typeof mejsL10n&&(a[mejsL10n.language]=mejsL10n.strings)}(mejs.i18n.locale.strings),/*!
- *
- * MediaElementPlayer
- * http://mediaelementjs.com/
- *
- * Creates a controller bar for HTML5 <video> add <audio> tags
- * using jQuery and MediaElement.js (HTML5 Flash/Silverlight wrapper)
- *
- * Copyright 2010-2013, John Dyer (http://j.hn/)
- * License: MIT
- *
- */
-"undefined"!=typeof jQuery?mejs.$=jQuery:"undefined"!=typeof Zepto?(mejs.$=Zepto,Zepto.fn.outerWidth=function(a){var b=$(this).width();return a&&(b+=parseInt($(this).css("margin-right"),10),b+=parseInt($(this).css("margin-left"),10)),b}):"undefined"!=typeof ender&&(mejs.$=ender),function(a){mejs.MepDefaults={poster:"",showPosterWhenEnded:!1,defaultVideoWidth:480,defaultVideoHeight:270,videoWidth:-1,videoHeight:-1,defaultAudioWidth:400,defaultAudioHeight:30,defaultSeekBackwardInterval:function(a){return.05*a.duration},defaultSeekForwardInterval:function(a){return.05*a.duration},setDimensions:!0,audioWidth:-1,audioHeight:-1,startVolume:.8,loop:!1,autoRewind:!0,enableAutosize:!0,timeFormat:"",alwaysShowHours:!1,showTimecodeFrameCount:!1,framesPerSecond:25,autosizeProgress:!0,alwaysShowControls:!1,hideVideoControlsOnLoad:!1,clickToPlayPause:!0,iPadUseNativeControls:!1,iPhoneUseNativeControls:!1,AndroidUseNativeControls:!1,features:["playpause","current","progress","duration","tracks","volume","fullscreen"],isVideo:!0,enableKeyboard:!0,pauseOtherPlayers:!0,keyActions:[{keys:[32,179],action:function(a,b){b.paused||b.ended?b.play():b.pause()}},{keys:[38],action:function(a,b){a.container.find(".mejs-volume-slider").css("display","block"),a.isVideo&&(a.showControls(),a.startControlsTimer());var c=Math.min(b.volume+.1,1);b.setVolume(c)}},{keys:[40],action:function(a,b){a.container.find(".mejs-volume-slider").css("display","block"),a.isVideo&&(a.showControls(),a.startControlsTimer());var c=Math.max(b.volume-.1,0);b.setVolume(c)}},{keys:[37,227],action:function(a,b){if(!isNaN(b.duration)&&b.duration>0){a.isVideo&&(a.showControls(),a.startControlsTimer());var c=Math.max(b.currentTime-a.options.defaultSeekBackwardInterval(b),0);b.setCurrentTime(c)}}},{keys:[39,228],action:function(a,b){if(!isNaN(b.duration)&&b.duration>0){a.isVideo&&(a.showControls(),a.startControlsTimer());var c=Math.min(b.currentTime+a.options.defaultSeekForwardInterval(b),b.duration);b.setCurrentTime(c)}}},{keys:[70],action:function(a,b){"undefined"!=typeof a.enterFullScreen&&(a.isFullScreen?a.exitFullScreen():a.enterFullScreen())}},{keys:[77],action:function(a,b){a.container.find(".mejs-volume-slider").css("display","block"),a.isVideo&&(a.showControls(),a.startControlsTimer()),a.media.muted?a.setMuted(!1):a.setMuted(!0)}}]},mejs.mepIndex=0,mejs.players={},mejs.MediaElementPlayer=function(b,c){if(!(this instanceof mejs.MediaElementPlayer))return new mejs.MediaElementPlayer(b,c);var d=this;return d.$media=d.$node=a(b),d.node=d.media=d.$media[0],d.node?"undefined"!=typeof d.node.player?d.node.player:("undefined"==typeof c&&(c=d.$node.data("mejsoptions")),d.options=a.extend({},mejs.MepDefaults,c),d.options.timeFormat||(d.options.timeFormat="mm:ss",d.options.alwaysShowHours&&(d.options.timeFormat="hh:mm:ss"),d.options.showTimecodeFrameCount&&(d.options.timeFormat+=":ff")),mejs.Utility.calculateTimeFormat(0,d.options,d.options.framesPerSecond||25),d.id="mep_"+mejs.mepIndex++,mejs.players[d.id]=d,d.init(),d):void 0},mejs.MediaElementPlayer.prototype={hasFocus:!1,controlsAreVisible:!0,init:function(){var b=this,c=mejs.MediaFeatures,d=a.extend(!0,{},b.options,{success:function(a,c){b.meReady(a,c)},error:function(a){b.handleError(a)}}),e=b.media.tagName.toLowerCase();if(b.isDynamic="audio"!==e&&"video"!==e,b.isDynamic?b.isVideo=b.options.isVideo:b.isVideo="audio"!==e&&b.options.isVideo,c.isiPad&&b.options.iPadUseNativeControls||c.isiPhone&&b.options.iPhoneUseNativeControls)b.$media.attr("controls","controls"),c.isiPad&&null!==b.media.getAttribute("autoplay")&&b.play();else if(c.isAndroid&&b.options.AndroidUseNativeControls);else{b.$media.removeAttr("controls");var f=b.isVideo?mejs.i18n.t("Video Player"):mejs.i18n.t("Audio Player");a('<span class="mejs-offscreen">'+f+"</span>").insertBefore(b.$media),b.container=a('<div id="'+b.id+'" class="mejs-container '+(mejs.MediaFeatures.svgAsImg?"svg":"no-svg")+'" tabindex="0" role="application" aria-label="'+f+'"><div class="mejs-inner"><div class="mejs-mediaelement"></div><div class="mejs-layers"></div><div class="mejs-controls"></div><div class="mejs-clear"></div></div></div>').addClass(b.$media[0].className).insertBefore(b.$media).focus(function(a){if(!b.controlsAreVisible){b.showControls(!0);var c=b.container.find(".mejs-playpause-button > button");c.focus()}}),b.container.addClass((c.isAndroid?"mejs-android ":"")+(c.isiOS?"mejs-ios ":"")+(c.isiPad?"mejs-ipad ":"")+(c.isiPhone?"mejs-iphone ":"")+(b.isVideo?"mejs-video ":"mejs-audio ")),b.container.find(".mejs-mediaelement").append(b.$media),b.node.player=b,b.controls=b.container.find(".mejs-controls"),b.layers=b.container.find(".mejs-layers");var g=b.isVideo?"video":"audio",h=g.substring(0,1).toUpperCase()+g.substring(1);b.options[g+"Width"]>0||b.options[g+"Width"].toString().indexOf("%")>-1?b.width=b.options[g+"Width"]:""!==b.media.style.width&&null!==b.media.style.width?b.width=b.media.style.width:null!==b.media.getAttribute("width")?b.width=b.$media.attr("width"):b.width=b.options["default"+h+"Width"],b.options[g+"Height"]>0||b.options[g+"Height"].toString().indexOf("%")>-1?b.height=b.options[g+"Height"]:""!==b.media.style.height&&null!==b.media.style.height?b.height=b.media.style.height:null!==b.$media[0].getAttribute("height")?b.height=b.$media.attr("height"):b.height=b.options["default"+h+"Height"],b.setPlayerSize(b.width,b.height),d.pluginWidth=b.width,d.pluginHeight=b.height}mejs.MediaElement(b.$media[0],d),"undefined"!=typeof b.container&&b.controlsAreVisible&&b.container.trigger("controlsshown")},showControls:function(a){var b=this;a="undefined"==typeof a||a,b.controlsAreVisible||(a?(b.controls.removeClass("mejs-offscreen").stop(!0,!0).fadeIn(200,function(){b.controlsAreVisible=!0,b.container.trigger("controlsshown")}),b.container.find(".mejs-control").removeClass("mejs-offscreen").stop(!0,!0).fadeIn(200,function(){b.controlsAreVisible=!0})):(b.controls.removeClass("mejs-offscreen").css("display","block"),b.container.find(".mejs-control").removeClass("mejs-offscreen").css("display","block"),b.controlsAreVisible=!0,b.container.trigger("controlsshown")),b.setControlsSize())},hideControls:function(b){var c=this;b="undefined"==typeof b||b,!c.controlsAreVisible||c.options.alwaysShowControls||c.keyboardAction||(b?(c.controls.stop(!0,!0).fadeOut(200,function(){a(this).addClass("mejs-offscreen").css("display","block"),c.controlsAreVisible=!1,c.container.trigger("controlshidden")}),c.container.find(".mejs-control").stop(!0,!0).fadeOut(200,function(){a(this).addClass("mejs-offscreen").css("display","block")})):(c.controls.addClass("mejs-offscreen").css("display","block"),c.container.find(".mejs-control").addClass("mejs-offscreen").css("display","block"),c.controlsAreVisible=!1,c.container.trigger("controlshidden")))},controlsTimer:null,startControlsTimer:function(a){var b=this;a="undefined"!=typeof a?a:1500,b.killControlsTimer("start"),b.controlsTimer=setTimeout(function(){b.hideControls(),b.killControlsTimer("hide")},a)},killControlsTimer:function(a){var b=this;null!==b.controlsTimer&&(clearTimeout(b.controlsTimer),delete b.controlsTimer,b.controlsTimer=null)},controlsEnabled:!0,disableControls:function(){var a=this;a.killControlsTimer(),a.hideControls(!1),this.controlsEnabled=!1},enableControls:function(){var a=this;a.showControls(!1),a.controlsEnabled=!0},meReady:function(b,c){var d,e,f=this,g=mejs.MediaFeatures,h=c.getAttribute("autoplay"),i=!("undefined"==typeof h||null===h||"false"===h);if(!f.created){if(f.created=!0,f.media=b,f.domNode=c,!(g.isAndroid&&f.options.AndroidUseNativeControls||g.isiPad&&f.options.iPadUseNativeControls||g.isiPhone&&f.options.iPhoneUseNativeControls)){f.buildposter(f,f.controls,f.layers,f.media),f.buildkeyboard(f,f.controls,f.layers,f.media),f.buildoverlays(f,f.controls,f.layers,f.media),f.findTracks();for(d in f.options.features)if(e=f.options.features[d],f["build"+e])try{f["build"+e](f,f.controls,f.layers,f.media)}catch(j){}f.container.trigger("controlsready"),f.setPlayerSize(f.width,f.height),f.setControlsSize(),f.isVideo&&(mejs.MediaFeatures.hasTouch?f.$media.bind("touchstart",function(){f.controlsAreVisible?f.hideControls(!1):f.controlsEnabled&&f.showControls(!1)}):(f.clickToPlayPauseCallback=function(){f.options.clickToPlayPause&&(f.media.paused?f.play():f.pause())},f.media.addEventListener("click",f.clickToPlayPauseCallback,!1),f.container.bind("mouseenter",function(){f.controlsEnabled&&(f.options.alwaysShowControls||(f.killControlsTimer("enter"),f.showControls(),f.startControlsTimer(2500)))}).bind("mousemove",function(){f.controlsEnabled&&(f.controlsAreVisible||f.showControls(),f.options.alwaysShowControls||f.startControlsTimer(2500))}).bind("mouseleave",function(){f.controlsEnabled&&(f.media.paused||f.options.alwaysShowControls||f.startControlsTimer(1e3))})),f.options.hideVideoControlsOnLoad&&f.hideControls(!1),i&&!f.options.alwaysShowControls&&f.hideControls(),f.options.enableAutosize&&f.media.addEventListener("loadedmetadata",function(a){f.options.videoHeight<=0&&null===f.domNode.getAttribute("height")&&!isNaN(a.target.videoHeight)&&(f.setPlayerSize(a.target.videoWidth,a.target.videoHeight),f.setControlsSize(),f.media.setVideoSize(a.target.videoWidth,a.target.videoHeight))},!1)),b.addEventListener("play",function(){var a;for(a in mejs.players){var b=mejs.players[a];b.id==f.id||!f.options.pauseOtherPlayers||b.paused||b.ended||b.pause(),b.hasFocus=!1}f.hasFocus=!0},!1),f.media.addEventListener("ended",function(b){if(f.options.autoRewind)try{f.media.setCurrentTime(0),window.setTimeout(function(){a(f.container).find(".mejs-overlay-loading").parent().hide()},20)}catch(c){}f.media.pause(),f.setProgressRail&&f.setProgressRail(),f.setCurrentRail&&f.setCurrentRail(),f.options.loop?f.play():!f.options.alwaysShowControls&&f.controlsEnabled&&f.showControls()},!1),f.media.addEventListener("loadedmetadata",function(a){f.updateDuration&&f.updateDuration(),f.updateCurrent&&f.updateCurrent(),f.isFullScreen||(f.setPlayerSize(f.width,f.height),f.setControlsSize())},!1);var k=null;f.media.addEventListener("timeupdate",function(){k!==this.duration&&(k=this.duration,mejs.Utility.calculateTimeFormat(k,f.options,f.options.framesPerSecond||25),f.updateDuration&&f.updateDuration(),f.updateCurrent&&f.updateCurrent(),f.setControlsSize())},!1),f.container.focusout(function(b){if(b.relatedTarget){var c=a(b.relatedTarget);f.keyboardAction&&0===c.parents(".mejs-container").length&&(f.keyboardAction=!1,f.hideControls(!0))}}),setTimeout(function(){f.setPlayerSize(f.width,f.height),f.setControlsSize()},50),f.globalBind("resize",function(){f.isFullScreen||mejs.MediaFeatures.hasTrueNativeFullScreen&&document.webkitIsFullScreen||f.setPlayerSize(f.width,f.height),f.setControlsSize()}),"youtube"==f.media.pluginType&&(g.isiOS||g.isAndroid)&&(f.container.find(".mejs-overlay-play").hide(),f.container.find(".mejs-poster").hide())}i&&"native"==b.pluginType&&f.play(),f.options.success&&("string"==typeof f.options.success?window[f.options.success](f.media,f.domNode,f):f.options.success(f.media,f.domNode,f))}},handleError:function(a){var b=this;b.controls&&b.controls.hide(),b.options.error&&b.options.error(a)},setPlayerSize:function(b,c){var d=this;if(!d.options.setDimensions)return!1;if("undefined"!=typeof b&&(d.width=b),"undefined"!=typeof c&&(d.height=c),d.height.toString().indexOf("%")>0||"none"!==d.$node.css("max-width")&&"t.width"!==d.$node.css("max-width")||d.$node[0].currentStyle&&"100%"===d.$node[0].currentStyle.maxWidth){var e=function(){return d.isVideo?d.media.videoWidth&&d.media.videoWidth>0?d.media.videoWidth:null!==d.media.getAttribute("width")?d.media.getAttribute("width"):d.options.defaultVideoWidth:d.options.defaultAudioWidth}(),f=function(){return d.isVideo?d.media.videoHeight&&d.media.videoHeight>0?d.media.videoHeight:null!==d.media.getAttribute("height")?d.media.getAttribute("height"):d.options.defaultVideoHeight:d.options.defaultAudioHeight}(),g=d.container.parent().closest(":visible").width(),h=d.container.parent().closest(":visible").height(),i=d.isVideo||!d.options.autosizeProgress?parseInt(g*f/e,10):f;isNaN(i)&&(i=h),d.container.parent().length>0&&"body"===d.container.parent()[0].tagName.toLowerCase()&&(g=a(window).width(),i=a(window).height()),i&&g&&(d.container.width(g).height(i),d.$media.add(d.container.find(".mejs-shim")).width("100%").height("100%"),d.isVideo&&d.media.setVideoSize&&d.media.setVideoSize(g,i),d.layers.children(".mejs-layer").width("100%").height("100%"))}else d.container.width(d.width).height(d.height),d.layers.children(".mejs-layer").width(d.width).height(d.height)},setControlsSize:function(){var b=this,c=0,d=0,e=b.controls.find(".mejs-time-rail"),f=b.controls.find(".mejs-time-total"),g=e.siblings(),h=g.last(),i=null;if(b.container.is(":visible")&&e.length&&e.is(":visible")){b.options&&!b.options.autosizeProgress&&(d=parseInt(e.css("width"),10)),0!==d&&d||(g.each(function(){var b=a(this);"absolute"!=b.css("position")&&b.is(":visible")&&(c+=a(this).outerWidth(!0))}),d=b.controls.width()-c-(e.outerWidth(!0)-e.width()));do e.width(d),f.width(d-(f.outerWidth(!0)-f.width())),"absolute"!=h.css("position")&&(i=h.length?h.position():null,d--);while(null!==i&&i.top.toFixed(2)>0&&d>0);b.container.trigger("controlsresize")}},buildposter:function(b,c,d,e){var f=this,g=a('<div class="mejs-poster mejs-layer"></div>').appendTo(d),h=b.$media.attr("poster");""!==b.options.poster&&(h=b.options.poster),h?f.setPoster(h):g.hide(),e.addEventListener("play",function(){g.hide()},!1),b.options.showPosterWhenEnded&&b.options.autoRewind&&e.addEventListener("ended",function(){g.show()},!1)},setPoster:function(b){var c=this,d=c.container.find(".mejs-poster"),e=d.find("img");0===e.length&&(e=a('<img width="100%" height="100%" alt="" />').appendTo(d)),e.attr("src",b),d.css({"background-image":"url("+b+")"})},buildoverlays:function(b,c,d,e){var f=this;if(b.isVideo){var g=a('<div class="mejs-overlay mejs-layer"><div class="mejs-overlay-loading"><span></span></div></div>').hide().appendTo(d),h=a('<div class="mejs-overlay mejs-layer"><div class="mejs-overlay-error"></div></div>').hide().appendTo(d),i=a('<div class="mejs-overlay mejs-layer mejs-overlay-play"><div class="mejs-overlay-button"></div></div>').appendTo(d).bind("click",function(){f.options.clickToPlayPause&&e.paused&&e.play()});e.addEventListener("play",function(){i.hide(),g.hide(),c.find(".mejs-time-buffering").hide(),h.hide()},!1),e.addEventListener("playing",function(){i.hide(),g.hide(),c.find(".mejs-time-buffering").hide(),h.hide()},!1),e.addEventListener("seeking",function(){g.show(),c.find(".mejs-time-buffering").show()},!1),e.addEventListener("seeked",function(){g.hide(),c.find(".mejs-time-buffering").hide()},!1),e.addEventListener("pause",function(){mejs.MediaFeatures.isiPhone||i.show()},!1),e.addEventListener("waiting",function(){g.show(),c.find(".mejs-time-buffering").show()},!1),e.addEventListener("loadeddata",function(){g.show(),c.find(".mejs-time-buffering").show(),mejs.MediaFeatures.isAndroid&&(e.canplayTimeout=window.setTimeout(function(){if(document.createEvent){var a=document.createEvent("HTMLEvents");return a.initEvent("canplay",!0,!0),e.dispatchEvent(a)}},300))},!1),e.addEventListener("canplay",function(){g.hide(),c.find(".mejs-time-buffering").hide(),clearTimeout(e.canplayTimeout)},!1),e.addEventListener("error",function(a){f.handleError(a),g.hide(),i.hide(),h.show(),h.find(".mejs-overlay-error").html("Error loading this resource")},!1),e.addEventListener("keydown",function(a){f.onkeydown(b,e,a)},!1)}},buildkeyboard:function(b,c,d,e){var f=this;f.container.keydown(function(){f.keyboardAction=!0}),f.globalBind("keydown",function(c){return b.hasFocus=0!==a(c.target).closest(".mejs-container").length&&a(c.target).closest(".mejs-container").attr("id")===b.$media.closest(".mejs-container").attr("id"),f.onkeydown(b,e,c)}),f.globalBind("click",function(c){b.hasFocus=0!==a(c.target).closest(".mejs-container").length})},onkeydown:function(a,b,c){if(a.hasFocus&&a.options.enableKeyboard)for(var d=0,e=a.options.keyActions.length;e>d;d++)for(var f=a.options.keyActions[d],g=0,h=f.keys.length;h>g;g++)if(c.keyCode==f.keys[g])return"function"==typeof c.preventDefault&&c.preventDefault(),f.action(a,b,c.keyCode,c),!1;return!0},findTracks:function(){var b=this,c=b.$media.find("track");b.tracks=[],c.each(function(c,d){d=a(d),b.tracks.push({srclang:d.attr("srclang")?d.attr("srclang").toLowerCase():"",src:d.attr("src"),kind:d.attr("kind"),label:d.attr("label")||"",entries:[],isLoaded:!1})})},changeSkin:function(a){this.container[0].className="mejs-container "+a,this.setPlayerSize(this.width,this.height),this.setControlsSize()},play:function(){this.load(),this.media.play()},pause:function(){try{this.media.pause()}catch(a){}},load:function(){this.isLoaded||this.media.load(),this.isLoaded=!0},setMuted:function(a){this.media.setMuted(a)},setCurrentTime:function(a){this.media.setCurrentTime(a)},getCurrentTime:function(){return this.media.currentTime},setVolume:function(a){this.media.setVolume(a)},getVolume:function(){return this.media.volume},setSrc:function(a){this.media.setSrc(a)},remove:function(){var a,b,c=this;c.container.prev(".mejs-offscreen").remove();for(a in c.options.features)if(b=c.options.features[a],c["clean"+b])try{c["clean"+b](c)}catch(d){}c.isDynamic?c.$node.insertBefore(c.container):(c.$media.prop("controls",!0),c.$node.clone().insertBefore(c.container).show(),c.$node.remove()),"native"!==c.media.pluginType&&c.media.remove(),delete mejs.players[c.id],"object"==typeof c.container&&c.container.remove(),c.globalUnbind(),delete c.node.player},rebuildtracks:function(){var a=this;a.findTracks(),a.buildtracks(a,a.controls,a.layers,a.media)},resetSize:function(){var a=this;setTimeout(function(){a.setPlayerSize(a.width,a.height),a.setControlsSize()},50)}},function(){function b(b,d){var e={d:[],w:[]};return a.each((b||"").split(" "),function(a,b){var f=b+"."+d;0===f.indexOf(".")?(e.d.push(f),e.w.push(f)):e[c.test(b)?"w":"d"].push(f)}),e.d=e.d.join(" "),e.w=e.w.join(" "),e}var c=/^((after|before)print|(before)?unload|hashchange|message|o(ff|n)line|page(hide|show)|popstate|resize|storage)\b/;mejs.MediaElementPlayer.prototype.globalBind=function(c,d,e){var f=this,g=f.node?f.node.ownerDocument:document;c=b(c,f.id),c.d&&a(g).bind(c.d,d,e),c.w&&a(window).bind(c.w,d,e)},mejs.MediaElementPlayer.prototype.globalUnbind=function(c,d){var e=this,f=e.node?e.node.ownerDocument:document;c=b(c,e.id),c.d&&a(f).unbind(c.d,d),c.w&&a(window).unbind(c.w,d)}}(),"undefined"!=typeof a&&(a.fn.mediaelementplayer=function(b){return b===!1?this.each(function(){var b=a(this).data("mediaelementplayer");b&&b.remove(),a(this).removeData("mediaelementplayer")}):this.each(function(){a(this).data("mediaelementplayer",new mejs.MediaElementPlayer(this,b))}),this},a(document).ready(function(){a(".mejs-player").mediaelementplayer()})),window.MediaElementPlayer=mejs.MediaElementPlayer}(mejs.$),function(a){a.extend(mejs.MepDefaults,{playText:mejs.i18n.t("Play"),pauseText:mejs.i18n.t("Pause")}),a.extend(MediaElementPlayer.prototype,{buildplaypause:function(b,c,d,e){function f(a){"play"===a?(i.removeClass("mejs-play").addClass("mejs-pause"),j.attr({title:h.pauseText,"aria-label":h.pauseText})):(i.removeClass("mejs-pause").addClass("mejs-play"),j.attr({title:h.playText,"aria-label":h.playText}))}var g=this,h=g.options,i=a('<div class="mejs-button mejs-playpause-button mejs-play" ><button type="button" aria-controls="'+g.id+'" title="'+h.playText+'" aria-label="'+h.playText+'"></button></div>').appendTo(c).click(function(a){return a.preventDefault(),e.paused?e.play():e.pause(),!1}),j=i.find("button");f("pse"),e.addEventListener("play",function(){f("play")},!1),e.addEventListener("playing",function(){f("play")},!1),e.addEventListener("pause",function(){f("pse")},!1),e.addEventListener("paused",function(){f("pse")},!1)}})}(mejs.$),function(a){a.extend(mejs.MepDefaults,{stopText:"Stop"}),a.extend(MediaElementPlayer.prototype,{buildstop:function(b,c,d,e){var f=this;a('<div class="mejs-button mejs-stop-button mejs-stop"><button type="button" aria-controls="'+f.id+'" title="'+f.options.stopText+'" aria-label="'+f.options.stopText+'"></button></div>').appendTo(c).click(function(){e.paused||e.pause(),e.currentTime>0&&(e.setCurrentTime(0),e.pause(),c.find(".mejs-time-current").width("0px"),c.find(".mejs-time-handle").css("left","0px"),c.find(".mejs-time-float-current").html(mejs.Utility.secondsToTimeCode(0,b.options)),c.find(".mejs-currenttime").html(mejs.Utility.secondsToTimeCode(0,b.options)),d.find(".mejs-poster").show())})}})}(mejs.$),function(a){a.extend(mejs.MepDefaults,{progessHelpText:mejs.i18n.t("Use Left/Right Arrow keys to advance one second, Up/Down arrows to advance ten seconds.")}),a.extend(MediaElementPlayer.prototype,{buildprogress:function(b,c,d,e){a('<div class="mejs-time-rail"><span class="mejs-time-total mejs-time-slider"><span class="mejs-time-buffering"></span><span class="mejs-time-loaded"></span><span class="mejs-time-current"></span><span class="mejs-time-handle"></span><span class="mejs-time-float"><span class="mejs-time-float-current">00:00</span><span class="mejs-time-float-corner"></span></span></span></div>').appendTo(c),c.find(".mejs-time-buffering").hide();var f=this,g=c.find(".mejs-time-total"),h=c.find(".mejs-time-loaded"),i=c.find(".mejs-time-current"),j=c.find(".mejs-time-handle"),k=c.find(".mejs-time-float"),l=c.find(".mejs-time-float-current"),m=c.find(".mejs-time-slider"),n=function(a){var c,d=g.offset(),f=g.width(),h=0,i=0,j=0;c=a.originalEvent&&a.originalEvent.changedTouches?a.originalEvent.changedTouches[0].pageX:a.changedTouches?a.changedTouches[0].pageX:a.pageX,e.duration&&(c<d.left?c=d.left:c>f+d.left&&(c=f+d.left),j=c-d.left,h=j/f,i=.02>=h?0:h*e.duration,o&&i!==e.currentTime&&e.setCurrentTime(i),mejs.MediaFeatures.hasTouch||(k.css("left",j),l.html(mejs.Utility.secondsToTimeCode(i,b.options)),k.show()))},o=!1,p=!1,q=0,r=!1,s=b.options.autoRewind,t=function(a){var c=e.currentTime,d=mejs.i18n.t("Time Slider"),f=mejs.Utility.secondsToTimeCode(c,b.options),g=e.duration;m.attr({"aria-label":d,"aria-valuemin":0,"aria-valuemax":g,"aria-valuenow":c,"aria-valuetext":f,role:"slider",tabindex:0})},u=function(){var a=new Date;a-q>=1e3&&e.play()};m.bind("focus",function(a){b.options.autoRewind=!1}),m.bind("blur",function(a){b.options.autoRewind=s}),m.bind("keydown",function(a){new Date-q>=1e3&&(r=e.paused);var c=a.keyCode,d=e.duration,f=e.currentTime,g=b.options.defaultSeekForwardInterval(d),h=b.options.defaultSeekBackwardInterval(d);switch(c){case 37:case 40:f-=h;break;case 39:case 38:f+=g;break;case 36:f=0;break;case 35:f=d;break;case 32:case 13:return void(e.paused?e.play():e.pause());default:return}return f=0>f?0:f>=d?d:Math.floor(f),q=new Date,r||e.pause(),f<e.duration&&!r&&setTimeout(u,1100),e.setCurrentTime(f),a.preventDefault(),a.stopPropagation(),!1}),g.bind("mousedown touchstart",function(a){(1===a.which||0===a.which)&&(o=!0,n(a),f.globalBind("mousemove.dur touchmove.dur",function(a){n(a)}),f.globalBind("mouseup.dur touchend.dur",function(a){o=!1,k.hide(),f.globalUnbind(".dur")}))}).bind("mouseenter",function(a){p=!0,f.globalBind("mousemove.dur",function(a){n(a)}),mejs.MediaFeatures.hasTouch||k.show()}).bind("mouseleave",function(a){p=!1,o||(f.globalUnbind(".dur"),k.hide())}),e.addEventListener("progress",function(a){b.setProgressRail(a),b.setCurrentRail(a)},!1),e.addEventListener("timeupdate",function(a){b.setProgressRail(a),b.setCurrentRail(a),t(a)},!1),f.container.on("controlsresize",function(){b.setProgressRail(),b.setCurrentRail()}),f.loaded=h,f.total=g,f.current=i,f.handle=j},setProgressRail:function(a){var b=this,c=void 0!==a?a.target:b.media,d=null;c&&c.buffered&&c.buffered.length>0&&c.buffered.end&&c.duration?d=c.buffered.end(c.buffered.length-1)/c.duration:c&&void 0!==c.bytesTotal&&c.bytesTotal>0&&void 0!==c.bufferedBytes?d=c.bufferedBytes/c.bytesTotal:a&&a.lengthComputable&&0!==a.total&&(d=a.loaded/a.total),null!==d&&(d=Math.min(1,Math.max(0,d)),b.loaded&&b.total&&b.loaded.width(b.total.width()*d))},setCurrentRail:function(){var a=this;if(void 0!==a.media.currentTime&&a.media.duration&&a.total&&a.handle){var b=Math.round(a.total.width()*a.media.currentTime/a.media.duration),c=b-Math.round(a.handle.outerWidth(!0)/2);a.current.width(b),a.handle.css("left",c)}}})}(mejs.$),function(a){a.extend(mejs.MepDefaults,{duration:-1,timeAndDurationSeparator:"<span> | </span>"}),a.extend(MediaElementPlayer.prototype,{buildcurrent:function(b,c,d,e){var f=this;a('<div class="mejs-time" role="timer" aria-live="off"><span class="mejs-currenttime">'+mejs.Utility.secondsToTimeCode(0,b.options)+"</span></div>").appendTo(c),f.currenttime=f.controls.find(".mejs-currenttime"),e.addEventListener("timeupdate",function(){b.updateCurrent()},!1)},buildduration:function(b,c,d,e){var f=this;c.children().last().find(".mejs-currenttime").length>0?a(f.options.timeAndDurationSeparator+'<span class="mejs-duration">'+mejs.Utility.secondsToTimeCode(f.options.duration,f.options)+"</span>").appendTo(c.find(".mejs-time")):(c.find(".mejs-currenttime").parent().addClass("mejs-currenttime-container"),a('<div class="mejs-time mejs-duration-container"><span class="mejs-duration">'+mejs.Utility.secondsToTimeCode(f.options.duration,f.options)+"</span></div>").appendTo(c)),f.durationD=f.controls.find(".mejs-duration"),e.addEventListener("timeupdate",function(){b.updateDuration()},!1)},updateCurrent:function(){var a=this,b=a.media.currentTime;isNaN(b)&&(b=0),a.currenttime&&a.currenttime.html(mejs.Utility.secondsToTimeCode(b,a.options))},updateDuration:function(){var a=this,b=a.media.duration;a.options.duration>0&&(b=a.options.duration),isNaN(b)&&(b=0),a.container.toggleClass("mejs-long-video",b>3600),a.durationD&&b>0&&a.durationD.html(mejs.Utility.secondsToTimeCode(b,a.options))}})}(mejs.$),function(a){a.extend(mejs.MepDefaults,{muteText:mejs.i18n.t("Mute Toggle"),allyVolumeControlText:mejs.i18n.t("Use Up/Down Arrow keys to increase or decrease volume."),hideVolumeOnTouchDevices:!0,audioVolume:"horizontal",videoVolume:"vertical"}),a.extend(MediaElementPlayer.prototype,{buildvolume:function(b,c,d,e){if(!mejs.MediaFeatures.isAndroid&&!mejs.MediaFeatures.isiOS||!this.options.hideVolumeOnTouchDevices){var f=this,g=f.isVideo?f.options.videoVolume:f.options.audioVolume,h="horizontal"==g?a('<div class="mejs-button mejs-volume-button mejs-mute"><button type="button" aria-controls="'+f.id+'" title="'+f.options.muteText+'" aria-label="'+f.options.muteText+'"></button></div><a href="javascript:void(0);" class="mejs-horizontal-volume-slider"><span class="mejs-offscreen">'+f.options.allyVolumeControlText+'</span><div class="mejs-horizontal-volume-total"></div><div class="mejs-horizontal-volume-current"></div><div class="mejs-horizontal-volume-handle"></div></a>').appendTo(c):a('<div class="mejs-button mejs-volume-button mejs-mute"><button type="button" aria-controls="'+f.id+'" title="'+f.options.muteText+'" aria-label="'+f.options.muteText+'"></button><a href="javascript:void(0);" class="mejs-volume-slider"><span class="mejs-offscreen">'+f.options.allyVolumeControlText+'</span><div class="mejs-volume-total"></div><div class="mejs-volume-current"></div><div class="mejs-volume-handle"></div></a></div>').appendTo(c),i=f.container.find(".mejs-volume-slider, .mejs-horizontal-volume-slider"),j=f.container.find(".mejs-volume-total, .mejs-horizontal-volume-total"),k=f.container.find(".mejs-volume-current, .mejs-horizontal-volume-current"),l=f.container.find(".mejs-volume-handle, .mejs-horizontal-volume-handle"),m=function(a,b){if(!i.is(":visible")&&"undefined"==typeof b)return i.show(),m(a,!0),void i.hide();a=Math.max(0,a),a=Math.min(a,1),0===a?(h.removeClass("mejs-mute").addClass("mejs-unmute"),h.children("button").attr("title",mejs.i18n.t("Unmute")).attr("aria-label",mejs.i18n.t("Unmute"))):(h.removeClass("mejs-unmute").addClass("mejs-mute"),h.children("button").attr("title",mejs.i18n.t("Mute")).attr("aria-label",mejs.i18n.t("Mute")));var c=j.position();if("vertical"==g){var d=j.height(),e=d-d*a;l.css("top",Math.round(c.top+e-l.height()/2)),k.height(d-e),k.css("top",c.top+e)}else{var f=j.width(),n=f*a;l.css("left",Math.round(c.left+n-l.width()/2)),k.width(Math.round(n))}},n=function(a){var b=null,c=j.offset();if("vertical"===g){var d=j.height(),f=a.pageY-c.top;if(b=(d-f)/d,0===c.top||0===c.left)return}else{var h=j.width(),i=a.pageX-c.left;b=i/h}b=Math.max(0,b),b=Math.min(b,1),m(b),0===b?e.setMuted(!0):e.setMuted(!1),e.setVolume(b)},o=!1,p=!1;h.hover(function(){i.show(),p=!0},function(){p=!1,o||"vertical"!=g||i.hide()});var q=function(a){var b=Math.floor(100*e.volume);i.attr({"aria-label":mejs.i18n.t("Volume Slider"),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":b,"aria-valuetext":b+"%",role:"slider",tabindex:0})};i.bind("mouseover",function(){p=!0}).bind("mousedown",function(a){return n(a),f.globalBind("mousemove.vol",function(a){n(a)}),f.globalBind("mouseup.vol",function(){o=!1,f.globalUnbind(".vol"),p||"vertical"!=g||i.hide()}),o=!0,!1}).bind("keydown",function(a){var b=a.keyCode,c=e.volume;switch(b){case 38:c=Math.min(c+.1,1);break;case 40:c=Math.max(0,c-.1);break;default:return!0}return o=!1,m(c),e.setVolume(c),!1}),h.find("button").click(function(){e.setMuted(!e.muted)}),h.find("button").bind("focus",function(){i.show()}),e.addEventListener("volumechange",function(a){o||(e.muted?(m(0),h.removeClass("mejs-mute").addClass("mejs-unmute")):(m(e.volume),h.removeClass("mejs-unmute").addClass("mejs-mute"))),q(a)},!1),0===b.options.startVolume&&e.setMuted(!0),"native"===e.pluginType&&e.setVolume(b.options.startVolume),f.container.on("controlsresize",function(){m(e.volume)})}}})}(mejs.$),function(a){a.extend(mejs.MepDefaults,{usePluginFullScreen:!0,newWindowCallback:function(){return""},fullscreenText:mejs.i18n.t("Fullscreen")}),a.extend(MediaElementPlayer.prototype,{isFullScreen:!1,isNativeFullScreen:!1,isInIframe:!1,fullscreenMode:"",buildfullscreen:function(b,c,d,e){if(b.isVideo){b.isInIframe=window.location!=window.parent.location,e.addEventListener("play",function(){b.detectFullscreenMode()});var f=this,g=null,h=a('<div class="mejs-button mejs-fullscreen-button"><button type="button" aria-controls="'+f.id+'" title="'+f.options.fullscreenText+'" aria-label="'+f.options.fullscreenText+'"></button></div>').appendTo(c).on("click",function(){var a=mejs.MediaFeatures.hasTrueNativeFullScreen&&mejs.MediaFeatures.isFullScreen()||b.isFullScreen;a?b.exitFullScreen():b.enterFullScreen()}).on("mouseover",function(){if("plugin-hover"==f.fullscreenMode){null!==g&&(clearTimeout(g),delete g);var a=h.offset(),c=b.container.offset();e.positionFullscreenButton(a.left-c.left,a.top-c.top,!0)}}).on("mouseout",function(){"plugin-hover"==f.fullscreenMode&&(null!==g&&(clearTimeout(g),delete g),g=setTimeout(function(){e.hideFullscreenButton()},1500))});if(b.fullscreenBtn=h,f.globalBind("keydown",function(a){27==a.keyCode&&(mejs.MediaFeatures.hasTrueNativeFullScreen&&mejs.MediaFeatures.isFullScreen()||f.isFullScreen)&&b.exitFullScreen()}),f.normalHeight=0,f.normalWidth=0,mejs.MediaFeatures.hasTrueNativeFullScreen){var i=function(a){b.isFullScreen&&(mejs.MediaFeatures.isFullScreen()?(b.isNativeFullScreen=!0,b.setControlsSize()):(b.isNativeFullScreen=!1,b.exitFullScreen()))};b.globalBind(mejs.MediaFeatures.fullScreenEventName,i)}}},detectFullscreenMode:function(){var a=this,b="",c=mejs.MediaFeatures;return c.hasTrueNativeFullScreen&&"native"===a.media.pluginType?b="native-native":c.hasTrueNativeFullScreen&&"native"!==a.media.pluginType&&!c.hasFirefoxPluginMovingProblem?b="plugin-native":a.usePluginFullScreen?mejs.MediaFeatures.supportsPointerEvents?(b="plugin-click",a.createPluginClickThrough()):b="plugin-hover":b="fullwindow",a.fullscreenMode=b,b},isPluginClickThroughCreated:!1,createPluginClickThrough:function(){var b=this;if(!b.isPluginClickThroughCreated){var c,d,e=!1,f=function(){if(e){for(var a in g)g[a].hide();b.fullscreenBtn.css("pointer-events",""),b.controls.css("pointer-events",""),
-b.media.removeEventListener("click",b.clickToPlayPauseCallback),e=!1}},g={},h=["top","left","right","bottom"],i=function(){var a=fullscreenBtn.offset().left-b.container.offset().left,d=fullscreenBtn.offset().top-b.container.offset().top,e=fullscreenBtn.outerWidth(!0),f=fullscreenBtn.outerHeight(!0),h=b.container.width(),i=b.container.height();for(c in g)g[c].css({position:"absolute",top:0,left:0});g.top.width(h).height(d),g.left.width(a).height(f).css({top:d}),g.right.width(h-a-e).height(f).css({top:d,left:a+e}),g.bottom.width(h).height(i-f-d).css({top:d+f})};for(b.globalBind("resize",function(){i()}),c=0,d=h.length;d>c;c++)g[h[c]]=a('<div class="mejs-fullscreen-hover" />').appendTo(b.container).mouseover(f).hide();fullscreenBtn.on("mouseover",function(){if(!b.isFullScreen){var a=fullscreenBtn.offset(),d=player.container.offset();media.positionFullscreenButton(a.left-d.left,a.top-d.top,!1),b.fullscreenBtn.css("pointer-events","none"),b.controls.css("pointer-events","none"),b.media.addEventListener("click",b.clickToPlayPauseCallback);for(c in g)g[c].show();i(),e=!0}}),media.addEventListener("fullscreenchange",function(a){b.isFullScreen=!b.isFullScreen,b.isFullScreen?b.media.removeEventListener("click",b.clickToPlayPauseCallback):b.media.addEventListener("click",b.clickToPlayPauseCallback),f()}),b.globalBind("mousemove",function(a){if(e){var c=fullscreenBtn.offset();(a.pageY<c.top||a.pageY>c.top+fullscreenBtn.outerHeight(!0)||a.pageX<c.left||a.pageX>c.left+fullscreenBtn.outerWidth(!0))&&(fullscreenBtn.css("pointer-events",""),b.controls.css("pointer-events",""),e=!1)}}),b.isPluginClickThroughCreated=!0}},cleanfullscreen:function(a){a.exitFullScreen()},containerSizeTimeout:null,enterFullScreen:function(){var b=this;return mejs.MediaFeatures.hasiOSFullScreen?void b.media.webkitEnterFullscreen():(a(document.documentElement).addClass("mejs-fullscreen"),b.normalHeight=b.container.height(),b.normalWidth=b.container.width(),"native-native"===b.fullscreenMode||"plugin-native"===b.fullscreenMode?(mejs.MediaFeatures.requestFullScreen(b.container[0]),b.isInIframe&&setTimeout(function c(){if(b.isNativeFullScreen){var d=.002,e=a(window).width(),f=screen.width,g=Math.abs(f-e),h=f*d;g>h?b.exitFullScreen():setTimeout(c,500)}},1e3)):"fullwindow"==b.fullscreeMode,b.container.addClass("mejs-container-fullscreen").width("100%").height("100%"),b.containerSizeTimeout=setTimeout(function(){b.container.css({width:"100%",height:"100%"}),b.setControlsSize()},500),"native"===b.media.pluginType?b.$media.width("100%").height("100%"):(b.container.find(".mejs-shim").width("100%").height("100%"),setTimeout(function(){var c=a(window),d=c.width(),e=c.height();b.media.setVideoSize(d,e)},500)),b.layers.children("div").width("100%").height("100%"),b.fullscreenBtn&&b.fullscreenBtn.removeClass("mejs-fullscreen").addClass("mejs-unfullscreen"),b.setControlsSize(),b.isFullScreen=!0,b.container.find(".mejs-captions-text").css("font-size",screen.width/b.width*1*100+"%"),b.container.find(".mejs-captions-position").css("bottom","45px"),void b.container.trigger("enteredfullscreen"))},exitFullScreen:function(){var b=this;clearTimeout(b.containerSizeTimeout),mejs.MediaFeatures.hasTrueNativeFullScreen&&(mejs.MediaFeatures.isFullScreen()||b.isFullScreen)&&mejs.MediaFeatures.cancelFullScreen(),a(document.documentElement).removeClass("mejs-fullscreen"),b.container.removeClass("mejs-container-fullscreen").width(b.normalWidth).height(b.normalHeight),"native"===b.media.pluginType?b.$media.width(b.normalWidth).height(b.normalHeight):(b.container.find(".mejs-shim").width(b.normalWidth).height(b.normalHeight),b.media.setVideoSize(b.normalWidth,b.normalHeight)),b.layers.children("div").width(b.normalWidth).height(b.normalHeight),b.fullscreenBtn.removeClass("mejs-unfullscreen").addClass("mejs-fullscreen"),b.setControlsSize(),b.isFullScreen=!1,b.container.find(".mejs-captions-text").css("font-size",""),b.container.find(".mejs-captions-position").css("bottom",""),b.container.trigger("exitedfullscreen")}})}(mejs.$),function(a){a.extend(mejs.MepDefaults,{speeds:["2.00","1.50","1.25","1.00","0.75"],defaultSpeed:"1.00",speedChar:"x"}),a.extend(MediaElementPlayer.prototype,{buildspeed:function(b,c,d,e){var f=this;if("native"==f.media.pluginType){for(var g=null,h=null,i=null,j=null,k=[],l=!1,m=0,n=f.options.speeds.length;n>m;m++){var o=f.options.speeds[m];"string"==typeof o?(k.push({name:o+f.options.speedChar,value:o}),o===f.options.defaultSpeed&&(l=!0)):(k.push(o),o.value===f.options.defaultSpeed&&(l=!0))}l||k.push({name:f.options.defaultSpeed+f.options.speedChar,value:f.options.defaultSpeed}),k.sort(function(a,b){return parseFloat(b.value)-parseFloat(a.value)});var p=function(a){for(m=0,n=k.length;n>m;m++)if(k[m].value===a)return k[m].name},q='<div class="mejs-button mejs-speed-button"><button type="button">'+p(f.options.defaultSpeed)+'</button><div class="mejs-speed-selector"><ul>';for(m=0,il=k.length;m<il;m++)j=f.id+"-speed-"+k[m].value,q+='<li><input type="radio" name="speed" value="'+k[m].value+'" id="'+j+'" '+(k[m].value===f.options.defaultSpeed?" checked":"")+' /><label for="'+j+'" '+(k[m].value===f.options.defaultSpeed?' class="mejs-speed-selected"':"")+">"+k[m].name+"</label></li>";q+="</ul></div></div>",g=a(q).appendTo(c),h=g.find(".mejs-speed-selector"),i=f.options.defaultSpeed,e.addEventListener("loadedmetadata",function(a){i&&(e.playbackRate=parseFloat(i))},!0),h.on("click",'input[type="radio"]',function(){var b=a(this).attr("value");i=b,e.playbackRate=parseFloat(b),g.find("button").html(p(b)),g.find(".mejs-speed-selected").removeClass("mejs-speed-selected"),g.find('input[type="radio"]:checked').next().addClass("mejs-speed-selected")}),g.one("mouseenter focusin",function(){h.height(g.find(".mejs-speed-selector ul").outerHeight(!0)+g.find(".mejs-speed-translations").outerHeight(!0)).css("top",-1*h.height()+"px")})}}})}(mejs.$),function(a){a.extend(mejs.MepDefaults,{startLanguage:"",tracksText:mejs.i18n.t("Captions/Subtitles"),tracksAriaLive:!1,hideCaptionsButtonWhenEmpty:!0,toggleCaptionsButtonWhenOnlyOne:!1,slidesSelector:""}),a.extend(MediaElementPlayer.prototype,{hasChapters:!1,cleartracks:function(a,b,c,d){a&&(a.captions&&a.captions.remove(),a.chapters&&a.chapters.remove(),a.captionsText&&a.captionsText.remove(),a.captionsButton&&a.captionsButton.remove())},buildtracks:function(b,c,d,e){if(0!==b.tracks.length){var f,g=this,h=g.options.tracksAriaLive?'role="log" aria-live="assertive" aria-atomic="false"':"";if(g.domNode.textTracks)for(f=g.domNode.textTracks.length-1;f>=0;f--)g.domNode.textTracks[f].mode="hidden";g.cleartracks(b,c,d,e),b.chapters=a('<div class="mejs-chapters mejs-layer"></div>').prependTo(d).hide(),b.captions=a('<div class="mejs-captions-layer mejs-layer"><div class="mejs-captions-position mejs-captions-position-hover" '+h+'><span class="mejs-captions-text"></span></div></div>').prependTo(d).hide(),b.captionsText=b.captions.find(".mejs-captions-text"),b.captionsButton=a('<div class="mejs-button mejs-captions-button"><button type="button" aria-controls="'+g.id+'" title="'+g.options.tracksText+'" aria-label="'+g.options.tracksText+'"></button><div class="mejs-captions-selector"><ul><li><input type="radio" name="'+b.id+'_captions" id="'+b.id+'_captions_none" value="none" checked="checked" /><label for="'+b.id+'_captions_none">'+mejs.i18n.t("None")+"</label></li></ul></div></div>").appendTo(c);var i=0;for(f=0;f<b.tracks.length;f++)"subtitles"==b.tracks[f].kind&&i++;for(g.options.toggleCaptionsButtonWhenOnlyOne&&1==i?b.captionsButton.on("click",function(){null===b.selectedTrack?lang=b.tracks[0].srclang:lang="none",b.setTrack(lang)}):(b.captionsButton.on("mouseenter focusin",function(){a(this).find(".mejs-captions-selector").removeClass("mejs-offscreen")}).on("click","input[type=radio]",function(){lang=this.value,b.setTrack(lang)}),b.captionsButton.on("mouseleave focusout",function(){a(this).find(".mejs-captions-selector").addClass("mejs-offscreen")})),b.options.alwaysShowControls?b.container.find(".mejs-captions-position").addClass("mejs-captions-position-hover"):b.container.bind("controlsshown",function(){b.container.find(".mejs-captions-position").addClass("mejs-captions-position-hover")}).bind("controlshidden",function(){e.paused||b.container.find(".mejs-captions-position").removeClass("mejs-captions-position-hover")}),b.trackToLoad=-1,b.selectedTrack=null,b.isLoadingTrack=!1,f=0;f<b.tracks.length;f++)"subtitles"==b.tracks[f].kind&&b.addTrackButton(b.tracks[f].srclang,b.tracks[f].label);b.loadNextTrack(),e.addEventListener("timeupdate",function(a){b.displayCaptions()},!1),""!==b.options.slidesSelector&&(b.slidesContainer=a(b.options.slidesSelector),e.addEventListener("timeupdate",function(a){b.displaySlides()},!1)),e.addEventListener("loadedmetadata",function(a){b.displayChapters()},!1),b.container.hover(function(){b.hasChapters&&(b.chapters.removeClass("mejs-offscreen"),b.chapters.fadeIn(200).height(b.chapters.find(".mejs-chapter").outerHeight()))},function(){b.hasChapters&&!e.paused&&b.chapters.fadeOut(200,function(){a(this).addClass("mejs-offscreen"),a(this).css("display","block")})}),g.container.on("controlsresize",function(){g.adjustLanguageBox()}),null!==b.node.getAttribute("autoplay")&&b.chapters.addClass("mejs-offscreen")}},setTrack:function(a){var b,c=this;if("none"==a)c.selectedTrack=null,c.captionsButton.removeClass("mejs-captions-enabled");else for(b=0;b<c.tracks.length;b++)if(c.tracks[b].srclang==a){null===c.selectedTrack&&c.captionsButton.addClass("mejs-captions-enabled"),c.selectedTrack=c.tracks[b],c.captions.attr("lang",c.selectedTrack.srclang),c.displayCaptions();break}},loadNextTrack:function(){var a=this;a.trackToLoad++,a.trackToLoad<a.tracks.length?(a.isLoadingTrack=!0,a.loadTrack(a.trackToLoad)):(a.isLoadingTrack=!1,a.checkForTracks())},loadTrack:function(b){var c=this,d=c.tracks[b],e=function(){d.isLoaded=!0,c.enableTrackButton(d.srclang,d.label),c.loadNextTrack()};a.ajax({url:d.src,dataType:"text",success:function(a){"string"==typeof a&&/<tt\s+xml/gi.exec(a)?d.entries=mejs.TrackFormatParser.dfxp.parse(a):d.entries=mejs.TrackFormatParser.webvtt.parse(a),e(),"chapters"==d.kind&&c.media.addEventListener("play",function(a){c.media.duration>0&&c.displayChapters(d)},!1),"slides"==d.kind&&c.setupSlides(d)},error:function(){c.removeTrackButton(d.srclang),c.loadNextTrack()}})},enableTrackButton:function(b,c){var d=this;""===c&&(c=mejs.language.codes[b]||b),d.captionsButton.find("input[value="+b+"]").prop("disabled",!1).siblings("label").html(c),d.options.startLanguage==b&&a("#"+d.id+"_captions_"+b).prop("checked",!0).trigger("click"),d.adjustLanguageBox()},removeTrackButton:function(a){var b=this;b.captionsButton.find("input[value="+a+"]").closest("li").remove(),b.adjustLanguageBox()},addTrackButton:function(b,c){var d=this;""===c&&(c=mejs.language.codes[b]||b),d.captionsButton.find("ul").append(a('<li><input type="radio" name="'+d.id+'_captions" id="'+d.id+"_captions_"+b+'" value="'+b+'" disabled="disabled" /><label for="'+d.id+"_captions_"+b+'">'+c+" (loading)</label></li>")),d.adjustLanguageBox(),d.container.find(".mejs-captions-translations option[value="+b+"]").remove()},adjustLanguageBox:function(){var a=this;a.captionsButton.find(".mejs-captions-selector").height(a.captionsButton.find(".mejs-captions-selector ul").outerHeight(!0)+a.captionsButton.find(".mejs-captions-translations").outerHeight(!0))},checkForTracks:function(){var a=this,b=!1;if(a.options.hideCaptionsButtonWhenEmpty){for(i=0;i<a.tracks.length;i++)if("subtitles"==a.tracks[i].kind&&a.tracks[i].isLoaded){b=!0;break}b||(a.captionsButton.hide(),a.setControlsSize())}},displayCaptions:function(){if("undefined"!=typeof this.tracks){var a,b=this,c=b.selectedTrack;if(null!==c&&c.isLoaded){for(a=0;a<c.entries.times.length;a++)if(b.media.currentTime>=c.entries.times[a].start&&b.media.currentTime<=c.entries.times[a].stop)return b.captionsText.html(c.entries.text[a]).attr("class","mejs-captions-text "+(c.entries.times[a].identifier||"")),void b.captions.show().height(0);b.captions.hide()}else b.captions.hide()}},setupSlides:function(a){var b=this;b.slides=a,b.slides.entries.imgs=[b.slides.entries.text.length],b.showSlide(0)},showSlide:function(b){if("undefined"!=typeof this.tracks&&"undefined"!=typeof this.slidesContainer){var c=this,d=c.slides.entries.text[b],e=c.slides.entries.imgs[b];"undefined"==typeof e||"undefined"==typeof e.fadeIn?c.slides.entries.imgs[b]=e=a('<img src="'+d+'">').on("load",function(){e.appendTo(c.slidesContainer).hide().fadeIn().siblings(":visible").fadeOut()}):e.is(":visible")||e.is(":animated")||e.fadeIn().siblings(":visible").fadeOut()}},displaySlides:function(){if("undefined"!=typeof this.slides){var a,b=this,c=b.slides;for(a=0;a<c.entries.times.length;a++)if(b.media.currentTime>=c.entries.times[a].start&&b.media.currentTime<=c.entries.times[a].stop)return void b.showSlide(a)}},displayChapters:function(){var a,b=this;for(a=0;a<b.tracks.length;a++)if("chapters"==b.tracks[a].kind&&b.tracks[a].isLoaded){b.drawChapters(b.tracks[a]),b.hasChapters=!0;break}},drawChapters:function(b){var c,d,e=this,f=0,g=0;for(e.chapters.empty(),c=0;c<b.entries.times.length;c++)d=b.entries.times[c].stop-b.entries.times[c].start,f=Math.floor(d/e.media.duration*100),(f+g>100||c==b.entries.times.length-1&&100>f+g)&&(f=100-g),e.chapters.append(a('<div class="mejs-chapter" rel="'+b.entries.times[c].start+'" style="left: '+g.toString()+"%;width: "+f.toString()+'%;"><div class="mejs-chapter-block'+(c==b.entries.times.length-1?" mejs-chapter-block-last":"")+'"><span class="ch-title">'+b.entries.text[c]+'</span><span class="ch-time">'+mejs.Utility.secondsToTimeCode(b.entries.times[c].start,e.options)+"&ndash;"+mejs.Utility.secondsToTimeCode(b.entries.times[c].stop,e.options)+"</span></div></div>")),g+=f;e.chapters.find("div.mejs-chapter").click(function(){e.media.setCurrentTime(parseFloat(a(this).attr("rel"))),e.media.paused&&e.media.play()}),e.chapters.show()}}),mejs.language={codes:{af:"Afrikaans",sq:"Albanian",ar:"Arabic",be:"Belarusian",bg:"Bulgarian",ca:"Catalan",zh:"Chinese","zh-cn":"Chinese Simplified","zh-tw":"Chinese Traditional",hr:"Croatian",cs:"Czech",da:"Danish",nl:"Dutch",en:"English",et:"Estonian",fl:"Filipino",fi:"Finnish",fr:"French",gl:"Galician",de:"German",el:"Greek",ht:"Haitian Creole",iw:"Hebrew",hi:"Hindi",hu:"Hungarian",is:"Icelandic",id:"Indonesian",ga:"Irish",it:"Italian",ja:"Japanese",ko:"Korean",lv:"Latvian",lt:"Lithuanian",mk:"Macedonian",ms:"Malay",mt:"Maltese",no:"Norwegian",fa:"Persian",pl:"Polish",pt:"Portuguese",ro:"Romanian",ru:"Russian",sr:"Serbian",sk:"Slovak",sl:"Slovenian",es:"Spanish",sw:"Swahili",sv:"Swedish",tl:"Tagalog",th:"Thai",tr:"Turkish",uk:"Ukrainian",vi:"Vietnamese",cy:"Welsh",yi:"Yiddish"}},mejs.TrackFormatParser={webvtt:{pattern_timecode:/^((?:[0-9]{1,2}:)?[0-9]{2}:[0-9]{2}([,.][0-9]{1,3})?) --\> ((?:[0-9]{1,2}:)?[0-9]{2}:[0-9]{2}([,.][0-9]{3})?)(.*)$/,parse:function(b){for(var c,d,e,f=0,g=mejs.TrackFormatParser.split2(b,/\r?\n/),h={text:[],times:[]};f<g.length;f++){if(c=this.pattern_timecode.exec(g[f]),c&&f<g.length){for(f-1>=0&&""!==g[f-1]&&(e=g[f-1]),f++,d=g[f],f++;""!==g[f]&&f<g.length;)d=d+"\n"+g[f],f++;d=a.trim(d).replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi,"<a href='$1' target='_blank'>$1</a>"),h.text.push(d),h.times.push({identifier:e,start:0===mejs.Utility.convertSMPTEtoSeconds(c[1])?.2:mejs.Utility.convertSMPTEtoSeconds(c[1]),stop:mejs.Utility.convertSMPTEtoSeconds(c[3]),settings:c[5]})}e=""}return h}},dfxp:{parse:function(b){b=a(b).filter("tt");var c,d,e=0,f=b.children("div").eq(0),g=f.find("p"),h=b.find("#"+f.attr("style")),i={text:[],times:[]};if(h.length){var j=h.removeAttr("id").get(0).attributes;if(j.length)for(c={},e=0;e<j.length;e++)c[j[e].name.split(":")[1]]=j[e].value}for(e=0;e<g.length;e++){var k,l={start:null,stop:null,style:null};if(g.eq(e).attr("begin")&&(l.start=mejs.Utility.convertSMPTEtoSeconds(g.eq(e).attr("begin"))),!l.start&&g.eq(e-1).attr("end")&&(l.start=mejs.Utility.convertSMPTEtoSeconds(g.eq(e-1).attr("end"))),g.eq(e).attr("end")&&(l.stop=mejs.Utility.convertSMPTEtoSeconds(g.eq(e).attr("end"))),!l.stop&&g.eq(e+1).attr("begin")&&(l.stop=mejs.Utility.convertSMPTEtoSeconds(g.eq(e+1).attr("begin"))),c){k="";for(var m in c)k+=m+":"+c[m]+";"}k&&(l.style=k),0===l.start&&(l.start=.2),i.times.push(l),d=a.trim(g.eq(e).html()).replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi,"<a href='$1' target='_blank'>$1</a>"),i.text.push(d),0===i.times.start&&(i.times.start=2)}return i}},split2:function(a,b){return a.split(b)}},3!="x\n\ny".split(/\n/gi).length&&(mejs.TrackFormatParser.split2=function(a,b){var c,d=[],e="";for(c=0;c<a.length;c++)e+=a.substring(c,c+1),b.test(e)&&(d.push(e.replace(b,"")),e="");return d.push(e),d})}(mejs.$),function(a){a.extend(mejs.MepDefaults,{contextMenuItems:[{render:function(a){return"undefined"==typeof a.enterFullScreen?null:a.isFullScreen?mejs.i18n.t("Turn off Fullscreen"):mejs.i18n.t("Go Fullscreen")},click:function(a){a.isFullScreen?a.exitFullScreen():a.enterFullScreen()}},{render:function(a){return a.media.muted?mejs.i18n.t("Unmute"):mejs.i18n.t("Mute")},click:function(a){a.media.muted?a.setMuted(!1):a.setMuted(!0)}},{isSeparator:!0},{render:function(a){return mejs.i18n.t("Download Video")},click:function(a){window.location.href=a.media.currentSrc}}]}),a.extend(MediaElementPlayer.prototype,{buildcontextmenu:function(b,c,d,e){b.contextMenu=a('<div class="mejs-contextmenu"></div>').appendTo(a("body")).hide(),b.container.bind("contextmenu",function(a){return b.isContextMenuEnabled?(a.preventDefault(),b.renderContextMenu(a.clientX-1,a.clientY-1),!1):void 0}),b.container.bind("click",function(){b.contextMenu.hide()}),b.contextMenu.bind("mouseleave",function(){b.startContextMenuTimer()})},cleancontextmenu:function(a){a.contextMenu.remove()},isContextMenuEnabled:!0,enableContextMenu:function(){this.isContextMenuEnabled=!0},disableContextMenu:function(){this.isContextMenuEnabled=!1},contextMenuTimeout:null,startContextMenuTimer:function(){var a=this;a.killContextMenuTimer(),a.contextMenuTimer=setTimeout(function(){a.hideContextMenu(),a.killContextMenuTimer()},750)},killContextMenuTimer:function(){var a=this.contextMenuTimer;null!=a&&(clearTimeout(a),delete a,a=null)},hideContextMenu:function(){this.contextMenu.hide()},renderContextMenu:function(b,c){for(var d=this,e="",f=d.options.contextMenuItems,g=0,h=f.length;h>g;g++)if(f[g].isSeparator)e+='<div class="mejs-contextmenu-separator"></div>';else{var i=f[g].render(d);null!=i&&(e+='<div class="mejs-contextmenu-item" data-itemindex="'+g+'" id="element-'+1e6*Math.random()+'">'+i+"</div>")}d.contextMenu.empty().append(a(e)).css({top:c,left:b}).show(),d.contextMenu.find(".mejs-contextmenu-item").each(function(){var b=a(this),c=parseInt(b.data("itemindex"),10),e=d.options.contextMenuItems[c];"undefined"!=typeof e.show&&e.show(b,d),b.click(function(){"undefined"!=typeof e.click&&e.click(d),d.contextMenu.hide()})}),setTimeout(function(){d.killControlsTimer("rev3")},100)}})}(mejs.$),function(a){a.extend(mejs.MepDefaults,{skipBackInterval:30,skipBackText:mejs.i18n.t("Skip back %1 seconds")}),a.extend(MediaElementPlayer.prototype,{buildskipback:function(b,c,d,e){var f=this,g=f.options.skipBackText.replace("%1",f.options.skipBackInterval);a('<div class="mejs-button mejs-skip-back-button"><button type="button" aria-controls="'+f.id+'" title="'+g+'" aria-label="'+g+'">'+f.options.skipBackInterval+"</button></div>").appendTo(c).click(function(){e.setCurrentTime(Math.max(e.currentTime-f.options.skipBackInterval,0)),a(this).find("button").blur()})}})}(mejs.$),function(a){a.extend(mejs.MepDefaults,{postrollCloseText:mejs.i18n.t("Close")}),a.extend(MediaElementPlayer.prototype,{buildpostroll:function(b,c,d,e){var f=this,g=f.container.find('link[rel="postroll"]').attr("href");"undefined"!=typeof g&&(b.postroll=a('<div class="mejs-postroll-layer mejs-layer"><a class="mejs-postroll-close" onclick="$(this).parent().hide();return false;">'+f.options.postrollCloseText+'</a><div class="mejs-postroll-layer-content"></div></div>').prependTo(d).hide(),f.media.addEventListener("ended",function(c){a.ajax({dataType:"html",url:g,success:function(a,b){d.find(".mejs-postroll-layer-content").html(a)}}),b.postroll.show()},!1))}})}(mejs.$); \ No newline at end of file
diff --git a/files_videoviewer/js/mep-extra.js b/files_videoviewer/js/mep-extra.js
deleted file mode 100644
index 763fbefcb..000000000
--- a/files_videoviewer/js/mep-extra.js
+++ /dev/null
@@ -1,9 +0,0 @@
-(function($) {
- $.extend(mejs.MepDefaults, {
- playpauseText: t('files_videoviewer', 'Play/Pause'),
- stopText: t('files_videoviewer', 'Stop'),
- muteText: t('files_videoviewer', 'Mute Toggle'),
- fullscreenText: t('files_videoviewer', 'Fullscreen'),
- tracksText: t('files_videoviewer', 'Captions/Subtitles')
- });
-})(mejs.$); \ No newline at end of file
diff --git a/files_videoviewer/js/silverlightmediaelement.xap b/files_videoviewer/js/silverlightmediaelement.xap
deleted file mode 100755
index 38a9cc490..000000000
--- a/files_videoviewer/js/silverlightmediaelement.xap
+++ /dev/null
Binary files differ
diff --git a/files_videoviewer/js/viewer.js b/files_videoviewer/js/viewer.js
deleted file mode 100644
index 120b34b92..000000000
--- a/files_videoviewer/js/viewer.js
+++ /dev/null
@@ -1,117 +0,0 @@
-var videoViewer = {
- UI : {
- playerTemplate : '<video width="%width%" height="%height%" id="media_element" class="video-js vjs-default-skin" controls preload="none">' +
- '<source type="%type%" src="%src%" />' +
- '</video>',
- show : function () {
- $('<div id="videoviewer_overlay" style="display:none;"></div><div id="videoviewer_popup"><div id="videoviewer_container"><a class="box-close" id="box-close" href="#"></a><h3>'+escapeHTML(videoViewer.file)+'</h3></div></div>').appendTo('body');
-
- $('#videoviewer_overlay').fadeIn('fast',function(){
- $('#videoviewer_popup').fadeIn('fast');
- });
- $('#box-close').click(videoViewer.hidePlayer);
- var size = videoViewer.UI.getSize();
- var playerView = videoViewer.UI.playerTemplate.replace(/%width%/g, size.width)
- .replace(/%height%/g, escapeHTML(size.height))
- .replace(/%type%/g, escapeHTML(videoViewer.mime))
- .replace(/%src%/g, escapeHTML(videoViewer.location))
- ;
- $(playerView).prependTo('#videoviewer_container');
- },
- hide : function() {
- $('#videoviewer_popup').fadeOut('fast', function() {
- $('#videoviewer_overlay').fadeOut('fast', function() {
- $('#videoviewer_popup').remove();
- $('#videoviewer_overlay').remove();
- });
- });
- },
- getSize : function () {
- var size;
- if ($(document).width()>'680' && $(document).height()>'520' ){
- size = {width: 640, height: 480};
- } else {
- size = {width: 320, height: 240};
- }
- return size;
- }
- },
- mime : null,
- file : null,
- location : null,
- player : null,
- dir: null,
- mimeTypes : [
- 'video/mp4',
- 'video/webm',
- 'video/x-flv',
- 'application/ogg',
- 'video/ogg',
- 'video/quicktime',
- 'video/x-matroska',
- 'video/x-ms-asf'
- ],
- onView : function(file, data) {
- videoViewer.file = file;
- videoViewer.dir = data.dir;
- if ($('#isPublic').length){
- // No seek for public videos atm, sorry
- videoViewer.location = data.fileList.getDownloadUrl(file, videoViewer.dir);
- } else {
- videoViewer.location = OC.linkToRemote('webdav') + OC.joinPaths(videoViewer.dir, file);
- }
- videoViewer.mime = data.$file.attr('data-mime');
-
- OC.addScript('files_videoviewer','mediaelement-and-player', function(){
- OC.addScript('files_videoviewer','mep-extra', videoViewer.showPlayer);
- });
- },
- showPlayer : function() {
- videoViewer.UI.show();
-
- videoViewer.player = new MediaElementPlayer('#media_element', {
- features: ['playpause','progress','current','duration','tracks','volume','fullscreen'],
- pluginPath : OC.filePath('files_videoviewer', 'js', ''),
- pauseOtherPlayers: false,
- enablePluginDebug: false,
- plugins: ['flash','silverlight'],
- success: function (player, node) {
- //set the size (for flash otherwise no video just sound!)
- player.setVideoSize($(node).width(), $(node).height());
- player.load();
- player.pause();
- },
- error: function (m) {
- console.log(m);
- }
- });
- },
- hidePlayer : function() {
- videoViewer.player = false;
- delete videoViewer.player;
-
- videoViewer.UI.hide();
- },
- onKeyDown : function(e) {
- if (e.keyCode == 27 && !$('.mejs-container-fullscreen').length && videoViewer.player) {
- videoViewer.hidePlayer();
- }
- },
- log : function(message){
- console.log(message);
- }
-};
-
-$(document).ready(function() {
- if ( typeof OCA !== 'undefined'
- && typeof OCA.Files !== 'undefined'
- && typeof OCA.Files.fileActions !== 'undefined'
- ) {
- for (var i = 0; i < videoViewer.mimeTypes.length; ++i) {
- var mime = videoViewer.mimeTypes[i];
- OCA.Files.fileActions.register(mime, 'View', OC.PERMISSION_READ, '', videoViewer.onView);
- OCA.Files.fileActions.setDefault(mime, 'View');
- }
- $(document).keydown(videoViewer.onKeyDown);
- }
-});
diff --git a/files_videoviewer/src/flash/FlashMediaElement.as b/files_videoviewer/src/flash/FlashMediaElement.as
deleted file mode 100644
index 5d11d20b5..000000000
--- a/files_videoviewer/src/flash/FlashMediaElement.as
+++ /dev/null
@@ -1,1087 +0,0 @@
-package
-{
- import flash.display.*;
- import flash.events.*;
- import flash.media.*;
- import flash.net.*;
- import flash.text.*;
- import flash.system.*;
-
- import flash.media.Video;
- import flash.net.NetConnection;
- import flash.net.NetStream;
-
- import flash.geom.ColorTransform;
-
- import flash.filters.DropShadowFilter;
- import flash.utils.Timer;
- import flash.external.ExternalInterface;
- import flash.geom.Rectangle;
-
- import htmlelements.IMediaElement;
- import htmlelements.VideoElement;
- import htmlelements.AudioElement;
- import htmlelements.YouTubeElement;
-
- public class FlashMediaElement extends MovieClip {
-
- private var _mediaUrl:String;
- private var _autoplay:Boolean;
- private var _preload:String;
- private var _debug:Boolean;
- private var _isVideo:Boolean;
- private var _video:DisplayObject;
- private var _timerRate:Number;
- private var _stageWidth:Number;
- private var _stageHeight:Number;
- private var _enableSmoothing:Boolean;
- private var _allowedPluginDomain:String;
- private var _isFullScreen:Boolean = false;
- private var _startVolume:Number;
- private var _controlStyle:String;
- private var _autoHide:Boolean = true;
- private var _streamer:String = "";
- private var _enablePseudoStreaming:Boolean;
- private var _pseudoStreamingStartQueryParam:String;
-
- // native video size (from meta data)
- private var _nativeVideoWidth:Number = 0;
- private var _nativeVideoHeight:Number = 0;
-
- // visual elements
- private var _output:TextField;
- private var _fullscreenButton:SimpleButton;
-
- // media
- private var _mediaElement:IMediaElement;
-
- // connection to fullscreen
- private var _connection:LocalConnection;
- private var _connectionName:String;
-
- //private var fullscreen_btn:SimpleButton;
-
- // CONTROLS
- private var _alwaysShowControls:Boolean;
- private var _controlBar:MovieClip;
- private var _controlBarBg:MovieClip;
- private var _scrubBar:MovieClip;
- private var _scrubTrack:MovieClip;
- private var _scrubOverlay:MovieClip;
- private var _scrubLoaded:MovieClip;
- private var _hoverTime:MovieClip;
- private var _hoverTimeText:TextField;
- private var _playButton:SimpleButton;
- private var _pauseButton:SimpleButton;
- private var _duration:TextField;
- private var _currentTime:TextField;
- private var _fullscreenIcon:SimpleButton;
- private var _volumeMuted:SimpleButton;
- private var _volumeUnMuted:SimpleButton;
- private var _scrubTrackColor:String;
- private var _scrubBarColor:String;
- private var _scrubLoadedColor:String;
-
- // IDLE Timer for mouse for showing/hiding controls
- private var _inactiveTime:int;
- private var _timer:Timer;
- private var _idleTime:int;
- private var _isMouseActive:Boolean
- private var _isOverStage:Boolean = false;
-
- // security checkes
- private var securityIssue:Boolean = false; // When SWF parameters contain illegal characters
- private var directAccess:Boolean = false; // When SWF visited directly with no parameters (or when security issue detected)
-
-
- public function FlashMediaElement() {
- // check for security issues (borrowed from jPLayer)
- checkFlashVars(loaderInfo.parameters);
-
- // allows this player to be called from a different domain than the HTML page hosting the player
- //Security.allowDomain("*");
- //Security.allowInsecureDomain('*');
-
-
- // add debug output
- _output = new TextField();
- _output.textColor = 0xeeeeee;
- _output.width = stage.stageWidth - 100;
- _output.height = stage.stageHeight;
- _output.multiline = true;
- _output.wordWrap = true;
- _output.border = false;
- _output.filters = [new DropShadowFilter(1, 0x000000, 45, 1, 2, 2, 1)];
-
- _output.text = "Initializing...\n";
- addChild(_output);
- _output.visible = securityIssue;
-
- if (securityIssue) {
- _output.text = "WARNING: Security issue detected. Player stopped.";
- return;
- }
-
- // get parameters
- // Use only FlashVars, ignore QueryString
- var params:Object, pos:int, query:Object;
-
- params = LoaderInfo(this.root.loaderInfo).parameters;
- pos = root.loaderInfo.url.indexOf('?');
- if (pos !== -1) {
- query = parseStr(root.loaderInfo.url.substr(pos + 1));
-
- for (var key:String in params) {
- if (query.hasOwnProperty(trim(key))) {
- delete params[key];
- }
- }
- }
-
- _mediaUrl = (params['file'] != undefined) ? String(params['file']) : "";
- _autoplay = (params['autoplay'] != undefined) ? (String(params['autoplay']) == "true") : false;
- _debug = (params['debug'] != undefined) ? (String(params['debug']) == "true") : false;
- _isVideo = (params['isvideo'] != undefined) ? ((String(params['isvideo']) == "false") ? false : true ) : true;
- _timerRate = (params['timerrate'] != undefined) ? (parseInt(params['timerrate'], 10)) : 250;
- _alwaysShowControls = (params['controls'] != undefined) ? (String(params['controls']) == "true") : false;
- _enableSmoothing = (params['smoothing'] != undefined) ? (String(params['smoothing']) == "true") : false;
- _startVolume = (params['startvolume'] != undefined) ? (parseFloat(params['startvolume'])) : 0.8;
- _preload = (params['preload'] != undefined) ? params['preload'] : "none";
- _controlStyle = (params['controlstyle'] != undefined) ? (String(params['controlstyle'])) : ""; // blank or "floating"
- _autoHide = (params['autohide'] != undefined) ? (String(params['autohide']) == "true") : true;
- _scrubTrackColor = (params['scrubtrackcolor'] != undefined) ? (String(params['scrubtrackcolor'])) : "0x333333";
- _scrubBarColor = (params['scrubbarcolor'] != undefined) ? (String(params['scrubbarcolor'])) : "0xefefef";
- _scrubLoadedColor = (params['scrubloadedcolor'] != undefined) ? (String(params['scrubloadedcolor'])) : "0x3CACC8";
- _enablePseudoStreaming = (params['pseudostreaming'] != undefined) ? (String(params['pseudostreaming']) == "true") : false;
- _pseudoStreamingStartQueryParam = (params['pseudostreamstart'] != undefined) ? (String(params['pseudostreamstart'])) : "start";
- _streamer = (params['flashstreamer'] != undefined) ? (String(params['flashstreamer'])) : "";
-
- // for audio them controls always show them
-
- if (!_isVideo && _alwaysShowControls) {
- _autoHide = false;
- }
-
- _output.visible = _debug;
-
- if (isNaN(_timerRate))
- _timerRate = 250;
-
- // setup stage and player sizes/scales
- stage.align = StageAlign.TOP_LEFT;
- stage.scaleMode = StageScaleMode.NO_SCALE;
- _stageWidth = stage.stageWidth;
- _stageHeight = stage.stageHeight;
-
- //_autoplay = true;
- //_mediaUrl = "http://mediafiles.dts.edu/chapel/mp4/20100609.mp4";
- //_alwaysShowControls = true;
- //_mediaUrl = "../media/Parades-PastLives.mp3";
- //_mediaUrl = "../media/echo-hereweare.mp4";
-
- //_mediaUrl = "http://video.ted.com/talks/podcast/AlGore_2006_480.mp4";
- //_mediaUrl = "rtmp://stream2.france24.yacast.net/france24_live/en/f24_liveen";
-
- //_mediaUrl = "http://www.youtube.com/watch?feature=player_embedded&v=yyWWXSwtPP0"; // hosea
- //_mediaUrl = "http://www.youtube.com/watch?feature=player_embedded&v=m5VDDJlsD6I"; // railer with notes
-
- //_alwaysShowControls = true;
-
- //_debug=true;
-
-
-
-
- // position and hide
- _fullscreenButton = getChildByName("fullscreen_btn") as SimpleButton;
- _fullscreenButton.visible = _isVideo;
- _fullscreenButton.alpha = 0;
- _fullscreenButton.addEventListener(MouseEvent.CLICK, fullscreenClick, false);
- _fullscreenButton.x = stage.stageWidth - _fullscreenButton.width;
- _fullscreenButton.y = stage.stageHeight - _fullscreenButton.height;
-
-
- // create media element
- if (_isVideo) {
-
- if (_mediaUrl.indexOf("youtube.com") > -1 || _mediaUrl.indexOf("youtu.be") > -1) {
-
- //Security.allowDomain("http://www.youtube.com");
-
- _mediaElement = new YouTubeElement(this, _autoplay, _preload, _timerRate, _startVolume);
- _video = (_mediaElement as YouTubeElement).player;
-
- // these are set and then used once the player is loaded
- (_mediaElement as YouTubeElement).initWidth = _stageWidth;
- (_mediaElement as YouTubeElement).initHeight = _stageHeight;
-
- } else {
-
- _mediaElement = new VideoElement(this, _autoplay, _preload, _timerRate, _startVolume, _streamer);
- _video = (_mediaElement as VideoElement).video;
- _video.width = _stageWidth;
- _video.height = _stageHeight;
- (_video as Video).smoothing = _enableSmoothing;
- (_mediaElement as VideoElement).setReference(this);
- (_mediaElement as VideoElement).setPseudoStreaming(_enablePseudoStreaming);
- (_mediaElement as VideoElement).setPseudoStreamingStartParam(_pseudoStreamingStartQueryParam);
- //_video.scaleMode = VideoScaleMode.MAINTAIN_ASPECT_RATIO;
- addChild(_video);
- }
- } else {
-
- //var player2:AudioDecoder = new com.automatastudios.audio.audiodecoder.AudioDecoder();
- _mediaElement = new AudioElement(this, _autoplay, _preload, _timerRate, _startVolume);
- }
-
-
- // controls!
- _controlBar = getChildByName("controls_mc") as MovieClip;
- _controlBarBg = _controlBar.getChildByName("controls_bg_mc") as MovieClip;
- _scrubTrack = _controlBar.getChildByName("scrubTrack") as MovieClip;
- _scrubBar = _controlBar.getChildByName("scrubBar") as MovieClip;
- _scrubOverlay = _controlBar.getChildByName("scrubOverlay") as MovieClip;
- _scrubLoaded = _controlBar.getChildByName("scrubLoaded") as MovieClip;
-
- _scrubOverlay.buttonMode = true;
- _scrubOverlay.useHandCursor = true
-
- applyColor(_scrubTrack, _scrubTrackColor);
- applyColor(_scrubBar, _scrubBarColor);
- applyColor(_scrubLoaded, _scrubLoadedColor);
-
- _fullscreenIcon = _controlBar.getChildByName("fullscreenIcon") as SimpleButton;
- _fullscreenIcon.visible = _isVideo;
-
- // New fullscreenIcon for new fullscreen floating controls
- //if(_alwaysShowControls && _controlStyle.toUpperCase()=="FLOATING") {
- _fullscreenIcon.addEventListener(MouseEvent.CLICK, fullScreenIconClick, false);
- //}
-
- _volumeMuted = _controlBar.getChildByName("muted_mc") as SimpleButton;
- _volumeUnMuted = _controlBar.getChildByName("unmuted_mc") as SimpleButton;
-
- _volumeMuted.addEventListener(MouseEvent.CLICK, toggleVolume, false);
- _volumeUnMuted.addEventListener(MouseEvent.CLICK, toggleVolume, false);
-
- _playButton = _controlBar.getChildByName("play_btn") as SimpleButton;
- _playButton.addEventListener(MouseEvent.CLICK, function(e:MouseEvent) {
- _mediaElement.play();
- });
- _pauseButton = _controlBar.getChildByName("pause_btn") as SimpleButton;
- _pauseButton.addEventListener(MouseEvent.CLICK, function(e:MouseEvent) {
- _mediaElement.pause();
- });
- _pauseButton.visible = false;
- _duration = _controlBar.getChildByName("duration_txt") as TextField;
- _currentTime = _controlBar.getChildByName("currentTime_txt") as TextField;
- _hoverTime = _controlBar.getChildByName("hoverTime") as MovieClip;
- _hoverTimeText = _hoverTime.getChildByName("hoverTime_txt") as TextField;
- _hoverTime.visible=false;
- _hoverTime.y=(_hoverTime.height/2)+1;
- _hoverTime.x=0;
-
-
-
- // Add new timeline scrubber events
- _scrubOverlay.addEventListener(MouseEvent.MOUSE_MOVE, scrubMove);
- _scrubOverlay.addEventListener(MouseEvent.CLICK, scrubClick);
- _scrubOverlay.addEventListener(MouseEvent.MOUSE_OVER, scrubOver);
- _scrubOverlay.addEventListener(MouseEvent.MOUSE_OUT, scrubOut);
-
- if (_autoHide) { // && _alwaysShowControls) {
- // Add mouse activity for show/hide of controls
- stage.addEventListener(Event.MOUSE_LEAVE, mouseActivityLeave);
- stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseActivityMove);
- _inactiveTime = 2500;
- _timer = new Timer(_inactiveTime)
- _timer.addEventListener(TimerEvent.TIMER, idleTimer);
- _timer.start();
- // set
- }
-
- if(_startVolume<=0) {
- trace("INITIAL VOLUME: "+_startVolume+" MUTED");
- _volumeMuted.visible=true;
- _volumeUnMuted.visible=false;
- } else {
- trace("INITIAL VOLUME: "+_startVolume+" UNMUTED");
- _volumeMuted.visible=false;
- _volumeUnMuted.visible=true;
- }
-
- _controlBar.visible = _alwaysShowControls;
-
- setControlDepth();
-
- _output.appendText("stage: " + stage.stageWidth + "x" + stage.stageHeight + "\n");
- _output.appendText("file: " + _mediaUrl + "\n");
- _output.appendText("autoplay: " + _autoplay.toString() + "\n");
- _output.appendText("preload: " + _preload.toString() + "\n");
- _output.appendText("isvideo: " + _isVideo.toString() + "\n");
- _output.appendText("smoothing: " + _enableSmoothing.toString() + "\n");
- _output.appendText("timerrate: " + _timerRate.toString() + "\n");
- _output.appendText("displayState: " +(stage.hasOwnProperty("displayState")).toString() + "\n");
-
- // attach javascript
- _output.appendText("ExternalInterface.available: " + ExternalInterface.available.toString() + "\n");
- _output.appendText("ExternalInterface.objectID: " + ((ExternalInterface.objectID != null)? ExternalInterface.objectID.toString() : "null") + "\n");
-
- if (_mediaUrl != "") {
- _mediaElement.setSrc(_mediaUrl);
- }
-
- positionControls();
-
- // Fire this once just to set the width on some dynamically sized scrub bar items;
- _scrubBar.scaleX=0;
- _scrubLoaded.scaleX=0;
-
-
- if (ExternalInterface.available) { // && !_alwaysShowControls
-
- _output.appendText("Adding callbacks...\n");
- try {
- if (ExternalInterface.objectID != null && ExternalInterface.objectID.toString() != "") {
-
- // add HTML media methods
- ExternalInterface.addCallback("playMedia", playMedia);
- ExternalInterface.addCallback("loadMedia", loadMedia);
- ExternalInterface.addCallback("pauseMedia", pauseMedia);
- ExternalInterface.addCallback("stopMedia", stopMedia);
-
- ExternalInterface.addCallback("setSrc", setSrc);
- ExternalInterface.addCallback("setCurrentTime", setCurrentTime);
- ExternalInterface.addCallback("setVolume", setVolume);
- ExternalInterface.addCallback("setMuted", setMuted);
-
- ExternalInterface.addCallback("setFullscreen", setFullscreen);
- ExternalInterface.addCallback("setVideoSize", setVideoSize);
-
- ExternalInterface.addCallback("positionFullscreenButton", positionFullscreenButton);
- ExternalInterface.addCallback("hideFullscreenButton", hideFullscreenButton);
-
- // fire init method
- ExternalInterface.call("mejs.MediaPluginBridge.initPlugin", ExternalInterface.objectID);
- }
-
- _output.appendText("Success...\n");
-
- } catch (error:SecurityError) {
- _output.appendText("A SecurityError occurred: " + error.message + "\n");
- } catch (error:Error) {
- _output.appendText("An Error occurred: " + error.message + "\n");
- }
-
- }
-
- if (_preload != "none") {
- _mediaElement.load();
-
- if (_autoplay) {
- _mediaElement.play();
- }
- } else if (_autoplay) {
- _mediaElement.load();
- _mediaElement.play();
- }
-
- // listen for resize
- stage.addEventListener(Event.RESIZE, resizeHandler);
-
- // send click events up to javascript
- stage.addEventListener(MouseEvent.CLICK, stageClicked);
-
- // resize
- stage.addEventListener(FullScreenEvent.FULL_SCREEN, stageFullScreenChanged);
- }
-
- public function setControlDepth():void {
- // put these on top
- addChild(_output);
- addChild(_controlBar);
- addChild(_fullscreenButton);
-
- }
-
- // borrowed from jPLayer
- // https://github.com/happyworm/jPlayer/blob/e8ca190f7f972a6a421cb95f09e138720e40ed6d/actionscript/Jplayer.as#L228
- private function checkFlashVars(p:Object):void {
- var i:Number = 0;
- for (var s:String in p) {
- if (isIllegalChar(p[s], s === 'file')) {
- securityIssue = true; // Illegal char found
- }
- i++;
- }
- if(i === 0 || securityIssue) {
- directAccess = true;
- }
- }
-
- private static function parseStr (str:String) : Object {
- var hash:Object = {},
- arr1:Array, arr2:Array;
-
- str = unescape(str).replace(/\+/g, " ");
-
- arr1 = str.split('&');
- if (!arr1.length) {
- return {};
- }
-
- for (var i:uint = 0, length:uint = arr1.length; i < length; i++) {
- arr2 = arr1[i].split('=');
- if (!arr2.length) {
- continue;
- }
- hash[trim(arr2[0])] = trim(arr2[1]);
- }
- return hash;
- }
-
-
- private static function trim(str:String) : String {
- if (!str) {
- return str;
- }
-
- return str.toString().replace(/^\s*/, '').replace(/\s*$/, '');
- }
-
- private function isIllegalChar(s:String, isUrl:Boolean):Boolean {
- var illegals:String = "' \" ( ) { } * + \\ < >";
- if(isUrl) {
- illegals = "\" { } \\ < >";
- }
- if(Boolean(s)) { // Otherwise exception if parameter null.
- for each (var illegal:String in illegals.split(' ')) {
- if(s.indexOf(illegal) >= 0) {
- return true; // Illegal char found
- }
- }
- }
- return false;
- }
-
-
- // START: Controls and events
- function mouseActivityMove(event:MouseEvent):void {
-
- // if mouse is in the video area
- if (_autoHide && (mouseX>=0 && mouseX<=stage.stageWidth) && (mouseY>=0 && mouseY<=stage.stageHeight)) {
-
- // This could be move to a nice fade at some point...
- _controlBar.visible = (_alwaysShowControls || _isFullScreen);
- _isMouseActive = true;
- _idleTime = 0;
- _timer.reset();
- _timer.start()
- }
- }
-
- function mouseActivityLeave(event:Event):void {
- if (_autoHide) {
- _isOverStage = false;
- // This could be move to a nice fade at some point...
- _controlBar.visible = false;
- _isMouseActive = false;
- _idleTime = 0;
- _timer.reset();
- _timer.stop();
- }
- }
-
- function idleTimer(event:TimerEvent):void {
-
- if (_autoHide) {
- // This could be move to a nice fade at some point...
- _controlBar.visible = false;
- _isMouseActive = false;
- _idleTime += _inactiveTime;
- _idleTime = 0;
- _timer.reset();
- _timer.stop();
- }
- }
-
-
- function scrubMove(event:MouseEvent):void {
-
- //if (_alwaysShowControls) {
- if (_hoverTime.visible) {
- var seekBarPosition:Number = ((event.localX / _scrubTrack.width) *_mediaElement.duration())*_scrubTrack.scaleX;
- var hoverPos:Number = (seekBarPosition / _mediaElement.duration()) *_scrubTrack.scaleX;
-
- if (_isFullScreen) {
- _hoverTime.x=event.target.parent.mouseX;
- } else {
- _hoverTime.x=mouseX;
- }
- _hoverTime.y = _scrubBar.y - (_hoverTime.height/2);
- _hoverTimeText.text = secondsToTimeCode(seekBarPosition);
- }
- //}
- //trace(event);
- }
-
- function scrubOver(event:MouseEvent):void {
- _hoverTime.y = _scrubBar.y-(_hoverTime.height/2)+1;
- _hoverTime.visible = true;
- trace(event);
- }
-
- function scrubOut(event:MouseEvent):void {
- _hoverTime.y = _scrubBar.y+(_hoverTime.height/2)+1;
- _hoverTime.visible = false;
- //_hoverTime.x=0;
- //trace(event);
- }
-
- function scrubClick(event:MouseEvent):void {
- //trace(event);
- var seekBarPosition:Number = ((event.localX / _scrubTrack.width) *_mediaElement.duration())*_scrubTrack.scaleX;
-
- var tmp:Number = (_mediaElement.currentTime()/_mediaElement.duration())*_scrubTrack.width;
- var canSeekToPosition:Boolean = _scrubLoaded.scaleX > (seekBarPosition / _mediaElement.duration()) *_scrubTrack.scaleX;
- //var canSeekToPosition:Boolean = true;
-
- /*
- amountLoaded = ns.bytesLoaded / ns.bytesTotal;
- loader.loadbar._width = amountLoaded * 208.9;
- loader.scrub._x = ns.time / duration * 208.9;
- */
-
- trace("seekBarPosition:"+seekBarPosition, "CanSeekToPosition: "+canSeekToPosition);
-
- if (seekBarPosition>0 && seekBarPosition<_mediaElement.duration() && canSeekToPosition) {
- _mediaElement.setCurrentTime(seekBarPosition);
- }
- }
-
- function toggleVolume(event:MouseEvent):void {
- trace(event.currentTarget.name);
- switch(event.currentTarget.name) {
- case "muted_mc":
- setMuted(false);
- break;
- case "unmuted_mc":
- setMuted(true);
- break;
- }
- }
-
- function toggleVolumeIcons(volume:Number) {
- if(volume<=0) {
- _volumeMuted.visible = true;
- _volumeUnMuted.visible = false;
- } else {
- _volumeMuted.visible = false;
- _volumeUnMuted.visible = true;
- }
- }
-
- public function positionControls(forced:Boolean=false) {
-
-
- if ( _controlStyle.toUpperCase() == "FLOATING" && _isFullScreen) {
-
- trace("CONTROLS: floating");
- _hoverTime.y=(_hoverTime.height/2)+1;
- _hoverTime.x=0;
- _controlBarBg.width = 300;
- _controlBarBg.height = 93;
- //_controlBarBg.x = (stage.stageWidth/2) - (_controlBarBg.width/2);
- //_controlBarBg.y = stage.stageHeight - 300;
-
- _pauseButton.scaleX = _playButton.scaleX=3.5;
- _pauseButton.scaleY= _playButton.scaleY=3.5;
- // center the play button and make it big and at the top
- _pauseButton.x = _playButton.x = (_controlBarBg.width/2)-(_playButton.width/2)+7;
- _pauseButton.y = _playButton.y = _controlBarBg.height-_playButton.height-(14)
-
- _controlBar.x = (stage.stageWidth/2) -150;
- _controlBar.y = stage.stageHeight - _controlBar.height-100;
-
-
- // reposition the time and duration items
-
- _duration.x = _controlBarBg.width - _duration.width - 10;
- _duration.y = _controlBarBg.height - _duration.height -7;
- //_currentTime.x = _controlBarBg.width - _duration.width - 10 - _currentTime.width - 10;
- _currentTime.x = 5
- _currentTime.y= _controlBarBg.height - _currentTime.height-7;
-
- _fullscreenIcon.x = _controlBarBg.width - _fullscreenIcon.width - 7;
- _fullscreenIcon.y = 7;
-
- _volumeMuted.x = _volumeUnMuted.x = 7;
- _volumeMuted.y = _volumeUnMuted.y = 7;
-
- _scrubLoaded.x = _scrubBar.x = _scrubOverlay.x = _scrubTrack.x =_currentTime.x+_currentTime.width+7;
- _scrubLoaded.y = _scrubBar.y = _scrubOverlay.y = _scrubTrack.y=_controlBarBg.height-_scrubTrack.height-10;
-
- _scrubBar.width = _scrubOverlay.width = _scrubTrack.width = (_duration.x-_duration.width-14);
-
-
- } else {
- trace("CONTROLS: normal, original");
-
- /*
- // Original style bottom display
- _hoverTime.y=(_hoverTime.height/2)+1;
- _hoverTime.x=0;
- _controlBarBg.width = stage.stageWidth;
- _controlBar.y = stage.stageHeight - _controlBar.height;
- _duration.x = stage.stageWidth - _duration.width - 10;
- //_currentTime.x = stage.stageWidth - _duration.width - 10 - _currentTime.width - 10;
- _currentTime.x = _playButton.x+_playButton.width;
- _scrubTrack.width = (_duration.x-_duration.width-10)-_duration.width+10;
- _scrubOverlay.width = _scrubTrack.width;
- _scrubBar.width = _scrubTrack.width;
- */
-
- // FLOATING MODE BOTTOM DISPLAY - similar to normal
- trace("THAT WAY!");
- _hoverTime.y=(_hoverTime.height/2)+1;
- _hoverTime.x=0;
- _controlBarBg.width = stage.stageWidth;
- _controlBarBg.height = 30;
- _controlBarBg.y=0;
- _controlBarBg.x=0;
- // _controlBarBg.x = 0;
- // _controlBarBg.y = stage.stageHeight - _controlBar.height;
-
- _pauseButton.scaleX = _playButton.scaleX=1;
- _pauseButton.scaleY = _playButton.scaleY=1;
-
- _pauseButton.x = _playButton.x = 7;
- _pauseButton.y = _playButton.y = _controlBarBg.height-_playButton.height-2;
-
-
- //_currentTime.x = stage.stageWidth - _duration.width - 10 - _currentTime.width - 10;
- _currentTime.x = _playButton.x+_playButton.width;
-
- _fullscreenIcon.x = _controlBarBg.width - _fullscreenIcon.width - 7;
- _fullscreenIcon.y = 8;
-
- _volumeMuted.x = _volumeUnMuted.x = (_isVideo ? _fullscreenIcon.x : _controlBarBg.width) - _volumeMuted.width - 10;
- _volumeMuted.y = _volumeUnMuted.y = 10;
-
- _duration.x = _volumeMuted.x - _volumeMuted.width - _duration.width + 5;
- _duration.y = _currentTime.y = _controlBarBg.height - _currentTime.height - 7;
-
- _scrubLoaded.x = _scrubBar.x = _scrubOverlay.x = _scrubTrack.x = _currentTime.x + _currentTime.width + 10;
- _scrubLoaded.y = _scrubBar.y = _scrubOverlay.y = _scrubTrack.y = _controlBarBg.height - _scrubTrack.height - 9;
-
- _scrubBar.width = _scrubOverlay.width = _scrubTrack.width = (_duration.x-_duration.width-10)-_duration.width+5;
- _controlBar.x = 0;
- _controlBar.y = stage.stageHeight - _controlBar.height;
-
- }
-
- }
-
- // END: Controls
-
-
- function stageClicked(e:MouseEvent):void {
- //_output.appendText("click: " + e.stageX.toString() +","+e.stageY.toString() + "\n");
- if (e.target == stage) {
- sendEvent("click", "");
- }
- }
-
- function resizeHandler(e:Event):void {
- //_video.scaleX = stage.stageWidth / _stageWidth;
- //_video.scaleY = stage.stageHeight / _stageHeight;
- //positionControls();
-
- repositionVideo();
- }
-
- // START: Fullscreen
- function enterFullscreen() {
-
- _output.appendText("enterFullscreen()\n");
-
- var screenRectangle:Rectangle = new Rectangle(0, 0, flash.system.Capabilities.screenResolutionX, flash.system.Capabilities.screenResolutionY);
- stage.fullScreenSourceRect = screenRectangle;
-
- stage.displayState = StageDisplayState.FULL_SCREEN;
-
- repositionVideo();
- positionControls();
- updateControls(HtmlMediaEvent.FULLSCREENCHANGE);
-
- _controlBar.visible = true;
-
- _isFullScreen = true;
- }
-
- function exitFullscreen() {
-
- stage.displayState = StageDisplayState.NORMAL;
-
-
- _controlBar.visible = false;
-
- _isFullScreen = false;
- }
-
- function setFullscreen(gofullscreen:Boolean) {
-
- _output.appendText("setFullscreen: " + gofullscreen.toString() + "\n");
-
- try {
- //_fullscreenButton.visible = false;
-
- if (gofullscreen) {
- enterFullscreen();
-
- } else {
- exitFullscreen();
- }
-
- } catch (error:Error) {
-
- // show the button when the security error doesn't let it work
- //_fullscreenButton.visible = true;
- _fullscreenButton.alpha = 1;
-
- _isFullScreen = false;
-
- _output.appendText("error setting fullscreen: " + error.message.toString() + "\n");
- }
- }
-
- // control bar button/icon
- function fullScreenIconClick(e:MouseEvent) {
- try {
- _controlBar.visible = true;
- setFullscreen(!_isFullScreen);
- repositionVideo();
- } catch (error:Error) {
- }
- }
-
- // special floating fullscreen icon
- function fullscreenClick(e:MouseEvent) {
- //_fullscreenButton.visible = false;
- _fullscreenButton.alpha = 0
-
- try {
- _controlBar.visible = true;
- setFullscreen(true);
- repositionVideo();
- positionControls();
- } catch (error:Error) {
- }
- }
-
-
- function stageFullScreenChanged(e:FullScreenEvent) {
- _output.appendText("fullscreen event: " + e.fullScreen.toString() + "\n");
-
- //_fullscreenButton.visible = false;
- _fullscreenButton.alpha = 0;
- _isFullScreen = e.fullScreen;
-
- sendEvent(HtmlMediaEvent.FULLSCREENCHANGE, "isFullScreen:" + e.fullScreen );
-
- if (!e.fullScreen) {
- _controlBar.visible = _alwaysShowControls;
- }
- }
- // END: Fullscreen
-
- // START: external interface
- function playMedia() {
- _output.appendText("play\n");
- _mediaElement.play();
- }
-
- function loadMedia() {
- _output.appendText("load\n");
- _mediaElement.load();
- }
-
- function pauseMedia() {
- _output.appendText("pause\n");
- _mediaElement.pause();
- }
-
- function setSrc(url:String) {
- _output.appendText("setSrc: " + url + "\n");
- _mediaElement.setSrc(url);
- }
-
- function stopMedia() {
- _output.appendText("stop\n");
- _mediaElement.stop();
- }
-
- function setCurrentTime(time:Number) {
- _output.appendText("seek: " + time.toString() + "\n");
- _mediaElement.setCurrentTime(time);
- }
-
- function setVolume(volume:Number) {
- _output.appendText("volume: " + volume.toString() + "\n");
- _mediaElement.setVolume(volume);
- toggleVolumeIcons(volume);
- }
-
- function setMuted(muted:Boolean) {
- _output.appendText("muted: " + muted.toString() + "\n");
- _mediaElement.setMuted(muted);
- toggleVolumeIcons(_mediaElement.getVolume());
- }
-
- function setVideoSize(width:Number, height:Number) {
- _output.appendText("setVideoSize: " + width.toString() + "," + height.toString() + "\n");
-
- _stageWidth = width;
- _stageHeight = height;
-
- if (_video != null) {
- repositionVideo();
- positionControls();
- //_fullscreenButton.x = stage.stageWidth - _fullscreenButton.width - 10;
- _output.appendText("result: " + _video.width.toString() + "," + _video.height.toString() + "\n");
- }
-
-
- }
-
- function positionFullscreenButton(x:Number, y:Number, visibleAndAbove:Boolean ) {
-
- _output.appendText("position FS: " + x.toString() + "x" + y.toString() + "\n");
-
- // bottom corner
- /*
- _fullscreenButton.x = stage.stageWidth - _fullscreenButton.width
- _fullscreenButton.y = stage.stageHeight - _fullscreenButton.height;
- */
-
- // position just above
- if (visibleAndAbove) {
- _fullscreenButton.x = x+1;
- _fullscreenButton.y = y - _fullscreenButton.height+1;
- } else {
- _fullscreenButton.x = x;
- _fullscreenButton.y = y;
- }
-
- // check for oversizing
- if ((_fullscreenButton.x + _fullscreenButton.width) > stage.stageWidth)
- _fullscreenButton.x = stage.stageWidth - _fullscreenButton.width;
-
- // show it!
- if (visibleAndAbove) {
- _fullscreenButton.alpha = 1;
- }
- }
-
- function hideFullscreenButton() {
-
- //_fullscreenButton.visible = false;
- _fullscreenButton.alpha = 0;
- }
-
- // END: external interface
-
-
- function repositionVideo():void {
-
- if (stage.displayState == "fullScreen") {
- fullscreen = true;
- } else {
- fullscreen = false;
- }
-
- _output.appendText("positioning video "+stage.displayState+"\n");
-
- if (_mediaElement is VideoElement) {
-
- if (isNaN(_nativeVideoWidth) || isNaN(_nativeVideoHeight) || _nativeVideoWidth <= 0 || _nativeVideoHeight <= 0) {
- _output.appendText("ERR: I dont' have the native dimension\n");
- return;
- }
-
- // calculate ratios
- var stageRatio, nativeRatio;
-
- _video.x = 0;
- _video.y = 0;
-
- if(fullscreen == true) {
- stageRatio = flash.system.Capabilities.screenResolutionX/flash.system.Capabilities.screenResolutionY;
- nativeRatio = _nativeVideoWidth/_nativeVideoHeight;
-
- // adjust size and position
- if (nativeRatio > stageRatio) {
- _mediaElement.setSize(flash.system.Capabilities.screenResolutionX, _nativeVideoHeight * flash.system.Capabilities.screenResolutionX / _nativeVideoWidth);
- _video.y = flash.system.Capabilities.screenResolutionY/2 - _video.height/2;
- } else if (stageRatio > nativeRatio) {
- _mediaElement.setSize(_nativeVideoWidth * flash.system.Capabilities.screenResolutionY / _nativeVideoHeight, flash.system.Capabilities.screenResolutionY);
- _video.x = flash.system.Capabilities.screenResolutionX/2 - _video.width/2;
- } else if (stageRatio == nativeRatio) {
- _mediaElement.setSize(flash.system.Capabilities.screenResolutionX, flash.system.Capabilities.screenResolutionY);
- }
-
- } else {
- stageRatio = _stageWidth/_stageHeight;
- nativeRatio = _nativeVideoWidth/_nativeVideoHeight;
-
- // adjust size and position
- if (nativeRatio > stageRatio) {
- _mediaElement.setSize(_stageWidth, _nativeVideoHeight * _stageWidth / _nativeVideoWidth);
- _video.y = _stageHeight/2 - _video.height/2;
- } else if (stageRatio > nativeRatio) {
- _mediaElement.setSize( _nativeVideoWidth * _stageHeight / _nativeVideoHeight, _stageHeight);
- _video.x = _stageWidth/2 - _video.width/2;
- } else if (stageRatio == nativeRatio) {
- _mediaElement.setSize(_stageWidth, _stageHeight);
- }
-
- }
-
- } else if (_mediaElement is YouTubeElement) {
- if(fullscreen == true) {
- _mediaElement.setSize(flash.system.Capabilities.screenResolutionX, flash.system.Capabilities.screenResolutionY);
-
- } else {
- _mediaElement.setSize(_stageWidth, _stageHeight);
-
- }
-
- }
-
- positionControls();
- }
-
- // SEND events to JavaScript
- public function sendEvent(eventName:String, eventValues:String) {
-
- // special video event
- if (eventName == HtmlMediaEvent.LOADEDMETADATA && _isVideo) {
-
- _output.appendText("METADATA RECEIVED: ");
-
- try {
- if (_mediaElement is VideoElement) {
- _nativeVideoWidth = (_mediaElement as VideoElement).videoWidth;
- _nativeVideoHeight = (_mediaElement as VideoElement).videoHeight;
- }
- } catch (e:Error) {
- _output.appendText(e.toString() + "\n");
- }
-
- _output.appendText(_nativeVideoWidth.toString() + "x" + _nativeVideoHeight.toString() + "\n");
-
-
- if(stage.displayState == "fullScreen" ) {
- setVideoSize(_nativeVideoWidth, _nativeVideoHeight);
- }
- repositionVideo();
-
- }
-
- updateControls(eventName);
-
- //trace((_mediaElement.duration()*1).toString() + " / " + (_mediaElement.currentTime()*1).toString());
- //trace("CurrentProgress:"+_mediaElement.currentProgress());
-
- if (ExternalInterface.objectID != null && ExternalInterface.objectID.toString() != "") {
-
- //_output.appendText("event:" + eventName + " : " + eventValues);
- //trace("event", eventName, eventValues);
-
- if (eventValues == null)
- eventValues == "";
-
- if (_isVideo) {
- eventValues += (eventValues != "" ? "," : "") + "isFullScreen:" + _isFullScreen;
- }
-
- eventValues = "{" + eventValues + "}";
-
- /*
- OLD DIRECT METHOD
- ExternalInterface.call(
- "function(id, name) { mejs.MediaPluginBridge.fireEvent(id,name," + eventValues + "); }",
- ExternalInterface.objectID,
- eventName);
- */
-
- // use set timeout for performance reasons
- //if (!_alwaysShowControls) {
- ExternalInterface.call("setTimeout", "mejs.MediaPluginBridge.fireEvent('" + ExternalInterface.objectID + "','" + eventName + "'," + eventValues + ")",0);
- //}
- }
- }
-
-
- function updateControls(eventName:String):void {
-
- //trace("updating controls");
-
- try {
- // update controls
- switch (eventName) {
- case "pause":
- case "paused":
- case "ended":
- _playButton.visible = true;
- _pauseButton.visible = false;
- break;
- case "play":
- case "playing":
- _playButton.visible = false;
- _pauseButton.visible = true;
- break;
- }
-
- if (eventName == HtmlMediaEvent.TIMEUPDATE ||
- eventName == HtmlMediaEvent.PROGRESS ||
- eventName == HtmlMediaEvent.FULLSCREENCHANGE) {
-
- //_duration.text = (_mediaElement.duration()*1).toString();
- _duration.text = secondsToTimeCode(_mediaElement.duration());
- //_currentTime.text = (_mediaElement.currentTime()*1).toString();
- _currentTime.text = secondsToTimeCode(_mediaElement.currentTime());
-
- var pct:Number = (_mediaElement.currentTime() / _mediaElement.duration()) *_scrubTrack.scaleX;
-
- _scrubBar.scaleX = pct;
- _scrubLoaded.scaleX = (_mediaElement.currentProgress()*_scrubTrack.scaleX)/100;
- }
- } catch (error:Error) {
- trace("error: " + error.toString());
-
- }
-
- }
-
- // START: utility
- function secondsToTimeCode(seconds:Number):String {
- var timeCode:String = "";
- seconds = Math.round(seconds);
- var minutes:Number = Math.floor(seconds / 60);
- timeCode = (minutes >= 10) ? minutes.toString() : "0" + minutes.toString();
- seconds = Math.floor(seconds % 60);
- timeCode += ":" + ((seconds >= 10) ? seconds.toString() : "0" + seconds.toString());
- return timeCode; //minutes.toString() + ":" + seconds.toString();
- }
-
- function applyColor(item:Object, color:String):void {
-
- var myColor:ColorTransform = item.transform.colorTransform;
- myColor.color = Number(color);
- item.transform.colorTransform = myColor;
- }
- // END: utility
-
- }
-} \ No newline at end of file
diff --git a/files_videoviewer/src/flash/FlashMediaElement.fla b/files_videoviewer/src/flash/FlashMediaElement.fla
deleted file mode 100644
index adf6e99fc..000000000
--- a/files_videoviewer/src/flash/FlashMediaElement.fla
+++ /dev/null
Binary files differ
diff --git a/files_videoviewer/src/flash/HtmlMediaEvent.as b/files_videoviewer/src/flash/HtmlMediaEvent.as
deleted file mode 100644
index d12c0fedf..000000000
--- a/files_videoviewer/src/flash/HtmlMediaEvent.as
+++ /dev/null
@@ -1,29 +0,0 @@
-package {
-
- public class HtmlMediaEvent {
-
- public static var LOADED_DATA:String = "loadeddata";
- public static var PROGRESS:String = "progress";
- public static var TIMEUPDATE:String = "timeupdate";
- public static var SEEKED:String = "seeked";
- public static var PLAY:String = "play";
- public static var PLAYING:String = "playing";
- public static var PAUSE:String = "pause";
- public static var LOADEDMETADATA:String = "loadedmetadata";
- public static var ENDED:String = "ended";
- public static var VOLUMECHANGE:String = "volumechange";
- public static var STOP:String = "stop";
-
- // new : 2/15/2011
- public static var LOADSTART:String = "loadstart";
- public static var CANPLAY:String = "canplay";
- // new : 3/3/2011
- public static var LOADEDDATA:String = "loadeddata";
-
- // new : 4/12/2011
- public static var SEEKING:String = "seeking";
-
- // new : 1/2/2012
- public static var FULLSCREENCHANGE:String = "fullscreenchange";
- }
-}
diff --git a/files_videoviewer/src/flash/htmlelements/AudioElement.as b/files_videoviewer/src/flash/htmlelements/AudioElement.as
deleted file mode 100644
index 750599d4a..000000000
--- a/files_videoviewer/src/flash/htmlelements/AudioElement.as
+++ /dev/null
@@ -1,332 +0,0 @@
-
-package htmlelements
-{
- import flash.events.Event;
- import flash.events.IOErrorEvent;
- import flash.events.ProgressEvent;
- import flash.events.TimerEvent;
- import flash.media.ID3Info;
- import flash.media.Sound;
- import flash.media.SoundChannel;
- import flash.media.SoundLoaderContext;
- import flash.media.SoundTransform;
- import flash.net.URLRequest;
- import flash.utils.Timer;
-
-
-
- /**
- * ...
- * @author DefaultUser (Tools -> Custom Arguments...)
- */
- public class AudioElement implements IMediaElement
- {
-
- private var _sound:Sound;
- private var _soundTransform:SoundTransform;
- private var _soundChannel:SoundChannel;
- private var _soundLoaderContext:SoundLoaderContext;
-
- private var _volume:Number = 1;
- private var _preMuteVolume:Number = 0;
- private var _isMuted:Boolean = false;
- private var _isPaused:Boolean = true;
- private var _isEnded:Boolean = false;
- private var _isLoaded:Boolean = false;
- private var _currentTime:Number = 0;
- private var _duration:Number = 0;
- private var _bytesLoaded:Number = 0;
- private var _bytesTotal:Number = 0;
- private var _bufferedTime:Number = 0;
- private var _bufferingChanged:Boolean = false;
-
- private var _currentUrl:String = "";
- private var _autoplay:Boolean = true;
- private var _preload:String = "";
-
- private var _element:FlashMediaElement;
- private var _timer:Timer;
- private var _firedCanPlay:Boolean = false;
-
- public function setSize(width:Number, height:Number):void {
- // do nothing!
- }
-
- public function duration():Number {
- return _duration;
- }
-
- public function currentTime():Number {
- return _currentTime;
- }
-
- public function currentProgress():Number {
- return Math.round(_bytesLoaded/_bytesTotal*100);
- }
-
- public function AudioElement(element:FlashMediaElement, autoplay:Boolean, preload:String, timerRate:Number, startVolume:Number)
- {
- _element = element;
- _autoplay = autoplay;
- _volume = startVolume;
- _preload = preload;
-
- _timer = new Timer(timerRate);
- _timer.addEventListener(TimerEvent.TIMER, timerEventHandler);
-
- _soundTransform = new SoundTransform(_volume);
- _soundLoaderContext = new SoundLoaderContext();
- }
-
- // events
- function progressHandler(e:ProgressEvent):void {
-
- _bytesLoaded = e.bytesLoaded;
- _bytesTotal = e.bytesTotal;
-
- // this happens too much to send every time
- //sendEvent(HtmlMediaEvent.PROGRESS);
-
- // so now we just trigger a flag and send with the timer
- _bufferingChanged = true;
- }
-
- function id3Handler(e:Event):void {
- sendEvent(HtmlMediaEvent.LOADEDMETADATA);
-
- try {
- var id3:ID3Info = _sound.id3;
- var obj = {
- type:'id3',
- album:id3.album,
- artist:id3.artist,
- comment:id3.comment,
- genre:id3.genre,
- songName:id3.songName,
- track:id3.track,
- year:id3.year
- }
- } catch (err:Error) {}
-
-
- }
-
- function timerEventHandler(e:TimerEvent) {
- _currentTime = _soundChannel.position/1000;
-
- // calculate duration
- var duration = Math.round(_sound.length * _sound.bytesTotal/_sound.bytesLoaded/100) / 10;
-
- // check to see if the estimated duration changed
- if (_duration != duration && !isNaN(duration)) {
-
- _duration = duration;
- sendEvent(HtmlMediaEvent.LOADEDMETADATA);
- }
-
- // check for progress
- if (_bufferingChanged) {
-
- sendEvent(HtmlMediaEvent.PROGRESS);
-
- _bufferingChanged = false;
- }
-
- // send timeupdate
- sendEvent(HtmlMediaEvent.TIMEUPDATE);
-
- // sometimes the ended event doesn't fire, here's a fake one
- if (_duration > 0 && _currentTime >= _duration-0.2) {
- handleEnded();
- }
- }
-
- function soundCompleteHandler(e:Event) {
- handleEnded();
- }
-
- function handleEnded():void {
- _timer.stop();
- _currentTime = 0;
- _isEnded = true;
-
- sendEvent(HtmlMediaEvent.ENDED);
- }
-
- //events
-
-
- // METHODS
- public function setSrc(url:String):void {
- _currentUrl = url;
- _isLoaded = false;
- }
-
-
- public function load():void {
-
- if (_currentUrl == "")
- return;
-
- _sound = new Sound();
- //sound.addEventListener(IOErrorEvent.IO_ERROR,errorHandler);
- _sound.addEventListener(ProgressEvent.PROGRESS,progressHandler);
- _sound.addEventListener(Event.ID3,id3Handler);
- _sound.load(new URLRequest(_currentUrl));
- _currentTime = 0;
-
- sendEvent(HtmlMediaEvent.LOADSTART);
-
- _isLoaded = true;
-
- sendEvent(HtmlMediaEvent.LOADEDDATA);
- sendEvent(HtmlMediaEvent.CANPLAY);
- _firedCanPlay = true;
-
- if (_playAfterLoading) {
- _playAfterLoading = false;
- play();
- }
- }
-
- private var _playAfterLoading:Boolean= false;
-
- public function play():void {
-
- if (!_isLoaded) {
- _playAfterLoading = true;
- load();
- return;
- }
-
- _timer.stop();
-
- _soundChannel = _sound.play(_currentTime*1000, 0, _soundTransform);
- _soundChannel.removeEventListener(Event.SOUND_COMPLETE, soundCompleteHandler);
- _soundChannel.addEventListener(Event.SOUND_COMPLETE, soundCompleteHandler);
-
- _timer.start();
-
- didStartPlaying();
- }
-
- public function pause():void {
-
- _timer.stop();
- if (_soundChannel != null) {
- _currentTime = _soundChannel.position/1000;
- _soundChannel.stop();
- }
-
- _isPaused = true;
- sendEvent(HtmlMediaEvent.PAUSE);
- }
-
-
- public function stop():void {
- if (_timer != null) {
- _timer.stop();
- }
- if (_soundChannel != null) {
- _soundChannel.stop();
- _sound.close();
- }
- unload();
- sendEvent(HtmlMediaEvent.STOP);
- }
-
- public function setCurrentTime(pos:Number):void {
- sendEvent(HtmlMediaEvent.SEEKING);
- _timer.stop();
- _currentTime = pos;
- _soundChannel.stop();
- _sound.length
- _soundChannel = _sound.play(_currentTime * 1000, 0, _soundTransform);
- sendEvent(HtmlMediaEvent.SEEKED);
-
- _timer.start();
-
- didStartPlaying();
- }
-
- private function didStartPlaying():void {
- _isPaused = false;
- sendEvent(HtmlMediaEvent.PLAY);
- sendEvent(HtmlMediaEvent.PLAYING);
- if (!_firedCanPlay) {
- sendEvent(HtmlMediaEvent.LOADEDDATA);
- sendEvent(HtmlMediaEvent.CANPLAY);
- _firedCanPlay = true;
- }
- }
-
-
- public function setVolume(volume:Number):void {
-
- _volume = volume;
- _soundTransform.volume = volume;
-
- if (_soundChannel != null) {
- _soundChannel.soundTransform = _soundTransform;
- }
-
- _isMuted = (_volume == 0);
-
- sendEvent(HtmlMediaEvent.VOLUMECHANGE);
- }
-
- public function getVolume():Number {
- if(_isMuted) {
- return 0;
- } else {
- return _volume;
- }
- }
-
-
- public function setMuted(muted:Boolean):void {
-
- // ignore if already set
- if ( (muted && _isMuted) || (!muted && !_isMuted))
- return;
-
- if (muted) {
- _preMuteVolume = _soundTransform.volume;
- setVolume(0);
- } else {
- setVolume(_preMuteVolume);
- }
-
- _isMuted = muted;
- }
-
- public function unload():void {
- _sound = null;
- _isLoaded = false;
- }
-
- private function sendEvent(eventName:String) {
-
- // calculate this to mimic HTML5
- _bufferedTime = _bytesLoaded / _bytesTotal * _duration;
-
- // build JSON
- var values:String = "duration:" + _duration +
- ",currentTime:" + _currentTime +
- ",muted:" + _isMuted +
- ",paused:" + _isPaused +
- ",ended:" + _isEnded +
- ",volume:" + _volume +
- ",src:\"" + _currentUrl + "\"" +
- ",bytesTotal:" + _bytesTotal +
- ",bufferedBytes:" + _bytesLoaded +
- ",bufferedTime:" + _bufferedTime +
- "";
-
- _element.sendEvent(eventName, values);
- }
-
- }
-
-}
-
diff --git a/files_videoviewer/src/flash/htmlelements/IMediaElement.as b/files_videoviewer/src/flash/htmlelements/IMediaElement.as
deleted file mode 100644
index d62660795..000000000
--- a/files_videoviewer/src/flash/htmlelements/IMediaElement.as
+++ /dev/null
@@ -1,35 +0,0 @@
-
-package htmlelements
-{
-
- public interface IMediaElement {
-
- function play():void;
-
- function pause():void;
-
- function load():void;
-
- function stop():void;
-
- function setSrc(url:String):void;
-
- function setSize(width:Number, height:Number):void;
-
- function setCurrentTime(pos:Number):void;
-
- function setVolume(vol:Number):void;
-
- function getVolume():Number;
-
- function setMuted(muted:Boolean):void;
-
- function duration():Number;
-
- function currentTime():Number;
-
- function currentProgress():Number;
-
- }
-
-}
diff --git a/files_videoviewer/src/flash/htmlelements/VideoElement.as b/files_videoviewer/src/flash/htmlelements/VideoElement.as
deleted file mode 100644
index 7673c4f6c..000000000
--- a/files_videoviewer/src/flash/htmlelements/VideoElement.as
+++ /dev/null
@@ -1 +0,0 @@
-package htmlelements { import flash.display.Sprite; import flash.events.*; import flash.net.NetConnection; import flash.net.NetStream; import flash.media.Video; import flash.media.SoundTransform; import flash.utils.Timer; import FlashMediaElement; import HtmlMediaEvent; public class VideoElement extends Sprite implements IMediaElement { private var _currentUrl:String = ""; private var _autoplay:Boolean = true; private var _preload:String = ""; private var _isPreloading:Boolean = false; private var _connection:NetConnection; private var _stream:NetStream; private var _video:Video; private var _element:FlashMediaElement; private var _soundTransform; private var _oldVolume:Number = 1; // event values private var _duration:Number = 0; private var _framerate:Number; private var _isPaused:Boolean = true; private var _isEnded:Boolean = false; private var _volume:Number = 1; private var _isMuted:Boolean = false; private var _bytesLoaded:Number = 0; private var _bytesTotal:Number = 0; private var _bufferedTime:Number = 0; private var _bufferEmpty:Boolean = false; private var _bufferingChanged:Boolean = false; private var _seekOffset:Number = 0; private var _videoWidth:Number = -1; private var _videoHeight:Number = -1; private var _timer:Timer; private var _isRTMP:Boolean = false; private var _streamer:String = ""; private var _isConnected:Boolean = false; private var _playWhenConnected:Boolean = false; private var _hasStartedPlaying:Boolean = false; private var _parentReference:Object; private var _pseudoStreamingEnabled:Boolean = false; private var _pseudoStreamingStartQueryParam:String = "start"; public function setReference(arg:Object):void { _parentReference = arg; } public function setSize(width:Number, height:Number):void { _video.width = width; _video.height = height; } public function setPseudoStreaming(enablePseudoStreaming:Boolean):void { _pseudoStreamingEnabled = enablePseudoStreaming; } public function setPseudoStreamingStartParam(pseudoStreamingStartQueryParam:String):void { _pseudoStreamingStartQueryParam = pseudoStreamingStartQueryParam; } public function get video():Video { return _video; } public function get videoHeight():Number { return _videoHeight; } public function get videoWidth():Number { return _videoWidth; } public function duration():Number { return _duration; } public function currentProgress():Number { if(_stream != null) { return Math.round(_stream.bytesLoaded/_stream.bytesTotal*100); } else { return 0; } } public function currentTime():Number { var currentTime:Number = 0; if (_stream != null) { currentTime = _stream.time; if (_pseudoStreamingEnabled) { currentTime += _seekOffset; } } return currentTime; } // (1) load() // calls _connection.connect(); // waits for NetConnection.Connect.Success // _stream gets created public function VideoElement(element:FlashMediaElement, autoplay:Boolean, preload:String, timerRate:Number, startVolume:Number, streamer:String) { _element = element; _autoplay = autoplay; _volume = startVolume; _preload = preload; _streamer = streamer; _video = new Video(); addChild(_video); _connection = new NetConnection(); _connection.client = { onBWDone: function():void{} }; _connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); _connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); //_connection.connect(null); _timer = new Timer(timerRate); _timer.addEventListener("timer", timerHandler); } private function timerHandler(e:TimerEvent) { _bytesLoaded = _stream.bytesLoaded; _bytesTotal = _stream.bytesTotal; if (!_isPaused) { sendEvent(HtmlMediaEvent.TIMEUPDATE); } //trace("bytes", _bytesLoaded, _bytesTotal); if (_bytesLoaded < _bytesTotal) sendEvent(HtmlMediaEvent.PROGRESS); } // internal events private function netStatusHandler(event:NetStatusEvent):void { trace("netStatus", event.info.code); switch (event.info.code) { case "NetStream.Buffer.Empty": _bufferEmpty = true; _isEnded ? sendEvent(HtmlMediaEvent.ENDED) : null; break; case "NetStream.Buffer.Full": _bytesLoaded = _stream.bytesLoaded; _bytesTotal = _stream.bytesTotal; _bufferEmpty = false; sendEvent(HtmlMediaEvent.PROGRESS); break; case "NetConnection.Connect.Success": connectStream(); break; case "NetStream.Play.StreamNotFound": trace("Unable to locate video"); break; // STREAM case "NetStream.Play.Start": _isPaused = false; sendEvent(HtmlMediaEvent.LOADEDDATA); sendEvent(HtmlMediaEvent.CANPLAY); if (!_isPreloading) { sendEvent(HtmlMediaEvent.PLAY); sendEvent(HtmlMediaEvent.PLAYING); } _timer.start(); break; case "NetStream.Seek.Notify": sendEvent(HtmlMediaEvent.SEEKED); break; case "NetStream.Pause.Notify": _isPaused = true; sendEvent(HtmlMediaEvent.PAUSE); break; case "NetStream.Play.Stop": _isEnded = true; _isPaused = false; _timer.stop(); _bufferEmpty ? sendEvent(HtmlMediaEvent.ENDED) : null; break; } } private function securityErrorHandler(event:SecurityErrorEvent):void { trace("securityErrorHandler: " + event); } private function asyncErrorHandler(event:AsyncErrorEvent):void { // ignore AsyncErrorEvent events. } private function onMetaDataHandler(info:Object):void { // Only set the duration when we first load the video if (_duration == 0) { _duration = info.duration; } _framerate = info.framerate; _videoWidth = info.width; _videoHeight = info.height; // set size? sendEvent(HtmlMediaEvent.LOADEDMETADATA); if (_isPreloading) { _stream.pause(); _isPaused = true; _isPreloading = false; sendEvent(HtmlMediaEvent.PROGRESS); sendEvent(HtmlMediaEvent.TIMEUPDATE); } } // interface members public function setSrc(url:String):void { if (_isConnected && _stream) { // stop and restart _stream.pause(); } _currentUrl = url; _isRTMP = !!_currentUrl.match(/^rtmp(s|t|e|te)?\:\/\//) || _streamer != ""; _isConnected = false; _hasStartedPlaying = false; } public function load():void { // disconnect existing stream and connection if (_isConnected && _stream) { _stream.pause(); _stream.close(); _connection.close(); } _isConnected = false; _isPreloading = false; _isEnded = false; _bufferEmpty = false; // start new connection if (_isRTMP) { var rtmpInfo:Object = parseRTMP(_currentUrl); if (_streamer != "") { rtmpInfo.server = _streamer; rtmpInfo.stream = _currentUrl; } _connection.connect(rtmpInfo.server); } else { _connection.connect(null); } // in a few moments the "NetConnection.Connect.Success" event will fire // and call createConnection which finishes the "load" sequence sendEvent(HtmlMediaEvent.LOADSTART); } private function connectStream():void { trace("connectStream"); _stream = new NetStream(_connection); // explicitly set the sound since it could have come before the connection was made _soundTransform = new SoundTransform(_volume); _stream.soundTransform = _soundTransform; // set the buffer to ensure nice playback _stream.bufferTime = 1; _stream.bufferTimeMax = 3; _stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); // same event as connection _stream.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler); var customClient:Object = new Object(); customClient.onMetaData = onMetaDataHandler; _stream.client = customClient; _video.attachNetStream(_stream); // start downloading without playing )based on preload and play() hasn't been called) // I wish flash had a load() command to make this less awkward if (_preload != "none" && !_playWhenConnected) { _isPaused = true; //stream.bufferTime = 20; _stream.play(getCurrentUrl(0), 0, 0); _stream.pause(); _isPreloading = true; //_stream.pause(); // //sendEvent(HtmlMediaEvent.PAUSE); // have to send this because the "playing" event gets sent via event handlers } _isConnected = true; if (_playWhenConnected && !_hasStartedPlaying) { play(); _playWhenConnected = false; } } public function play():void { if (!_hasStartedPlaying && !_isConnected) { _playWhenConnected = true; load(); return; } if (_hasStartedPlaying) { if (_isPaused) { _stream.resume(); _timer.start(); _isPaused = false; sendEvent(HtmlMediaEvent.PLAY); sendEvent(HtmlMediaEvent.PLAYING); } } else { if (_isRTMP) { var rtmpInfo:Object = parseRTMP(_currentUrl); _stream.play(rtmpInfo.stream); } else { _stream.play(getCurrentUrl(0)); } _timer.start(); _isPaused = false; _hasStartedPlaying = true; // don't toss play/playing events here, because we haven't sent a // canplay / loadeddata event yet. that'll be handled in the net // event listener } } public function pause():void { if (_stream == null) return; _stream.pause(); _isPaused = true; if (_bytesLoaded == _bytesTotal) { _timer.stop(); } _isPaused = true; sendEvent(HtmlMediaEvent.PAUSE); } public function stop():void { if (_stream == null) return; _stream.close(); _isPaused = false; _timer.stop(); sendEvent(HtmlMediaEvent.STOP); } public function setCurrentTime(pos:Number):void { if (_stream == null) { return; } // Calculate the position of the buffered video var bufferPosition:Number = _bytesLoaded / _bytesTotal * _duration; if (_pseudoStreamingEnabled) { sendEvent(HtmlMediaEvent.SEEKING); // Normal seek if it is in buffer and this is the first seek if (pos < bufferPosition && _seekOffset == 0) { _stream.seek(pos); } else { // Uses server-side pseudo-streaming to seek _stream.play(getCurrentUrl(pos)); _seekOffset = pos; } } else { sendEvent(HtmlMediaEvent.SEEKING); _stream.seek(pos); } if (!_isEnded) { sendEvent(HtmlMediaEvent.TIMEUPDATE); } } public function setVolume(volume:Number):void { if (_stream != null) { _soundTransform = new SoundTransform(volume); _stream.soundTransform = _soundTransform; } _volume = volume; _isMuted = (_volume == 0); sendEvent(HtmlMediaEvent.VOLUMECHANGE); } public function getVolume():Number { if(_isMuted) { return 0; } else { return _volume; } } public function setMuted(muted:Boolean):void { if (_isMuted == muted) return; if (muted) { _oldVolume = (_stream == null) ? _oldVolume : _stream.soundTransform.volume; setVolume(0); } else { setVolume(_oldVolume); } _isMuted = muted; } private function sendEvent(eventName:String) { // calculate this to mimic HTML5 _bufferedTime = _bytesLoaded / _bytesTotal * _duration; // build JSON var values:String = "duration:" + _duration + ",framerate:" + _framerate + ",currentTime:" + currentTime() + ",muted:" + _isMuted + ",paused:" + _isPaused + ",ended:" + _isEnded + ",volume:" + _volume + ",src:\"" + _currentUrl + "\"" + ",bytesTotal:" + _bytesTotal + ",bufferedBytes:" + _bytesLoaded + ",bufferedTime:" + _bufferedTime + ",videoWidth:" + _videoWidth + ",videoHeight:" + _videoHeight + ""; _element.sendEvent(eventName, values); } private function parseRTMP(url:String) { var match:Array = url.match(/(.*)\/((flv|mp4|mp3):.*)/); var rtmpInfo:Object = { server: null, stream: null }; if (match) { rtmpInfo.server = match[1]; rtmpInfo.stream = match[2]; } else { rtmpInfo.server = url.replace(/\/[^\/]+$/,"/"); rtmpInfo.stream = url.split("/").pop(); } trace("parseRTMP - server: " + rtmpInfo.server + " stream: " + rtmpInfo.stream); return rtmpInfo; } private function getCurrentUrl(pos:Number):String { var url:String = _currentUrl; if (_pseudoStreamingEnabled) { if (url.indexOf('?') > -1) { url = url + '&' + _pseudoStreamingStartQueryParam + '=' + pos; } else { url = url + '?' + _pseudoStreamingStartQueryParam + '=' + pos; } } return url; } } } \ No newline at end of file
diff --git a/files_videoviewer/src/flash/htmlelements/YouTubeElement.as b/files_videoviewer/src/flash/htmlelements/YouTubeElement.as
deleted file mode 100644
index 80986fa62..000000000
--- a/files_videoviewer/src/flash/htmlelements/YouTubeElement.as
+++ /dev/null
@@ -1,403 +0,0 @@
-package htmlelements
-{
- import flash.display.Sprite;
- import flash.events.*;
- import flash.net.NetConnection;
- import flash.net.NetStream;
- import flash.media.Video;
- import flash.media.SoundTransform;
- import flash.utils.Timer;
- import flash.net.URLLoader;
- import flash.net.URLRequest;
- import flash.net.URLVariables;
- import flash.net.URLRequestMethod;
- import flash.display.MovieClip;
- import flash.display.Loader;
- import flash.display.DisplayObject;
-
-
-
- import FlashMediaElement;
- import HtmlMediaEvent;
-
- public class YouTubeElement extends Sprite implements IMediaElement
- {
- private var _currentUrl:String = "";
- private var _autoplay:Boolean = true;
- private var _preload:String = "";
-
- private var _element:FlashMediaElement;
-
- // event values
- private var _currentTime:Number = 0;
- private var _duration:Number = 0;
- private var _framerate:Number;
- private var _isPaused:Boolean = true;
- private var _isEnded:Boolean = false;
- private var _volume:Number = 1;
- private var _isMuted:Boolean = false;
-
- private var _bytesLoaded:Number = 0;
- private var _bytesTotal:Number = 0;
- private var _bufferedTime:Number = 0;
- private var _bufferEmpty:Boolean = false;
-
- private var _videoWidth:Number = -1;
- private var _videoHeight:Number = -1;
-
- private var _timer:Timer;
-
- // YouTube stuff
- private var _playerLoader:Loader;
- private var _player:Object = null;
- private var _playerIsLoaded:Boolean = false;
- private var _youTubeId:String = "";
-
- //http://code.google.com/p/gdata-samples/source/browse/trunk/ytplayer/actionscript3/com/google/youtube/examples/AS3Player.as
- private static const WIDESCREEN_ASPECT_RATIO:String = "widescreen";
- private static const QUALITY_TO_PLAYER_WIDTH:Object = {
- small: 320,
- medium: 640,
- large: 854,
- hd720: 1280
- };
- private static const STATE_ENDED:Number = 0;
- private static const STATE_PLAYING:Number = 1;
- private static const STATE_PAUSED:Number = 2;
- private static const STATE_CUED:Number = 5;
-
-
- public function get player():DisplayObject {
- return _player;
- }
-
- public function setSize(width:Number, height:Number):void {
- if (_player != null) {
- _player.setSize(width, height);
- } else {
- initHeight = height;
- initWidth = width;
- }
- }
-
- public function get videoHeight():Number {
- return _videoHeight;
- }
-
- public function get videoWidth():Number {
- return _videoWidth;
- }
-
-
- public function duration():Number {
- return _duration;
- }
-
- public function currentProgress():Number {
- if(_bytesTotal> 0) {
- return Math.round(_bytesLoaded/_bytesTotal*100);
- } else {
- return 0;
- }
- }
-
- public function currentTime():Number {
- return _currentTime;
- }
-
-
- public var initHeight:Number;
- public var initWidth:Number;
-
- // (1) load()
- // calls _connection.connect();
- // waits for NetConnection.Connect.Success
- // _stream gets created
-
- private var _isChromeless:Boolean = false;
-
-
- public function YouTubeElement(element:FlashMediaElement, autoplay:Boolean, preload:String, timerRate:Number, startVolume:Number)
- {
- _element = element;
- _autoplay = autoplay;
- _volume = startVolume;
- _preload = preload;
- initHeight = 0;
- initWidth = 0;
-
- _playerLoader = new Loader();
- _playerLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, playerLoaderInitHandler);
-
- // chromeless
- if (_isChromeless) {
- _playerLoader.load(new URLRequest("//www.youtube.com/apiplayer?version=3&controls=1&rel=0&showinfo=0&iv_load_policy=1"));
- }
-
-
- _timer = new Timer(timerRate);
- _timer.addEventListener("timer", timerHandler);
- _timer.start();
- }
-
- private function playerLoaderInitHandler(event:Event):void {
-
- trace("yt player init");
-
- _element.addChild(_playerLoader.content);
- _element.setControlDepth();
- _playerLoader.content.addEventListener("onReady", onPlayerReady);
- _playerLoader.content.addEventListener("onError", onPlayerError);
- _playerLoader.content.addEventListener("onStateChange", onPlayerStateChange);
- _playerLoader.content.addEventListener("onPlaybackQualityChange", onVideoPlaybackQualityChange);
- }
-
- private function onPlayerReady(event:Event):void {
- _playerIsLoaded = true;
-
- _player = _playerLoader.content;
-
- if (initHeight > 0 && initWidth > 0)
- _player.setSize(initWidth, initHeight);
-
- if (_youTubeId != "") { // && _isChromeless) {
- if (_autoplay) {
- player.loadVideoById(_youTubeId);
- } else {
- player.cueVideoById(_youTubeId);
- }
- _timer.start();
- }
- }
-
- private function onPlayerError(event:Event):void {
- // trace("Player error:", Object(event).data);
- }
-
- private function onPlayerStateChange(event:Event):void {
- trace("State is", Object(event).data);
-
- _duration = _player.getDuration();
-
- switch (Object(event).data) {
- case STATE_ENDED:
- _isEnded = true;
- _isPaused = false;
-
- sendEvent(HtmlMediaEvent.ENDED);
-
- break;
-
- case STATE_PLAYING:
- _isEnded = false;
- _isPaused = false;
-
- sendEvent(HtmlMediaEvent.PLAY);
- sendEvent(HtmlMediaEvent.PLAYING);
- break;
-
- case STATE_PAUSED:
- _isEnded = false;
- _isPaused = true;
-
- sendEvent(HtmlMediaEvent.PAUSE);
-
- break;
-
- case STATE_CUED:
- sendEvent(HtmlMediaEvent.CANPLAY);
-
- // resize?
-
- break;
- }
- }
-
- private function onVideoPlaybackQualityChange(event:Event):void {
- trace("Current video quality:", Object(event).data);
- //resizePlayer(Object(event).data);
- }
-
- private function timerHandler(e:TimerEvent) {
-
- if (_playerIsLoaded) {
- _bytesLoaded = _player.getVideoBytesLoaded();
- _bytesTotal = _player.getVideoBytesTotal();
- _currentTime = player.getCurrentTime();
-
- if (!_isPaused)
- sendEvent(HtmlMediaEvent.TIMEUPDATE);
-
- if (_bytesLoaded < _bytesTotal)
- sendEvent(HtmlMediaEvent.PROGRESS);
- }
-
- }
-
- private function getYouTubeId(url:String):String {
- // http://www.youtube.com/watch?feature=player_embedded&v=yyWWXSwtPP0
- // http://www.youtube.com/v/VIDEO_ID?version=3
- // http://youtu.be/Djd6tPrxc08
-
- url = unescape(url);
-
- var youTubeId:String = "";
-
- if (url.indexOf("?") > 0) {
- // assuming: http://www.youtube.com/watch?feature=player_embedded&v=yyWWXSwtPP0
- youTubeId = getYouTubeIdFromParam(url);
-
- // if it's http://www.youtube.com/v/VIDEO_ID?version=3
- if (youTubeId == "") {
- youTubeId = getYouTubeIdFromUrl(url);
- }
- } else {
- youTubeId = getYouTubeIdFromUrl(url);
- }
-
- return youTubeId;
- }
-
- // http://www.youtube.com/watch?feature=player_embedded&v=yyWWXSwtPP0
- private function getYouTubeIdFromParam(url:String):String {
-
-
- var youTubeId:String = "";
- var parts:Array = url.split('?');
- var parameters:Array = parts[1].split('&');
-
- for (var i:Number=0; i<parameters.length; i++) {
- var paramParts = parameters[i].split('=');
- if (paramParts[0] == "v") {
-
- youTubeId = paramParts[1];
- break;
- }
-
- }
-
-
- return youTubeId;
- }
-
-
- // http://www.youtube.com/v/VIDEO_ID?version=3
- // http://youtu.be/Djd6tPrxc08
- private function getYouTubeIdFromUrl(url:String):String {
-
-
- var youTubeId:String = "";
-
- // remove any querystring elements
- var parts:Array = url.split('?');
- url = parts[0];
-
- youTubeId = url.substring(url.lastIndexOf("/")+1);
-
- return youTubeId;
- }
-
-
- // interface members
- public function setSrc(url:String):void {
- trace("yt setSrc()" + url );
-
- _currentUrl = url;
-
- _youTubeId = getYouTubeId(url);
-
- if (!_playerIsLoaded && !_isChromeless) {
- _playerLoader.load(new URLRequest("//www.youtube.com/v/" + _youTubeId + "?version=3&controls=0&rel=0&showinfo=0&iv_load_policy=1"));
- }
- }
-
-
-
-
- public function load():void {
- // do nothing
- trace("yt load()");
-
- if (_playerIsLoaded) {
- player.loadVideoById(_youTubeId);
- _timer.start();
- } else {
- /*
- if (!_isChromless && _youTubeId != "") {
- _playerLoader.load(new URLRequest("http://www.youtube.com/v/" + _youTubeId + "?version=3&controls=0&rel=0&showinfo=0&iv_load_policy=1"));
- }
- */
- }
- }
-
- public function play():void {
- if (_playerIsLoaded) {
- _player.playVideo();
- }
-
- }
-
- public function pause():void {
- if (_playerIsLoaded) {
- _player.pauseVideo();
- }
- }
-
- public function stop():void {
- if (_playerIsLoaded) {
- _player.pauseVideo();
- }
- }
-
- public function setCurrentTime(pos:Number):void {
- //_player.seekTo(pos, false);
- _player.seekTo(pos, true); // works in all places now
- }
-
- public function setVolume(volume:Number):void {
- _player.setVolume(volume*100);
- _volume = volume;
- }
-
- public function getVolume():Number {
- return _player.getVolume()*100;
- }
-
- public function setMuted(muted:Boolean):void {
- if (muted) {
- _player.mute();
-
- } else {
- _player.unMute();
- }
- _isMuted = _player.isMuted();
- sendEvent(HtmlMediaEvent.VOLUMECHANGE);
- }
-
-
- private function sendEvent(eventName:String) {
-
- // calculate this to mimic HTML5
- _bufferedTime = _bytesLoaded / _bytesTotal * _duration;
-
- // build JSON
- var values:String =
- "duration:" + _duration +
- ",framerate:" + _framerate +
- ",currentTime:" + _currentTime +
- ",muted:" + _isMuted +
- ",paused:" + _isPaused +
- ",ended:" + _isEnded +
- ",volume:" + _volume +
- ",src:\"" + _currentUrl + "\"" +
- ",bytesTotal:" + _bytesTotal +
- ",bufferedBytes:" + _bytesLoaded +
- ",bufferedTime:" + _bufferedTime +
- ",videoWidth:" + _videoWidth +
- ",videoHeight:" + _videoHeight +
- "";
-
- _element.sendEvent(eventName, values);
- }
- }
-}
diff --git a/files_videoviewer/src/silverlight/App.xaml b/files_videoviewer/src/silverlight/App.xaml
deleted file mode 100644
index 47cf6fb13..000000000
--- a/files_videoviewer/src/silverlight/App.xaml
+++ /dev/null
@@ -1,8 +0,0 @@
-<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- x:Class="SilverlightMediaElement.App"
- >
- <Application.Resources>
-
- </Application.Resources>
-</Application>
diff --git a/files_videoviewer/src/silverlight/App.xaml.cs b/files_videoviewer/src/silverlight/App.xaml.cs
deleted file mode 100644
index be67bfbf7..000000000
--- a/files_videoviewer/src/silverlight/App.xaml.cs
+++ /dev/null
@@ -1,68 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Net;
-using System.Windows;
-using System.Windows.Controls;
-using System.Windows.Documents;
-using System.Windows.Input;
-using System.Windows.Media;
-using System.Windows.Media.Animation;
-using System.Windows.Shapes;
-
-namespace SilverlightMediaElement
-{
- public partial class App : Application
- {
-
- public App()
- {
- this.Startup += this.Application_Startup;
- this.Exit += this.Application_Exit;
- this.UnhandledException += this.Application_UnhandledException;
-
- InitializeComponent();
- }
-
- private void Application_Startup(object sender, StartupEventArgs e)
- {
- this.RootVisual = new MainPage(e.InitParams);
- }
-
- private void Application_Exit(object sender, EventArgs e)
- {
-
- }
-
- private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
- {
- // If the app is running outside of the debugger then report the exception using
- // the browser's exception mechanism. On IE this will display it a yellow alert
- // icon in the status bar and Firefox will display a script error.
- if (!System.Diagnostics.Debugger.IsAttached)
- {
-
- // NOTE: This will allow the application to continue running after an exception has been thrown
- // but not handled.
- // For production applications this error handling should be replaced with something that will
- // report the error to the website and stop the application.
- e.Handled = true;
- Deployment.Current.Dispatcher.BeginInvoke(delegate { ReportErrorToDOM(e); });
- }
- }
-
- private void ReportErrorToDOM(ApplicationUnhandledExceptionEventArgs e)
- {
- try
- {
- string errorMsg = e.ExceptionObject.Message + e.ExceptionObject.StackTrace;
- errorMsg = errorMsg.Replace('"', '\'').Replace("\r\n", @"\n");
-
- System.Windows.Browser.HtmlPage.Window.Eval("throw new Error(\"Unhandled Error in Silverlight Application " + errorMsg + "\");");
- }
- catch (Exception)
- {
- }
- }
- }
-}
diff --git a/files_videoviewer/src/silverlight/MainPage.xaml b/files_videoviewer/src/silverlight/MainPage.xaml
deleted file mode 100644
index 54af028fe..000000000
--- a/files_videoviewer/src/silverlight/MainPage.xaml
+++ /dev/null
@@ -1,276 +0,0 @@
-
-<UserControl
- x:Class="SilverlightMediaElement.MainPage"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows"
- mc:Ignorable="d"
- Width="640" Height="360">
- <UserControl.Resources>
- <Style x:Key="roundThumbStyle" TargetType="Thumb">
- <Setter Property="Template">
- <Setter.Value>
- <ControlTemplate TargetType="Thumb">
- <Ellipse Stroke="#FFFFFFFF" StrokeThickness="2" Fill="#FF484848"/>
- </ControlTemplate>
- </Setter.Value>
- </Setter>
- </Style>
-
- <Style x:Key="SliderStyle" TargetType="Slider">
- <Setter Property="Template">
- <Setter.Value>
- <ControlTemplate TargetType="Slider">
- <Grid x:Name="Root" Background="Transparent">
- <Grid.Resources>
- <ControlTemplate x:Key="RightRepeatButtonTemplate">
- <Rectangle Height="8" Margin="-5,0,0,0" Grid.Column="0" Grid.ColumnSpan="3"
- StrokeThickness="0.5" RadiusY="1" RadiusX="1" Fill="#FF484848"/>
- </ControlTemplate>
- <ControlTemplate x:Key="LeftRepeatButtonTemplate">
- <Rectangle Height="8" Margin="0,0,-5,0" Grid.Column="0" Grid.ColumnSpan="3"
- StrokeThickness="0.5" RadiusY="1" RadiusX="1" Fill="#FFAFAFAF"/>
- </ControlTemplate>
- </Grid.Resources>
- <Grid x:Name="HorizontalTemplate">
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="Auto"/>
- <ColumnDefinition Width="Auto"/>
- <ColumnDefinition Width="*"/>
- </Grid.ColumnDefinitions>
-
- <RepeatButton x:Name="HorizontalTrackLargeChangeDecreaseRepeatButton" Grid.Column="0"
- IsTabStop="False" Template="{StaticResource LeftRepeatButtonTemplate}"/>
- <Rectangle x:Name="LeftTrack" Grid.Row="1" Fill="#00FFFFFF" Cursor="Hand" MouseLeftButtonDown="LeftTrack_MouseLeftButtonDown"/>
- <Thumb Background="#00FFFFFF" Height="10" x:Name="HorizontalThumb" Width="10"
- Grid.Column="1" Style="{StaticResource roundThumbStyle}" HorizontalAlignment="Left"
- DragStarted="HorizontalThumb_DragStarted" DragCompleted="HorizontalThumb_DragCompleted"
- Canvas.ZIndex="1"/>
- <RepeatButton x:Name="HorizontalTrackLargeChangeIncreaseRepeatButton" Grid.Column="2"
- IsTabStop="False" Template="{StaticResource RightRepeatButtonTemplate}"/>
- <Rectangle x:Name="RightTrack" Grid.Column="2" Grid.Row="1" Fill="#00FFFFFF" Cursor="Hand" MouseLeftButtonDown="LeftTrack_MouseLeftButtonDown"/>
- </Grid>
- </Grid>
- </ControlTemplate>
- </Setter.Value>
- </Setter>
- </Style>
-
- <ControlTemplate x:Key="PlayButtonTemplate" TargetType="ToggleButton">
- <Grid x:Name="grid" Background="Transparent">
- <vsm:VisualStateManager.VisualStateGroups>
- <vsm:VisualStateGroup x:Name="FocusStates">
- <vsm:VisualState x:Name="Focused">
- <Storyboard>
- </Storyboard>
- </vsm:VisualState>
- <vsm:VisualState x:Name="Unfocused">
- <Storyboard/>
- </vsm:VisualState>
- </vsm:VisualStateGroup>
- <vsm:VisualStateGroup x:Name="CommonStates">
- <vsm:VisualState x:Name="Normal">
- <Storyboard/>
- </vsm:VisualState>
- <vsm:VisualState x:Name="MouseOver">
- <Storyboard>
- </Storyboard>
- </vsm:VisualState>
- <vsm:VisualState x:Name="Pressed">
- <Storyboard/>
- </vsm:VisualState>
- </vsm:VisualStateGroup>
- <vsm:VisualStateGroup x:Name="CheckStates">
- <vsm:VisualState x:Name="Checked">
- <Storyboard>
- <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000"
- Storyboard.TargetName="playSymbol"
- Storyboard.TargetProperty="(UIElement.Opacity)">
- <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/>
- </DoubleAnimationUsingKeyFrames>
- <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000"
- Storyboard.TargetName="pauseSymbol"
- Storyboard.TargetProperty="(UIElement.Opacity)">
- <SplineDoubleKeyFrame KeyTime="00:00:00" Value="1"/>
- </DoubleAnimationUsingKeyFrames>
- </Storyboard>
- </vsm:VisualState>
- <vsm:VisualState x:Name="Unchecked">
- <Storyboard>
- <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="pauseSymbol" Storyboard.TargetProperty="(UIElement.Opacity)">
- <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/>
- </DoubleAnimationUsingKeyFrames>
- </Storyboard>
- </vsm:VisualState>
- </vsm:VisualStateGroup>
- </vsm:VisualStateManager.VisualStateGroups>
- <Grid Margin="11,3,0,0" HorizontalAlignment="Left" VerticalAlignment="Center"
- Opacity="1" x:Name="playSymbol" Width="21" Height="22">
- <Path Width="14" Height="15" Stretch="Fill" Fill="#FF7F7F7F"
- Data="F1 M 15.1997,22.542L 29.7776,14.89L 15.2707,6.99886L 15.1997,22.542 Z "/>
- </Grid>
- <Grid Margin="11,2,0,0" Opacity="0" x:Name="pauseSymbol" Width="31" Height="15">
- <Rectangle Stretch="Fill" Fill="#FF7F7F7F" HorizontalAlignment="Left"
- Margin="0,0,0,0" Width="6"/>
- <Rectangle Stretch="Fill" Fill="#FF7F7F7F" HorizontalAlignment="Stretch"
- Margin="6,0,13,0" Width="6"/>
- </Grid>
- </Grid>
- </ControlTemplate>
-
- <ControlTemplate x:Key="MuteButtonTemplate" TargetType="ToggleButton">
- <Grid Background="Transparent" Cursor="Hand">
- <vsm:VisualStateManager.VisualStateGroups>
- <vsm:VisualStateGroup x:Name="FocusStates">
- <vsm:VisualState x:Name="Focused">
- <Storyboard>
- </Storyboard>
- </vsm:VisualState>
- <vsm:VisualState x:Name="Unfocused">
- <Storyboard/>
- </vsm:VisualState>
- </vsm:VisualStateGroup>
- <vsm:VisualStateGroup x:Name="CommonStates">
- <vsm:VisualState x:Name="Normal">
- <Storyboard/>
- </vsm:VisualState>
- <vsm:VisualState x:Name="MouseOver">
- <Storyboard>
- </Storyboard>
- </vsm:VisualState>
- <vsm:VisualState x:Name="Pressed">
- <Storyboard/>
- </vsm:VisualState>
- </vsm:VisualStateGroup>
- <vsm:VisualStateGroup x:Name="CheckStates">
- <vsm:VisualState x:Name="Checked">
- <Storyboard>
- <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000"
- Storyboard.TargetName="volumeSymbol"
- Storyboard.TargetProperty="(UIElement.Opacity)">
- <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/>
- </DoubleAnimationUsingKeyFrames>
- </Storyboard>
- </vsm:VisualState>
- <vsm:VisualState x:Name="Unchecked">
- <Storyboard>
- <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000"
- Storyboard.TargetName="volumeSymbol"
- Storyboard.TargetProperty="(UIElement.Opacity)">
- <SplineDoubleKeyFrame KeyTime="00:00:00" Value="1"/>
- </DoubleAnimationUsingKeyFrames>
- </Storyboard>
- </vsm:VisualState>
- </vsm:VisualStateGroup>
- </vsm:VisualStateManager.VisualStateGroups>
- <Grid HorizontalAlignment="Left" VerticalAlignment="Top"
- Width="17">
- <Path HorizontalAlignment="Left" Stretch="Fill"
- Fill="#FF7F7F7F" Data="F1 M 23.1457,26.5056L 23.1457,33.8944L 25.7913,33.8944L 28.8235,37.4722L 30.5346,37.4722L 30.5665,23.0833L 28.8995,23.0833L 25.8679,26.5056L 23.1457,26.5056 Z "
- Width="7.421" Height="14.389" UseLayoutRounding="False"
- Margin="0,6.5,0,6.5"/>
-
- <Grid HorizontalAlignment="Right" Width="7.003" x:Name="volumeSymbol" Margin="0,10">
- <Path HorizontalAlignment="Right" VerticalAlignment="Stretch"
- Width="2.398"
- Data="M0.5,0.5 C0.5,0.5 2.5939558,2.7128265 2.5946648,7.0504856 C2.5953746,11.391507 0.50033337,13.889001 0.50033337,13.889001"
- Stretch="Fill" Stroke="#FF7F7F7F" Margin="0,0,-0.398,0" UseLayoutRounding="False"/>
- <Path HorizontalAlignment="Stretch" Margin="2.4,2.384,2.317,1.584" VerticalAlignment="Stretch"
- Data="M0.5,0.50000006 C0.5,0.50000006 1.4786903,2.1275051 1.4781417,4.9569001 C1.4776551,7.4670725 0.35717732,9.892808 0.35717732,9.892808" Stretch="Fill" Stroke="#FF7F7F7F" UseLayoutRounding="False"/>
- <Path HorizontalAlignment="Left" Margin="0,4.36,0,3.46" VerticalAlignment="Stretch" Width="1.542"
- Data="M0.5,0.5 C0.5,0.5 1.0412779,1.4903735 1.042276,3.1459465 C1.0429831,4.3189368 0.66544437,6.0685911 0.66544437,6.0685911" Stretch="Fill" Stroke="#FF7F7F7F" d:LayoutOverrides="Width"/>
- </Grid>
- </Grid>
- </Grid>
- </ControlTemplate>
-
- <ControlTemplate x:Key="ButtonTemplate" TargetType="Button">
- <Grid Background="Transparent">
- <ContentPresenter Width="Auto"/>
- </Grid>
- </ControlTemplate>
- </UserControl.Resources>
-
- <Grid x:Name="LayoutRoot" Background="Black" Width="640" Height="360">
-
- <MediaElement Grid.Row="0" Grid.Column="0" Width="640" Height="360"
- CacheMode="BitmapCache" AutoPlay="false" Name="media">
-
- </MediaElement>
- <Button x:Name="bigPlayButton" Template="{StaticResource ButtonTemplate}"
- Click="BigPlayButton_Click" Grid.Row="0" Visibility="Collapsed">
- <Canvas Width="100" Height="100">
- <Path Width="100" Height="100" Canvas.Left="0" Canvas.Top="0" Stretch="Fill"
- Fill="#77000000" Data="F1 M 15,0L 85,0C 93.2843,0 100,6.71573 100,15L 100,85C 100,93.2843 93.2843,100 85,100L 15,100C 6.71573,100 0,93.2843 0,85L 0,15C 0,6.71573 6.71573,0 15,0 Z "/>
- <Path Width="40.8182" Height="47.1328" Canvas.Left="34.6439"
- Canvas.Top="27.6003" Stretch="Fill" Fill="#FFFFFFFF"
- Data="F1 M 75.4621,51.1667L 34.6439,27.6003L 34.6439,74.7331L 75.4621,51.1667 Z "/>
- </Canvas>
- </Button>
- <TextBox Margin="25,25,0,0" Name="textBox1" VerticalScrollBarVisibility="Auto" Height="146" VerticalAlignment="Top" HorizontalAlignment="Left" Width="235" />
- <Button Content="" Height="36" HorizontalAlignment="Right" x:Name="FullscreenButton" VerticalAlignment="Bottom" Width="31" Click="FullscreenButton_Click" Opacity="0" Background="#00000000" Cursor="Hand" />
-
- <Grid x:Name="transportControls" VerticalAlignment="Bottom" Height="40" Background="#FF000000"
- Grid.Row="1" >
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="Auto" />
- <ColumnDefinition Width="*" />
- <ColumnDefinition Width="0" />
- <ColumnDefinition Width="Auto" />
- <ColumnDefinition Width="Auto" MinWidth="10" />
- <ColumnDefinition Width="Auto" MinWidth="10" />
- </Grid.ColumnDefinitions>
-
- <!-- play symbol showing is checked = false, Pause symbol showing is checked = true-->
- <ToggleButton x:Name="playPauseButton" Template="{StaticResource PlayButtonTemplate}"
- Click="PlayPauseButton_Click" IsChecked="false" Cursor="Hand"/>
-
- <Grid x:Name="time" Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Center">
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="40" />
- <ColumnDefinition Width="*" />
- <ColumnDefinition Width="10" />
- <ColumnDefinition Width="40" />
- </Grid.ColumnDefinitions>
-
- <TextBlock x:Name="currentTimeTextBlock" Margin="0,1.5,10,0" Height="12"
- FontFamily="Verdana" FontSize="10" Text="00:00" TextWrapping="Wrap"
- Foreground="#FFFFFFFF" FontStyle="Normal" HorizontalAlignment="Right"
- TextAlignment="Right" Grid.Column="0"/>
-
- <Slider x:Name="timelineSlider" Margin="0,2,0,-1"
- Maximum="1" Style="{StaticResource SliderStyle}" Grid.Column="1"
- ValueChanged="TimelineSlider_ValueChanged"
- Value="0"/>
-
- <TextBlock Margin="0,1.5,0,0" Height="12" FontFamily="Verdana" FontSize="10"
- Text="" TextWrapping="Wrap" Foreground="#FFFFFFFF"
- FontStyle="Normal" HorizontalAlignment="Center" TextAlignment="Right"
- Grid.Column="2"/>
- <TextBlock x:Name="totalTimeTextBlock" Margin="0,1.5,0,0" Height="12"
- FontFamily="Verdana" FontSize="10" Text="00:00" TextWrapping="Wrap"
- Foreground="#FFFFFFFF" FontStyle="Normal" HorizontalAlignment="Left"
- TextAlignment="Right" Grid.Column="3"/>
- </Grid>
-
- <ToggleButton IsChecked="false" Grid.Column="3" x:Name="muteButton"
- Template="{StaticResource MuteButtonTemplate}" Click="MuteButton_Click"
- VerticalAlignment="Center" Margin="0,0,6,0" Cursor="Hand"/>
-
- <Slider Grid.Column="4" HorizontalAlignment="Stretch" Margin="3,0,0,0"
- VerticalAlignment="Center" Maximum="1" x:Name="volumeSlider"
- Background="#FF777777" Style="{StaticResource SliderStyle}" Width="50"
- Value="{Binding ElementName=media, Mode=TwoWay, Path=Volume, UpdateSourceTrigger=Default}"/>
-
- <Button x:Name="fullScreenButton" Grid.Column="5" Margin="8,10,4,10" Click="FullScreenButton_Click"
- Template="{StaticResource ButtonTemplate}" VerticalAlignment="Center" Cursor="Hand">
- <Path Height="14.375" HorizontalAlignment="Stretch"
- VerticalAlignment="Bottom" RenderTransformOrigin="0.212389379739761,0.208695650100708"
- Data="M10.181361,8.375 L12.844413,11.008244 L14.125,9.7418737 L14.125,14.375 L9.675765,14.374833 L10.906104,13.158273 L8.125,10.408315 L10.181361,8.375 z M3.9666855,8.375 L6,10.431361 L3.3667567,13.094413 L4.6331258,14.375 L0,14.375 L0.00016707927,9.925765 L1.2167276,11.156104 L3.9666855,8.375 z M9.4918737,0 L14.125,0 L14.124833,4.449235 L12.908273,3.2188957 L10.158315,6 L8.125,3.943639 L10.758244,1.2805867 L9.4918737,0 z M0,0 L4.449235,0.00016686507 L3.2188957,1.2167276 L6,3.9666855 L3.943639,6 L1.280587,3.3667567 L0,4.6331258 L0,0 z"
- Fill="#FF7F7F7F" Stretch="Fill" Stroke="#FF000000" StrokeThickness="0" />
- </Button>
- </Grid>
- </Grid>
-</UserControl> \ No newline at end of file
diff --git a/files_videoviewer/src/silverlight/MainPage.xaml.cs b/files_videoviewer/src/silverlight/MainPage.xaml.cs
deleted file mode 100644
index 5f5da703f..000000000
--- a/files_videoviewer/src/silverlight/MainPage.xaml.cs
+++ /dev/null
@@ -1,636 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Net;
-using System.Windows;
-using System.Windows.Controls;
-using System.Windows.Documents;
-using System.Windows.Input;
-using System.Windows.Media;
-using System.Windows.Media.Animation;
-using System.Windows.Shapes;
-using System.Windows.Browser;
-using System.Globalization;
-
-
-namespace SilverlightMediaElement
-{
- [ScriptableType]
- public partial class MainPage : UserControl
- {
- System.Windows.Threading.DispatcherTimer _timer;
-
- // work arounds for src, load(), play() compatibility
- bool _isLoading = false;
- bool _isAttemptingToPlay = false;
-
- // variables
- string _mediaUrl;
- string _preload;
- string _htmlid;
- bool _autoplay = false;
- bool _debug = false;
- int _width = 0;
- int _height = 0;
- int _timerRate = 0;
- double _bufferedBytes = 0;
- double _bufferedTime = 0;
- double _volume = 1;
- int _videoWidth = 0;
- int _videoHeight = 0;
-
- // state
- bool _isPaused = true;
- bool _isEnded = false;
-
- // dummy
- bool _firedCanPlay = false;
-
- // mediaElement.Position updates TimelineSlider.Value, and
- // updating TimelineSlider.Value updates mediaElement.Position,
- // this variable helps us break the infinite loop
- private bool duringTickEvent = false;
-
- private bool playVideoWhenSliderDragIsOver = false;
-
- public MainPage(IDictionary<string, string> initParams)
- {
- InitializeComponent();
-
- HtmlPage.RegisterScriptableObject("MediaElementJS", this);
-
-
- // add events
- media.BufferingProgressChanged += new RoutedEventHandler(media_BufferingProgressChanged);
- media.DownloadProgressChanged += new RoutedEventHandler(media_DownloadProgressChanged);
- media.CurrentStateChanged += new RoutedEventHandler(media_CurrentStateChanged);
- media.MediaEnded += new RoutedEventHandler(media_MediaEnded);
- media.MediaFailed += new EventHandler<ExceptionRoutedEventArgs>(media_MediaFailed);
- media.MediaOpened += new RoutedEventHandler(media_MediaOpened);
- media.MouseLeftButtonDown += new MouseButtonEventHandler(media_MouseLeftButtonDown);
- CompositionTarget.Rendering += new EventHandler(CompositionTarget_Rendering);
- transportControls.Visibility = System.Windows.Visibility.Collapsed;
-
- // get parameters
- if (initParams.ContainsKey("id"))
- _htmlid = initParams["id"];
- if (initParams.ContainsKey("file"))
- _mediaUrl = initParams["file"];
- if (initParams.ContainsKey("autoplay") && initParams["autoplay"] == "true")
- _autoplay = true;
- if (initParams.ContainsKey("debug") && initParams["debug"] == "true")
- _debug = true;
- if (initParams.ContainsKey("preload"))
- _preload = initParams["preload"].ToLower();
- else
- _preload = "";
-
- if (!(new string[] { "none", "metadata", "auto" }).Contains(_preload)){
- _preload = "none";
- }
-
- if (initParams.ContainsKey("width"))
- Int32.TryParse(initParams["width"], out _width);
- if (initParams.ContainsKey("height"))
- Int32.TryParse(initParams["height"], out _height);
- if (initParams.ContainsKey("timerate"))
- Int32.TryParse(initParams["timerrate"], out _timerRate);
- if (initParams.ContainsKey("startvolume"))
- Double.TryParse(initParams["startvolume"], out _volume);
-
- if (_timerRate == 0)
- _timerRate = 250;
-
- // timer
- _timer = new System.Windows.Threading.DispatcherTimer();
- _timer.Interval = new TimeSpan(0, 0, 0, 0, _timerRate); // 200 Milliseconds
- _timer.Tick += new EventHandler(timer_Tick);
- _timer.Stop();
-
- //_mediaUrl = "http://local.mediaelement.com/media/jsaddington.mp4";
- //_autoplay = true;
-
- // set stage and media sizes
- if (_width > 0)
- LayoutRoot.Width = media.Width = this.Width = _width;
- if (_height > 0)
- LayoutRoot.Height = media.Height = this.Height = _height;
-
- // debug
- textBox1.Visibility = (_debug) ? System.Windows.Visibility.Visible : System.Windows.Visibility.Collapsed;
- textBox1.IsEnabled = false;
- textBox1.Text = "id: " + _htmlid + "\n" +
- "file: " + _mediaUrl + "\n";
-
-
- media.AutoPlay = _autoplay;
- media.Volume = _volume;
- if (!String.IsNullOrEmpty(_mediaUrl)) {
- setSrc(_mediaUrl);
- if (_autoplay || _preload != "none")
- loadMedia();
- }
-
- media.MouseLeftButtonUp += new MouseButtonEventHandler(media_MouseLeftButtonUp);
-
- // full screen settings
- Application.Current.Host.Content.FullScreenChanged += new EventHandler(DisplaySizeInformation);
- Application.Current.Host.Content.Resized += new EventHandler(DisplaySizeInformation);
- //FullscreenButton.Visibility = System.Windows.Visibility.Collapsed;
-
- // send out init call
- //HtmlPage.Window.Invoke("html5_MediaPluginBridge_initPlugin", new object[] {_htmlid});
- try
- {
- HtmlPage.Window.Eval("mejs.MediaPluginBridge.initPlugin('" + _htmlid + "');");
- }
- catch { }
- }
-
- void media_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
- {
- switch (media.CurrentState)
- {
- case MediaElementState.Playing:
- pauseMedia();
- break;
-
- case MediaElementState.Paused:
- playMedia();
- break;
- case MediaElementState.Stopped:
-
- break;
- case MediaElementState.Buffering:
- pauseMedia();
- break;
- }
- }
-
- void media_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) {
- SendEvent("click");
- }
-
- void media_MediaOpened(object sender, RoutedEventArgs e) {
-
- _videoWidth = Convert.ToInt32(media.NaturalVideoWidth);
- _videoHeight = Convert.ToInt32(media.NaturalVideoHeight);
-
- TimeSpan duration = media.NaturalDuration.TimeSpan;
- totalTimeTextBlock.Text = TimeSpanToString(duration);
- UpdateVideoSize();
-
- playPauseButton.IsChecked = true;
-
- SendEvent("loadedmetadata");
- }
-
- void timer_Tick(object sender, EventArgs e) {
- SendEvent("timeupdate");
- }
-
- void StartTimer() {
- _timer.Start();
- }
-
- void StopTimer() {
- _timer.Stop();
- }
-
- void WriteDebug(string text) {
- textBox1.Text += text + "\n";
- }
-
- void media_MediaFailed(object sender, ExceptionRoutedEventArgs e) {
- SendEvent(e.ToString());
- }
-
- void media_MediaEnded(object sender, RoutedEventArgs e) {
- _isEnded = true;
- _isPaused = false;
- SendEvent("ended");
- StopTimer();
- }
-
- void media_CurrentStateChanged(object sender, RoutedEventArgs e) {
-
- WriteDebug("state:" + media.CurrentState.ToString());
-
- switch (media.CurrentState)
- {
- case MediaElementState.Opening:
- SendEvent("loadstart");
- break;
- case MediaElementState.Playing:
- _isEnded = false;
- _isPaused = false;
- _isAttemptingToPlay = false;
- StartTimer();
-
-
- SendEvent("play");
- SendEvent("playing");
- break;
-
- case MediaElementState.Paused:
- _isEnded = false;
- _isPaused = true;
-
- // special settings to allow play() to work
- _isLoading = false;
- WriteDebug("paused event, " + _isAttemptingToPlay);
- if (_isAttemptingToPlay) {
- this.playMedia();
- }
-
- StopTimer();
- SendEvent("paused");
- break;
- case MediaElementState.Stopped:
- _isEnded = false;
- _isPaused = true;
- StopTimer();
- SendEvent("paused");
- break;
- case MediaElementState.Buffering:
- SendEvent("progress");
- break;
- }
-
- }
-
- void media_BufferingProgressChanged(object sender, RoutedEventArgs e) {
- _bufferedTime = media.DownloadProgress * media.NaturalDuration.TimeSpan.TotalSeconds;
- _bufferedBytes = media.BufferingProgress;
-
-
- SendEvent("progress");
- }
-
- void media_DownloadProgressChanged(object sender, RoutedEventArgs e) {
- _bufferedTime = media.DownloadProgress * media.NaturalDuration.TimeSpan.TotalSeconds;
- _bufferedBytes = media.BufferingProgress;
-
- if (!_firedCanPlay) {
- SendEvent("loadeddata");
- SendEvent("canplay");
- _firedCanPlay = true;
- }
-
- SendEvent("progress");
- }
-
-
- void SendEvent(string name) {
- /*
- * INVOKE
- HtmlPage.Window.Invoke("html5_MediaPluginBridge_fireEvent",
- _htmlid,
- name,
- @"'{" +
- @"""name"": """ + name + @"""" +
- @", ""currentTime"":" + (media.Position.TotalSeconds).ToString() + @"" +
- @", ""duration"":" + (media.NaturalDuration.TimeSpan.TotalSeconds).ToString() + @"" +
- @", ""paused"":" + (_isEnded).ToString().ToLower() + @"" +
- @", ""muted"":" + (media.IsMuted).ToString().ToLower() + @"" +
- @", ""ended"":" + (_isPaused).ToString().ToLower() + @"" +
- @", ""volume"":" + (media.Volume).ToString() + @"" +
- @", ""bufferedBytes"":" + (_bufferedBytes).ToString() + @"" +
- @", ""bufferedTime"":" + (_bufferedTime).ToString() + @"" +
- @"}'");
- */
-
- /*
- * EVAL
- HtmlPage.Window.Eval("mejs.MediaPluginBridge.fireEvent('" + _htmlid + "','" + name + "'," +
- @"{" +
- @"""name"": """ + name + @"""" +
- @", ""currentTime"":" + (media.Position.TotalSeconds).ToString() + @"" +
- @", ""duration"":" + (media.NaturalDuration.TimeSpan.TotalSeconds).ToString() + @"" +
- @", ""paused"":" + (_isEnded).ToString().ToLower() + @"" +
- @", ""muted"":" + (media.IsMuted).ToString().ToLower() + @"" +
- @", ""ended"":" + (_isPaused).ToString().ToLower() + @"" +
- @", ""volume"":" + (media.Volume).ToString() + @"" +
- @", ""bufferedBytes"":" + (_bufferedBytes).ToString() + @"" +
- @", ""bufferedTime"":" + (_bufferedTime).ToString() + @"" +
- @"});");
- * */
-
- // setTimeout
- try {
- CultureInfo invCulture = CultureInfo.InvariantCulture;
-
- HtmlPage.Window.Invoke("setTimeout", "mejs.MediaPluginBridge.fireEvent('" + _htmlid + "','" + name + "'," +
- @"{" +
- @"""name"": """ + name + @"""" +
- @", ""currentTime"":" + (media.Position.TotalSeconds).ToString(invCulture) + @"" +
- @", ""duration"":" + (media.NaturalDuration.TimeSpan.TotalSeconds).ToString(invCulture) + @"" +
- @", ""paused"":" + (_isPaused).ToString().ToLower() + @"" +
- @", ""muted"":" + (media.IsMuted).ToString().ToLower() + @"" +
- @", ""ended"":" + (_isEnded).ToString().ToLower() + @"" +
- @", ""volume"":" + (media.Volume).ToString(invCulture) + @"" +
- @", ""bufferedBytes"":" + (_bufferedBytes).ToString(invCulture) + @"" +
- @", ""bufferedTime"":" + (_bufferedTime).ToString(invCulture) + @"" +
- @", ""videoWidth"":" + (_videoWidth).ToString() + @"" +
- @", ""videoHeight"":" + (_videoHeight).ToString() + @"" +
- @"});", 0);
- } catch { }
-
- }
-
- /* HTML5 wrapper methods */
- [ScriptableMember]
- public void playMedia() {
- WriteDebug("method:play " + media.CurrentState);
-
- // sometimes people forget to call load() first
- if (_mediaUrl != "" && media.Source == null) {
- _isAttemptingToPlay = true;
- loadMedia();
- }
-
- // store and trigger with the state change above
- if (media.CurrentState == MediaElementState.Closed && _isLoading) {
- WriteDebug("storing _isAttemptingToPlay ");
- _isAttemptingToPlay = true;
- }
-
- media.Play();
- _isEnded = false;
- _isPaused = false;
-
- playPauseButton.IsChecked = true;
-
- //StartTimer();
- }
-
- [ScriptableMember]
- public void pauseMedia() {
- WriteDebug("method:pause " + media.CurrentState);
-
- _isEnded = false;
- _isPaused = true;
-
- media.Pause();
- StopTimer();
- playPauseButton.IsChecked = false;
- }
-
- [ScriptableMember]
- public void loadMedia() {
- _isLoading = true;
- _firedCanPlay = false;
-
- WriteDebug("method:load " + media.CurrentState);
- WriteDebug(" - " + _mediaUrl.ToString());
-
- media.Source = new Uri(_mediaUrl, UriKind.Absolute);
- //media.Play();
- //media.Stop();
- }
-
- [ScriptableMember]
- public void stopMedia() {
- WriteDebug("method:stop " + media.CurrentState);
-
- _isEnded = true;
- _isPaused = false;
-
- media.Stop();
- StopTimer();
- playPauseButton.IsChecked = false;
- }
-
- [ScriptableMember]
- public void setVolume(Double volume) {
- WriteDebug("method:setvolume: " + volume.ToString());
-
- media.Volume = volume;
-
- SendEvent("volumechange");
- }
-
- [ScriptableMember]
- public void setMuted(bool isMuted) {
- WriteDebug("method:setmuted: " + isMuted.ToString());
-
- media.IsMuted = isMuted;
- muteButton.IsChecked = isMuted;
- SendEvent("volumechange");
-
- }
-
- [ScriptableMember]
- public void setCurrentTime(Double position) {
- WriteDebug("method:setCurrentTime: " + position.ToString());
-
- int milliseconds = Convert.ToInt32(position * 1000);
-
- SendEvent("seeking");
- media.Position = new TimeSpan(0, 0, 0, 0, milliseconds);
- SendEvent("seeked");
- }
-
- [ScriptableMember]
- public void setSrc(string url) {
- _mediaUrl = url;
- }
-
- [ScriptableMember]
- public void setFullscreen(bool goFullscreen) {
-
- FullscreenButton.Visibility = System.Windows.Visibility.Visible;
- }
-
- [ScriptableMember]
- public void setVideoSize(int width, int height) {
- this.Width = media.Width = width;
- this.Height = media.Height = height;
- }
-
- [ScriptableMember]
- public void positionFullscreenButton(int x, int y,bool visibleAndAbove) {
- if (visibleAndAbove)
- {
- //FullscreenButton.Visibility = System.Windows.Visibility.Collapsed;
- }
- else
- {
- //FullscreenButton.Visibility = System.Windows.Visibility.Visible;
- }
- }
-
- private void FullscreenButton_Click(object sender, RoutedEventArgs e) {
- Application.Current.Host.Content.IsFullScreen = true;
- //FullscreenButton.Visibility = System.Windows.Visibility.Collapsed;
- }
-
- private void DisplaySizeInformation(Object sender, EventArgs e) {
- this.Width = LayoutRoot.Width = media.Width = Application.Current.Host.Content.ActualWidth;
- this.Height = LayoutRoot.Height = media.Height = Application.Current.Host.Content.ActualHeight;
-
- UpdateVideoSize();
- }
-
-
-
-
- #region play button
-
- private void BigPlayButton_Click(object sender, RoutedEventArgs e)
- {
- playPauseButton.IsChecked = true;
- PlayPauseButton_Click(sender, e);
- }
-
- private void PlayPauseButton_Click(object sender, RoutedEventArgs e)
- {
- bigPlayButton.Visibility = Visibility.Collapsed;
-
- // this will be the toggle button state after the click has been processed
- if (playPauseButton.IsChecked == true)
- playMedia();
- else
- pauseMedia();
- }
-
-
-
- #endregion
-
- #region timelineSlider
-
- private void Seek(double percentComplete)
- {
- if (duringTickEvent)
- throw new Exception("Can't call Seek() now, you'll get an infinite loop");
-
- TimeSpan duration = media.NaturalDuration.TimeSpan;
- int newPosition = (int)(duration.TotalSeconds * percentComplete);
- media.Position = new TimeSpan(0, 0, newPosition);
-
- // let the next CompositionTarget.Rendering take care of updating the text blocks
- }
-
- private Slider GetSliderParent(object sender)
- {
- FrameworkElement element = (FrameworkElement)sender;
- do
- {
- element = (FrameworkElement)VisualTreeHelper.GetParent(element);
- } while (!(element is Slider));
- return (Slider)element;
- }
-
- private void LeftTrack_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
- {
- e.Handled = true;
- FrameworkElement lefttrack = (sender as FrameworkElement).FindName("LeftTrack") as FrameworkElement;
- FrameworkElement righttrack = (sender as FrameworkElement).FindName("RightTrack") as FrameworkElement;
- double position = e.GetPosition(lefttrack).X;
- double width = righttrack.TransformToVisual(lefttrack).Transform(new Point(righttrack.ActualWidth, righttrack.ActualHeight)).X;
- double percent = position / width;
- Slider slider = GetSliderParent(sender);
- slider.Value = percent;
- }
-
- private void HorizontalThumb_DragStarted(object sender, System.Windows.Controls.Primitives.DragStartedEventArgs e)
- {
- if (GetSliderParent(sender) != timelineSlider) return;
-
- bool notPlaying = (media.CurrentState == MediaElementState.Paused
- || media.CurrentState == MediaElementState.Stopped);
-
- if (notPlaying)
- {
- playVideoWhenSliderDragIsOver = false;
- }
- else
- {
- playVideoWhenSliderDragIsOver = true;
- media.Pause();
- }
- }
-
- private void HorizontalThumb_DragCompleted(object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e)
- {
- if (playVideoWhenSliderDragIsOver)
- media.Play();
- }
-
- private void TimelineSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
- {
- if (duringTickEvent)
- return;
-
- Seek(timelineSlider.Value);
- }
-
- #endregion
-
- #region updating current time
-
- private void CompositionTarget_Rendering(object sender, EventArgs e)
- {
- duringTickEvent = true;
-
- TimeSpan duration = media.NaturalDuration.TimeSpan;
- if (duration.TotalSeconds != 0)
- {
- double percentComplete = (media.Position.TotalSeconds / duration.TotalSeconds);
- timelineSlider.Value = percentComplete;
- string text = TimeSpanToString(media.Position);
- if (this.currentTimeTextBlock.Text != text)
- this.currentTimeTextBlock.Text = text;
- }
-
- duringTickEvent = false;
- }
-
- private static string TimeSpanToString(TimeSpan time)
- {
- return string.Format("{0:00}:{1:00}", (time.Hours * 60) + time.Minutes, time.Seconds);
- }
- #endregion
-
- private void MuteButton_Click(object sender, RoutedEventArgs e)
- {
- //media.IsMuted = (bool)muteButton.IsChecked;
- setMuted((bool)muteButton.IsChecked);
- }
-
- #region fullscreen mode
-
- private void FullScreenButton_Click(object sender, RoutedEventArgs e)
- {
- var content = Application.Current.Host.Content;
- content.IsFullScreen = !content.IsFullScreen;
- }
-
- private void Content_FullScreenChanged(object sender, EventArgs e)
- {
- UpdateVideoSize();
- }
-
- private void UpdateVideoSize()
- {
- if (App.Current.Host.Content.IsFullScreen)
- {
- transportControls.Visibility = System.Windows.Visibility.Visible;
- // mediaElement takes all available space
- //VideoRow.Height = new GridLength(1, GridUnitType.Star);
- //VideoColumn.Width = new GridLength(1, GridUnitType.Star);
- }
- else
- {
- transportControls.Visibility = System.Windows.Visibility.Collapsed;
- // mediaElement is only as big as the source video
- //VideoRow.Height = new GridLength(1, GridUnitType.Auto);
- //VideoColumn.Width = new GridLength(1, GridUnitType.Auto);
- }
- }
-
- #endregion
- }
-}
-
diff --git a/files_videoviewer/src/silverlight/Properties/AppManifest.xml b/files_videoviewer/src/silverlight/Properties/AppManifest.xml
deleted file mode 100644
index 6712a1178..000000000
--- a/files_videoviewer/src/silverlight/Properties/AppManifest.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
->
- <Deployment.Parts>
- </Deployment.Parts>
-</Deployment>
diff --git a/files_videoviewer/src/silverlight/Properties/AssemblyInfo.cs b/files_videoviewer/src/silverlight/Properties/AssemblyInfo.cs
deleted file mode 100644
index 8d8bbce31..000000000
--- a/files_videoviewer/src/silverlight/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("SilverlightMediaElement")]
-[assembly: AssemblyDescription("Silverlight player for http://mediaelementjs.com/")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("John Dyer")]
-[assembly: AssemblyProduct("SilverlightMediaElement")]
-[assembly: AssemblyCopyright("Copyright 2010 John Dyer")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components. If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("29fe7094-d10f-4359-8abb-1c76971133a4")]
-
-// Version information for an assembly consists of the following four values:
-//
-// Major Version
-// Minor Version
-// Build Number
-// Revision
-//
-// You can specify all the values or you can default the Revision and Build Numbers
-// by using the '*' as shown below:
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/files_videoviewer/src/silverlight/SilverlightMediaElement.csproj b/files_videoviewer/src/silverlight/SilverlightMediaElement.csproj
deleted file mode 100644
index 565830460..000000000
--- a/files_videoviewer/src/silverlight/SilverlightMediaElement.csproj
+++ /dev/null
@@ -1,112 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <PropertyGroup>
- <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
- <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
- <ProductVersion>8.0.50727</ProductVersion>
- <SchemaVersion>2.0</SchemaVersion>
- <ProjectGuid>{CE832DD6-B659-4F3E-B49B-F297E2AC923A}</ProjectGuid>
- <ProjectTypeGuids>{A1591282-1198-4647-A2B1-27E5FF5F6F3B};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
- <OutputType>Library</OutputType>
- <AppDesignerFolder>Properties</AppDesignerFolder>
- <RootNamespace>SilverlightMediaElement</RootNamespace>
- <AssemblyName>SilverlightMediaElement</AssemblyName>
- <TargetFrameworkIdentifier>Silverlight</TargetFrameworkIdentifier>
- <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
- <SilverlightVersion>$(TargetFrameworkVersion)</SilverlightVersion>
- <SilverlightApplication>true</SilverlightApplication>
- <SupportedCultures>
- </SupportedCultures>
- <XapOutputs>true</XapOutputs>
- <GenerateSilverlightManifest>true</GenerateSilverlightManifest>
- <XapFilename>silverlightmediaelement.xap</XapFilename>
- <SilverlightManifestTemplate>Properties\AppManifest.xml</SilverlightManifestTemplate>
- <SilverlightAppEntry>SilverlightMediaElement.App</SilverlightAppEntry>
- <TestPageFileName>SilverlightMediaElementTestPage.html</TestPageFileName>
- <CreateTestPage>true</CreateTestPage>
- <ValidateXaml>true</ValidateXaml>
- <EnableOutOfBrowser>false</EnableOutOfBrowser>
- <OutOfBrowserSettingsFile>Properties\OutOfBrowserSettings.xml</OutOfBrowserSettingsFile>
- <UsePlatformExtensions>false</UsePlatformExtensions>
- <ThrowErrorsInValidation>true</ThrowErrorsInValidation>
- <LinkedServerProject>
- </LinkedServerProject>
- <SignManifests>false</SignManifests>
- <TargetFrameworkProfile />
- </PropertyGroup>
- <!-- This property group is only here to support building this project using the
- MSBuild 3.5 toolset. In order to work correctly with this older toolset, it needs
- to set the TargetFrameworkVersion to v3.5 -->
- <PropertyGroup Condition="'$(MSBuildToolsVersion)' == '3.5'">
- <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
- <DebugSymbols>true</DebugSymbols>
- <DebugType>full</DebugType>
- <Optimize>false</Optimize>
- <OutputPath>..\..\build\</OutputPath>
- <DefineConstants>DEBUG;TRACE;SILVERLIGHT</DefineConstants>
- <NoStdLib>true</NoStdLib>
- <NoConfig>true</NoConfig>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
- <DebugType>pdbonly</DebugType>
- <Optimize>true</Optimize>
- <OutputPath>..\..\src\</OutputPath>
- <DefineConstants>TRACE;SILVERLIGHT</DefineConstants>
- <NoStdLib>true</NoStdLib>
- <NoConfig>true</NoConfig>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
- <DocumentationFile>
- </DocumentationFile>
- </PropertyGroup>
- <ItemGroup>
- <Reference Include="mscorlib" />
- <Reference Include="System.Windows" />
- <Reference Include="system" />
- <Reference Include="System.Core" />
- <Reference Include="System.Net" />
- <Reference Include="System.Xml" />
- <Reference Include="System.Windows.Browser" />
- </ItemGroup>
- <ItemGroup>
- <Compile Include="App.xaml.cs">
- <DependentUpon>App.xaml</DependentUpon>
- </Compile>
- <Compile Include="MainPage.xaml.cs">
- <DependentUpon>MainPage.xaml</DependentUpon>
- </Compile>
- <Compile Include="Properties\AssemblyInfo.cs" />
- </ItemGroup>
- <ItemGroup>
- <ApplicationDefinition Include="App.xaml">
- <SubType>Designer</SubType>
- <Generator>MSBuild:Compile</Generator>
- </ApplicationDefinition>
- <Page Include="MainPage.xaml">
- <SubType>Designer</SubType>
- <Generator>MSBuild:Compile</Generator>
- </Page>
- </ItemGroup>
- <ItemGroup>
- <None Include="Properties\AppManifest.xml" />
- </ItemGroup>
- <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Silverlight\$(SilverlightVersion)\Microsoft.Silverlight.CSharp.targets" />
- <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
- Other similar extension points exist, see Microsoft.Common.targets.
- <Target Name="BeforeBuild">
- </Target>
- <Target Name="AfterBuild">
- </Target>
- -->
- <ProjectExtensions>
- <VisualStudio>
- <FlavorProperties GUID="{A1591282-1198-4647-A2B1-27E5FF5F6F3B}">
- <SilverlightProjectProperties />
- </FlavorProperties>
- </VisualStudio>
- </ProjectExtensions>
-</Project> \ No newline at end of file
diff --git a/files_videoviewer/src/silverlight/SilverlightMediaElement.csproj.user b/files_videoviewer/src/silverlight/SilverlightMediaElement.csproj.user
deleted file mode 100644
index 2fe79f9ea..000000000
--- a/files_videoviewer/src/silverlight/SilverlightMediaElement.csproj.user
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <PropertyGroup>
- <ProjectView>ShowAllFiles</ProjectView>
- </PropertyGroup>
- <ProjectExtensions>
- <VisualStudio>
- <FlavorProperties GUID="{A1591282-1198-4647-A2B1-27E5FF5F6F3B}">
- <SilverlightProjectProperties>
- <StartPageUrl>
- </StartPageUrl>
- <StartAction>DynamicPage</StartAction>
- <AspNetDebugging>True</AspNetDebugging>
- <NativeDebugging>False</NativeDebugging>
- <SQLDebugging>False</SQLDebugging>
- <ExternalProgram>
- </ExternalProgram>
- <StartExternalURL>
- </StartExternalURL>
- <StartCmdLineArguments>
- </StartCmdLineArguments>
- <StartWorkingDirectory>
- </StartWorkingDirectory>
- <ShowWebRefOnDebugPrompt>True</ShowWebRefOnDebugPrompt>
- <OutOfBrowserProjectToDebug>
- </OutOfBrowserProjectToDebug>
- <ShowRiaSvcsOnDebugPrompt>True</ShowRiaSvcsOnDebugPrompt>
- </SilverlightProjectProperties>
- </FlavorProperties>
- </VisualStudio>
- </ProjectExtensions>
-</Project> \ No newline at end of file
diff --git a/files_videoviewer/src/silverlight/SilverlightMediaElement.sln b/files_videoviewer/src/silverlight/SilverlightMediaElement.sln
deleted file mode 100644
index b3110c843..000000000
--- a/files_videoviewer/src/silverlight/SilverlightMediaElement.sln
+++ /dev/null
@@ -1,20 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SilverlightMediaElement", "SilverlightMediaElement.csproj", "{CE832DD6-B659-4F3E-B49B-F297E2AC923A}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {CE832DD6-B659-4F3E-B49B-F297E2AC923A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {CE832DD6-B659-4F3E-B49B-F297E2AC923A}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {CE832DD6-B659-4F3E-B49B-F297E2AC923A}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {CE832DD6-B659-4F3E-B49B-F297E2AC923A}.Release|Any CPU.Build.0 = Release|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/imprint/appinfo/app.php b/imprint/appinfo/app.php
deleted file mode 100644
index afe10ac6b..000000000
--- a/imprint/appinfo/app.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-/**
-* @package imprint an ownCloud app
-* @author Christian Reiner
-* @copyright 2012-2014 Christian Reiner <foss@christian-reiner.info>
-* @license GNU Affero General Public license (AGPL)
-* @link information http://apps.owncloud.com/content/show.php?content=153220
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the license, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library.
-* If not, see <http://www.gnu.org/licenses/>.
-*
-*/
-
-/**
- * @file appinfo/app.php
- * @brief Basic registration of app inside ownCloud
- * @author Christian Reiner
- */
-
-OC::$CLASSPATH['Slimdown'] = 'imprint/vendor/slimdown.php';
-
-\OCP\App::registerAdmin('imprint', 'settings' );
-\OCP\Util::addStyle ('imprint', 'reference');
-\OCP\Util::addScript ('imprint', 'reference');
-
-// add imprint positioning options as meta tags to the html head to avoid additional ajax requests
-\OCP\Util::addHeader('meta', array('data-imprint-position-user' =>\OCP\Config::getAppValue('imprint', 'position-user', '')));
-\OCP\Util::addHeader('meta', array('data-imprint-position-guest'=>\OCP\Config::getAppValue('imprint', 'position-guest', '')));
-\OCP\Util::addHeader('meta', array('data-imprint-position-login'=>\OCP\Config::getAppValue('imprint', 'position-login', '')));
-
-// offer application as standalone entry in the menu?
-if ('true' === \OCP\Config::getAppValue('imprint', 'standalone', 'false')) {
- // no js required, we add the imprint as a normal app to the navigation
- \OCP\App::addNavigationEntry(array(
- 'id' => 'imprint',
- 'order' => 99999,
- 'href' => \OCP\Util::linkTo ('imprint', 'index.php'),
- 'icon' => \OCP\Util::imagePath('imprint', 'imprint-light.svg'),
- 'name' => \OCP\Util::getL10N ('imprint')->t("Legal notice")
- ));
-} // if
diff --git a/imprint/appinfo/info.xml b/imprint/appinfo/info.xml
deleted file mode 100644
index 521061771..000000000
--- a/imprint/appinfo/info.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0"?>
-<!--
-* @package imprint an ownCloud app
-* @author Christian Reiner
-* @copyright 2012-2014 Christian Reiner <foss@christian-reiner.info>
-* @license GNU Affero General Public license (AGPL)
-* @link information http://apps.owncloud.com/content/show.php?content=153220
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the license, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library.
-* If not, see <http://www.gnu.org/licenses/>.
-*
--->
-
-<!--
- /**
- * @file appinfo/info.xml
- * @brief Definition of central information about this app
- * @author Christian Reiner
- /*
- -->
-
-<info>
- <id>imprint</id>
- <name>Imprint</name>
- <description>
- This simple app adds a legal notice (Imprint / Impressum) to the ownCloud framework.
- The imprints content can be configured using plain text or html markup.
- The app is simple but sufficient for the purpose.
- </description>
- <version>0.2.5</version>
- <licence>AGPL</licence>
- <author>Christian Reiner</author>
- <requiremin>7</requiremin>
- <category>other</category>
- <types>
- <type>internet</type>
- </types>
- <website>https://github.com/owncloud/apps</website>
- <bugs>https://github.com/owncloud/apps/issues</bugs>
- <repository type="git">https://github.com/owncloud/apps.git</repository>
- <documentation>
- <admin>https://raw.githubusercontent.com/owncloud/shorty/master/apps/doc/CONFIGURATION</admin>
- </documentation>
- <dependencies>
- <owncloud min-version="7" max-version="9"/>
- <php min-version="5.3"/>
- </dependencies>
- <types>
- <prelogin />
- </types>
- <website>http://apps.owncloud.com/content/show.php/Imprint?content=153220</website>
- <shipped>false</shipped>
-</info>
diff --git a/imprint/appinfo/routes.php b/imprint/appinfo/routes.php
deleted file mode 100644
index 53eb744e5..000000000
--- a/imprint/appinfo/routes.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-/**
- * @package imprint an ownCloud app
- * @author Christian Reiner
- * @copyright 2012-2014 Christian Reiner <foss@christian-reiner.info>
- * @license GNU Affero General Public license (AGPL)
- * @link information http://apps.owncloud.com/content/show.php?content=153220
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the license, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
- *
- * You should have received a copy of the GNU Affero General Public
- * License along with this library.
- * If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-/**
- * @file appinfo/routes.php
- * @brief Basic request routing map
- * @author Christian Reiner
- */
-
-$this->create('imprint_index', '/')
- ->actionInclude('imprint/index.php');
-$this->create('imprint_settings', '/settings.php')
- ->actionInclude('imprint/settings.php');
-$this->create('imprint_content', '/content.php')
- ->actionInclude('imprint/content.php');
diff --git a/imprint/appinfo/version b/imprint/appinfo/version
deleted file mode 100644
index 28af839c0..000000000
--- a/imprint/appinfo/version
+++ /dev/null
@@ -1 +0,0 @@
-0.2.5 \ No newline at end of file
diff --git a/imprint/content.php b/imprint/content.php
deleted file mode 100644
index c2cb77564..000000000
--- a/imprint/content.php
+++ /dev/null
@@ -1,60 +0,0 @@
-<?php
-/**
-* @package imprint an ownCloud app
-* @author Christian Reiner
-* @copyright 2012-2014 Christian Reiner <foss@christian-reiner.info>
-* @license GNU Affero General Public license (AGPL)
-* @link information http://apps.owncloud.com/content/show.php?content=153220
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the license, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library.
-* If not, see <http://www.gnu.org/licenses/>.
-*
-*/
-
-/**
- * @file content.php
- * Content of the imprint as configured
- * @access public
- */
-
-// Session checks
-// \OCP\User::checkLoggedIn();
-\OCP\App::checkAppEnabled('imprint');
-
-// prepare content
-if (FALSE === ($content=\OCP\Config::getAppValue('imprint','content',FALSE))) {
- $dummy = new \OCP\Template('imprint', 'tmpl_dummy');
- $content = $dummy->fetchPage();
-}
-
-// detect type of stored content and process accordingly
-if (strlen($content)!=strlen(strip_tags($content))) {
- // html markup
- $processed_content = $content;
-} else {
- $renderer = new Slimdown();
- // markdown
- if ( strlen($content) == strlen($processed_content=$renderer->render($content))) {
- // plain text
- $processed_content = sprintf ("<pre>\n%s\n</pre>", $content);
- }
-}
-// output processed content
-\OCP\Util::addStyle ('imprint', 'content');
-$tmpl = new \OCP\Template('imprint', 'tmpl_content');
-$tmpl->assign('content', $processed_content);
-
-// render template
-$tmpl->printPage();
-?>
diff --git a/imprint/css/content.css b/imprint/css/content.css
deleted file mode 100644
index 02cffe917..000000000
--- a/imprint/css/content.css
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
-* @package imprint an ownCloud app
-* @author Christian Reiner
-* @copyright 2012-2014 Christian Reiner <foss@christian-reiner.info>
-* @license GNU Affero General Public license (AGPL)
-* @link information http://apps.owncloud.com/content/show.php?content=153220
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the license, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library.
-* If not, see <http://www.gnu.org/licenses/>.
-*
-*/
-
-/**
- * @file css/content.css
- * @brief Style definitions of the apps view
- * @author Christian Reiner
- */
-
-/* some general content padding */
-#imprint-body {
- overflow-y: hidden;
- text-align: center;
-}
-#imprint-content {
- display: inline-block;
- text-align: initial;
- padding: 14px;
- font-size: larger;
-}
diff --git a/imprint/css/reference.css b/imprint/css/reference.css
deleted file mode 100644
index d04a9007f..000000000
--- a/imprint/css/reference.css
+++ /dev/null
@@ -1,101 +0,0 @@
-/**
-* @package imprint an ownCloud app
-* @author Christian Reiner
-* @copyright 2012-2014 Christian Reiner <foss@christian-reiner.info>
-* @license GNU Affero General Public license (AGPL)
-* @link information http://apps.owncloud.com/content/show.php?content=153220
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the license, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library.
-* If not, see <http://www.gnu.org/licenses/>.
-*
-*/
-
-/**
- * @file css/position.css
- * @brief Style definitions of the apps view
- * @author Christian Reiner
- */
-
-#header #owncloud,
-#header .menutoggle {
- position: relative;
- left: initial;
- top: initial;
- float: left;
- left: 0;
-}
-
-#header form.searchbox,
-#header div.header-right {
- position: relative;
- display: inline-block;
- float: right;
-}
-
-#body-login .wrapper {
- width: auto;
-}
-
-footer p.info {
- width: 22em;
-}
-
-/* some rules for the reference itself */
-a.imprint-anchor {
- margin: 0;
- padding: 0 15px;
- position: relative;
- display: inline-block;
- font-size: inherit;
- font-weight: bold;
- color: #bfbfbf;
-}
-
-a.imprint-anchor.imprint-position-header-left,
-a.imprint-anchor.imprint-position-header-right {
- line-height: 45px;
-}
-
-a.imprint-anchor.imprint-position-footer-left,
-a.imprint-anchor.imprint-position-footer-right {
- color: #777777;
- padding: 20px 15px 0;
-}
-
-a.imprint-anchor.imprint-view-login.imprint-position-footer-left,
-a.imprint-anchor.imprint-view-login.imprint-position-footer-right {
- color: #cccccc;
-}
-
-a.imprint-anchor.imprint-position-header-left.imprint-anchor:hover,
-a.imprint-anchor.imprint-position-header-right.imprint-anchor:hover,
-a.imprint-anchor.imprint-position-footer-left.imprint-anchor:hover,
-a.imprint-anchor.imprint-position-footer-right.imprint-anchor:hover {
- color: #ffffff;
-}
-
-a.imprint-anchor.imprint-view-guest.imprint-position-footer-left.imprint-anchor:hover,
-a.imprint-anchor.imprint-view-guest.imprint-position-footer-right.imprint-anchor:hover {
- color: #000000;
-}
-
-a.imprint-anchor.imprint-position-header-left,
-a.imprint-anchor.imprint-position-footer-left {
- float: left;
-}
-
-a.imprint-anchor.imprint-position-header-right,
-a.imprint-anchor.imprint-position-footer-right {
- float: right;
-}
diff --git a/imprint/css/settings.css b/imprint/css/settings.css
deleted file mode 100644
index 1c041d5e9..000000000
--- a/imprint/css/settings.css
+++ /dev/null
@@ -1,90 +0,0 @@
-/**
-* @package imprint an ownCloud app
-* @author Christian Reiner
-* @copyright 2012-2014 Christian Reiner <foss@christian-reiner.info>
-* @license GNU Affero General Public license (AGPL)
-* @link information http://apps.owncloud.com/content/show.php?content=153220
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the license, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library.
-* If not, see <http://www.gnu.org/licenses/>.
-*
-*/
-
-/**
- * @file css/settings.css
- * @brief Style definitions of the apps view
- * @author Christian Reiner
- */
-
-
-#imprint.section > img {
- float: left;
- position: relative;
- margin-right: 0.5em;
- vertical-align: bottom;
- width: 20px;
- opacity: 0.7;
-}
-
-.imprint-option {
- vertical-align: middle;
-}
-
-.imprint-option label {
- display: inline-block;
- width: 85px;
-}
-
-.imprint-option label.followup {
- text-align: right;
-}
-
-.imprint-option textarea {
- min-width: 850px;
- min-height: 70px;
-}
-
-.imprint-hint {
- font-style: italic;
- margin: 0 8.5px;
-}
-
-/* some rules for the 'dummy' content */
-.imprint-factoid {
- font-size: 160%;
- font-weight: bold;
- font-style: normal;
- color: gray;
-}
-
-.imprint-suggestion {
- margin: 4px;
- font-size: 110%;
- font-weight: light;
- font-style: italic;
- color: gray;
-}
-
-.imprint-explanation {
- margin: 14px 0 28px;
- font-size: 100%;
- font-weight: normal;
- font-style: normal;
- color: black;
-}
-
-.imprint-reference {
- color: blue;
- text-decoration: underline;
-}
diff --git a/imprint/doc/CHANGELOG b/imprint/doc/CHANGELOG
deleted file mode 100644
index 2d6de3fe8..000000000
--- a/imprint/doc/CHANGELOG
+++ /dev/null
@@ -1,76 +0,0 @@
-*****
-* @package imprint an ownCloud app
-* @author Christian Reiner
-* @copyright 2012-2014 Christian Reiner <foss@christian-reiner.info>
-* @license GNU Affero General Public license (AGPL)
-* @link information http://apps.owncloud.com/content/show.php?content=153220
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the license, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library.
-* If not, see <http://www.gnu.org/licenses/>.
-*****
-
-Changelog:
-
-* Mon Feb 23 2015 Christian Reiner: version 0.2.5
-Offer a separate navigation entry inside the admins settings page.
-* Mon Feb 09 2015 Christian Reiner: version 0.2.4
-Hotfix to make the app work in fresh installs of OC-8
-* Mon Feb 09 2015 Christian Reiner: version 0.2.3
-Compatibility with owncloud version 8
-* Mon Nov 24 2014 Christian Reiner: version 0.2.2
-Fix crash for non privileged users when no content has been configured before.
-Removed stale reference to obsolete internal style sheet definition.
-* Sat Nov 02 2014 Christian Reiner: version 0.2.1
-Rendering of markdown as alternative to html markup and plain text.
-* Tue Oct 28 2014 Christian Reiner: version 0.2.0
-Ported app to owncloud version 7.
-Removed all backwards compatibility hacks.
-Integration of the content reference also on login and guest pages.
-Enhanced administration section.
-* Tue Aug 13 2013 Christian Reiner: version 0.1.15
-Fixed a hard crash introduced by someones well meant contribution some weeks ago.
-The faulty code got released by accident and is fixed now in this version.
-* Mon Jul 15 2013 Christian Reiner: version 0.1.14
-Small performance fix by preventing double evalutation of content.
-* Fri Jul 05 2013 Christian Reiner: version 0.1.13
-Separat setting to place link during anonymous access (login).
-* Sun Apr 07 2013 Christian Reiner: version 0.1.12
-Fixed reference to another app that crashed OC.
-* Sat Apr 06 2013 Christian Reiner: version 0.1.11
-Fixed content access during login for OC>=5.
-Fixed styles and layout in content display.
-Fixed sloppy user role evaluation.
-* Wed Mar 20 2013 Christian Reiner: version 0.1.10
-Allow direct activation in ownCloud5 based installations.
-* Fri Mar 01 2013 Christian Reiner: version 0.1.9
-Some general security fix to the apps framework.
-* Mon Feb 18 2013 Christian Reiner: version 0.1.8
-Compatibility to ownCloud version 5.
-* Tue Jan 29 2013 Christian Reiner: version 0.1.7
-Changed requirement of OC version from 4.0 to 4.5 (4.9).
-* Fri Jan 18 2013 Christian Reiner: version 0.1.6
-Convert plain text content to simple markup to preserve linebreaks.
-* Fri Dec 07 2012 Christian Reiner: version 0.1.5
-Fixed usage for non-admin users.
-Simplyfied initialization without explicit ajax call.
-* Sun Aug 12 2012 Christian Reiner: version 0.1.4
-Small additional usage hint in the configuration.
-* Sat Aug 11 2012 Christian Reiner: version 0.1.3
-Fixed reference url to use propper syntax in all cases.
-* Fri Aug 10 2012 Christian Reiner: version 0.1.2
-Fixed reference url to use propper syntax in a special case.
-* Thu Aug 09 2012 Christian Reiner: version 0.1.1
-Fixed german translation.
-* Wed Aug 08 2012 Christian Reiner: version 0.1.0
-Initial release.
diff --git a/imprint/doc/CONFIGURATION b/imprint/doc/CONFIGURATION
deleted file mode 100644
index d3d71e664..000000000
--- a/imprint/doc/CONFIGURATION
+++ /dev/null
@@ -1,37 +0,0 @@
-*****
-* @package imprint an ownCloud app
-* @author Christian Reiner
-* @copyright 2012-2014 Christian Reiner <foss@christian-reiner.info>
-* @license GNU Affero General Public license (AGPL)
-* @link information http://apps.owncloud.com/content/show.php?content=153220
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the license, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library.
-* If not, see <http://www.gnu.org/licenses/>.
-*****
-
-There are only two configuration aspects:
-1.) the content of the legal notice
-2.) the position of the reference of the legal notice
-Both aspects are currently configured in the systems admin section. There is a
-direct link to that section if you open the app without having configured it
-before.
-
-The content can be plain text, or markdown or html markup can be applied. Also,
-html style attributes are accepted, though they must be specified inside the
-markup. Dealing with separate style definitions appears unneccessary overhead
-for this small purpose.
-
-Currently five positions are offered, where to place the reference to the notice:
-Left or right in the header, bottom left or right in login or guest views and
-simply as a standalone app in the navigation.
diff --git a/imprint/doc/COPYRIGHT b/imprint/doc/COPYRIGHT
deleted file mode 100644
index b9e1bd559..000000000
--- a/imprint/doc/COPYRIGHT
+++ /dev/null
@@ -1,21 +0,0 @@
-*****
-* @package imprint an ownCloud app
-* @author Christian Reiner
-* @copyright 2012-2014 Christian Reiner <foss@christian-reiner.info>
-* @license GNU Affero General Public license (AGPL)
-* @link information http://apps.owncloud.com/content/show.php?content=153220
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the license, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library.
-* If not, see <http://www.gnu.org/licenses/>.
-*****
diff --git a/imprint/doc/CREDITS b/imprint/doc/CREDITS
deleted file mode 100644
index 0ae783ec5..000000000
--- a/imprint/doc/CREDITS
+++ /dev/null
@@ -1,30 +0,0 @@
-*****
-* @package imprint an ownCloud app
-* @author Christian Reiner
-* @copyright 2012-2014 Christian Reiner <foss@christian-reiner.info>
-* @license GNU Affero General Public license (AGPL)
-* @link information http://apps.owncloud.com/content/show.php?content=153220
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the license, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library.
-* If not, see <http://www.gnu.org/licenses/>.
-*****
-
-The imprint app has been developed by:
-
-Christian Reiner, Hamburg, Germany
-E-Mail: foss@christian-reiner.info
-
-Contributions:
-I'd be more than happy to welcome all contributions to this little experiment.
-Drop me a note, an idea, a patch, a good bottle of wine, anything !
diff --git a/imprint/doc/INSTALLATION b/imprint/doc/INSTALLATION
deleted file mode 100644
index e27eb56a6..000000000
--- a/imprint/doc/INSTALLATION
+++ /dev/null
@@ -1,46 +0,0 @@
-*****
-* @package imprint an ownCloud app
-* @author Christian Reiner
-* @copyright 2012-2014 Christian Reiner <foss@christian-reiner.info>
-* @license GNU Affero General Public license (AGPL)
-* @link information http://apps.owncloud.com/content/show.php?content=153220
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the license, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library.
-* If not, see <http://www.gnu.org/licenses/>.
-*****
-
-This package is a plugin for the ownCloud web application ("ownCloud app").
-
-There are two ways of installation: automatic and manual
-
-* Automatic installation:
-You need login to your ownCloud using an account with administrative rights.
-Open the 'Apps' section of the adminstration and select 'imprint', enable it.
-Then go on below with the basic configuration steps.
-
-* Manual installation:
-Download the package from apps.owncloud.com.
-Create a subfolder 'imprint' in the "apps" subfolder of your ownCloud web root.
-Unpack the contents of the package into the new folder 'imprint'.
-Now load ownCloud in your favorite web browser and login with an administrative
-account.
-Enable the plugin in the "Apps" section of the configuration ("*") inside
-ownClouds web gui (requires admin rights).
-
-* Basic configuration steps for BOTH types of installation:
-The "Admin" section of the configuration allows to configurethe two
-configuration aspects mentioned in the COFIGURATION doc file.
-
-***
-Have fun !
diff --git a/imprint/doc/ISSUES b/imprint/doc/ISSUES
deleted file mode 100644
index 29549916d..000000000
--- a/imprint/doc/ISSUES
+++ /dev/null
@@ -1,25 +0,0 @@
-*****
-* @package imprint an ownCloud app
-* @author Christian Reiner
-* @copyright 2012-2014 Christian Reiner <foss@christian-reiner.info>
-* @license GNU Affero General Public license (AGPL)
-* @link information http://apps.owncloud.com/content/show.php?content=153220
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the license, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library.
-* If not, see <http://www.gnu.org/licenses/>.
-*****
-
-This is a short list of known issues:
-
-:-)
diff --git a/imprint/doc/LICENSE b/imprint/doc/LICENSE
deleted file mode 100644
index dba13ed2d..000000000
--- a/imprint/doc/LICENSE
+++ /dev/null
@@ -1,661 +0,0 @@
- GNU AFFERO GENERAL PUBLIC LICENSE
- Version 3, 19 November 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The GNU Affero General Public License is a free, copyleft license for
-software and other kinds of works, specifically designed to ensure
-cooperation with the community in the case of network server software.
-
- The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works. By contrast,
-our General Public Licenses are intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
- Developers that use our General Public Licenses protect your rights
-with two steps: (1) assert copyright on the software, and (2) offer
-you this License which gives you legal permission to copy, distribute
-and/or modify the software.
-
- A secondary benefit of defending all users' freedom is that
-improvements made in alternate versions of the program, if they
-receive widespread use, become available for other developers to
-incorporate. Many developers of free software are heartened and
-encouraged by the resulting cooperation. However, in the case of
-software used on network servers, this result may fail to come about.
-The GNU General Public License permits making a modified version and
-letting the public access it on a server without ever releasing its
-source code to the public.
-
- The GNU Affero General Public License is designed specifically to
-ensure that, in such cases, the modified source code becomes available
-to the community. It requires the operator of a network server to
-provide the source code of the modified version running there to the
-users of that server. Therefore, public use of a modified version, on
-a publicly accessible server, gives the public access to the source
-code of the modified version.
-
- An older license, called the Affero General Public License and
-published by Affero, was designed to accomplish similar goals. This is
-a different license, not a version of the Affero GPL, but Affero has
-released a new version of the Affero GPL which permits relicensing under
-this license.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- TERMS AND CONDITIONS
-
- 0. Definitions.
-
- "This License" refers to version 3 of the GNU Affero General Public License.
-
- "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
- "The Program" refers to any copyrightable work licensed under this
-License. Each licensee is addressed as "you". "Licensees" and
-"recipients" may be individuals or organizations.
-
- To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy. The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
- A "covered work" means either the unmodified Program or a work based
-on the Program.
-
- To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy. Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
- To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies. Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
- An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License. If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
- 1. Source Code.
-
- The "source code" for a work means the preferred form of the work
-for making modifications to it. "Object code" means any non-source
-form of a work.
-
- A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
- The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form. A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
- The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities. However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work. For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
- The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
- The Corresponding Source for a work in source code form is that
-same work.
-
- 2. Basic Permissions.
-
- All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met. This License explicitly affirms your unlimited
-permission to run the unmodified Program. The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work. This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
- You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force. You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright. Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
- Conveying under any other circumstances is permitted solely under
-the conditions stated below. Sublicensing is not allowed; section 10
-makes it unnecessary.
-
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
- No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
- When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
- 4. Conveying Verbatim Copies.
-
- You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
- You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
- 5. Conveying Modified Source Versions.
-
- You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
- a) The work must carry prominent notices stating that you modified
- it, and giving a relevant date.
-
- b) The work must carry prominent notices stating that it is
- released under this License and any conditions added under section
- 7. This requirement modifies the requirement in section 4 to
- "keep intact all notices".
-
- c) You must license the entire work, as a whole, under this
- License to anyone who comes into possession of a copy. This
- License will therefore apply, along with any applicable section 7
- additional terms, to the whole of the work, and all its parts,
- regardless of how they are packaged. This License gives no
- permission to license the work in any other way, but it does not
- invalidate such permission if you have separately received it.
-
- d) If the work has interactive user interfaces, each must display
- Appropriate Legal Notices; however, if the Program has interactive
- interfaces that do not display Appropriate Legal Notices, your
- work need not make them do so.
-
- A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit. Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
- 6. Conveying Non-Source Forms.
-
- You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
- a) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by the
- Corresponding Source fixed on a durable physical medium
- customarily used for software interchange.
-
- b) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by a
- written offer, valid for at least three years and valid for as
- long as you offer spare parts or customer support for that product
- model, to give anyone who possesses the object code either (1) a
- copy of the Corresponding Source for all the software in the
- product that is covered by this License, on a durable physical
- medium customarily used for software interchange, for a price no
- more than your reasonable cost of physically performing this
- conveying of source, or (2) access to copy the
- Corresponding Source from a network server at no charge.
-
- c) Convey individual copies of the object code with a copy of the
- written offer to provide the Corresponding Source. This
- alternative is allowed only occasionally and noncommercially, and
- only if you received the object code with such an offer, in accord
- with subsection 6b.
-
- d) Convey the object code by offering access from a designated
- place (gratis or for a charge), and offer equivalent access to the
- Corresponding Source in the same way through the same place at no
- further charge. You need not require recipients to copy the
- Corresponding Source along with the object code. If the place to
- copy the object code is a network server, the Corresponding Source
- may be on a different server (operated by you or a third party)
- that supports equivalent copying facilities, provided you maintain
- clear directions next to the object code saying where to find the
- Corresponding Source. Regardless of what server hosts the
- Corresponding Source, you remain obligated to ensure that it is
- available for as long as needed to satisfy these requirements.
-
- e) Convey the object code using peer-to-peer transmission, provided
- you inform other peers where the object code and Corresponding
- Source of the work are being offered to the general public at no
- charge under subsection 6d.
-
- A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
- A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling. In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage. For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product. A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
- "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source. The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
- If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information. But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
- The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed. Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
- Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
- 7. Additional Terms.
-
- "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law. If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
- When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it. (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.) You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
- Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
- a) Disclaiming warranty or limiting liability differently from the
- terms of sections 15 and 16 of this License; or
-
- b) Requiring preservation of specified reasonable legal notices or
- author attributions in that material or in the Appropriate Legal
- Notices displayed by works containing it; or
-
- c) Prohibiting misrepresentation of the origin of that material, or
- requiring that modified versions of such material be marked in
- reasonable ways as different from the original version; or
-
- d) Limiting the use for publicity purposes of names of licensors or
- authors of the material; or
-
- e) Declining to grant rights under trademark law for use of some
- trade names, trademarks, or service marks; or
-
- f) Requiring indemnification of licensors and authors of that
- material by anyone who conveys the material (or modified versions of
- it) with contractual assumptions of liability to the recipient, for
- any liability that these contractual assumptions directly impose on
- those licensors and authors.
-
- All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10. If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term. If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
- If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
- Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
- 8. Termination.
-
- You may not propagate or modify a covered work except as expressly
-provided under this License. Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
- However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
- Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
- Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License. If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
- 9. Acceptance Not Required for Having Copies.
-
- You are not required to accept this License in order to receive or
-run a copy of the Program. Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance. However,
-nothing other than this License grants you permission to propagate or
-modify any covered work. These actions infringe copyright if you do
-not accept this License. Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
- 10. Automatic Licensing of Downstream Recipients.
-
- Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License. You are not responsible
-for enforcing compliance by third parties with this License.
-
- An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations. If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
- You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License. For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
- 11. Patents.
-
- A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based. The
-work thus licensed is called the contributor's "contributor version".
-
- A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version. For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
- Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
- In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement). To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
- If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients. "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
- If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
- A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License. You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
- Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
- 12. No Surrender of Others' Freedom.
-
- If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all. For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
- 13. Remote Network Interaction; Use with the GNU General Public License.
-
- Notwithstanding any other provision of this License, if you modify the
-Program, your modified version must prominently offer all users
-interacting with it remotely through a computer network (if your version
-supports such interaction) an opportunity to receive the Corresponding
-Source of your version by providing access to the Corresponding Source
-from a network server at no charge, through some standard or customary
-means of facilitating copying of software. This Corresponding Source
-shall include the Corresponding Source for any work covered by version 3
-of the GNU General Public License that is incorporated pursuant to the
-following paragraph.
-
- Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU General Public License into a single
-combined work, and to convey the resulting work. The terms of this
-License will continue to apply to the part which is the covered work,
-but the work with which it is combined will remain governed by version
-3 of the GNU General Public License.
-
- 14. Revised Versions of this License.
-
- The Free Software Foundation may publish revised and/or new versions of
-the GNU Affero General Public License from time to time. Such new versions
-will be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Program specifies that a certain numbered version of the GNU Affero General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation. If the Program does not specify a version number of the
-GNU Affero General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
- If the Program specifies that a proxy can decide which future
-versions of the GNU Affero General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
- Later license versions may give you additional or different
-permissions. However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
- 15. Disclaimer of Warranty.
-
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. Limitation of Liability.
-
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
- 17. Interpretation of Sections 15 and 16.
-
- If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-Also add information on how to contact you by electronic and paper mail.
-
- If your software can interact with users remotely through a computer
-network, you should also make sure that it provides a way for users to
-get its source. For example, if your program is a web application, its
-interface could display a "Source" link that leads users to an archive
-of the code. There are many ways you could offer source, and different
-solutions will be better for different programs; see section 13 for the
-specific requirements.
-
- You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU AGPL, see
-<http://www.gnu.org/licenses/>.
diff --git a/imprint/doc/README b/imprint/doc/README
deleted file mode 100644
index c50522016..000000000
--- a/imprint/doc/README
+++ /dev/null
@@ -1,30 +0,0 @@
-*****
-* @package imprint an ownCloud app
-* @author Christian Reiner
-* @copyright 2012-2014 Christian Reiner <foss@christian-reiner.info>
-* @license GNU Affero General Public license (AGPL)
-* @link information http://apps.owncloud.com/content/show.php?content=153220
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the license, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library.
-* If not, see <http://www.gnu.org/licenses/>.
-*****
-
-This imprint app implements a plugin for the ownCloud web application.
-It provides a very simply means to add a legal notice, an imprint to the
-framework. Such notice is required in some countries when offering a service
-on the internet.
-The app is kept extremely simple. No fancy configuration options, no complex
-setup. Just activate it, configure the notices content and where to place the
-reference, that's all.
-You can use plain text for content or use simple html layout.
diff --git a/imprint/doc/ROADMAP b/imprint/doc/ROADMAP
deleted file mode 100644
index eab9abf89..000000000
--- a/imprint/doc/ROADMAP
+++ /dev/null
@@ -1,24 +0,0 @@
-*****
-* @package imprint an ownCloud app
-* @author Christian Reiner
-* @copyright 2012-2014 Christian Reiner <foss@christian-reiner.info>
-* @license GNU Affero General Public license (AGPL)
-* @link information http://apps.owncloud.com/content/show.php?content=153220
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the license, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library.
-* If not, see <http://www.gnu.org/licenses/>.
-*****
-
-Future versions might implement additional features and services.
-If you have a suggestion of requirement, drop me a note :-)
diff --git a/imprint/doc/STATUS b/imprint/doc/STATUS
deleted file mode 100644
index 736279bc7..000000000
--- a/imprint/doc/STATUS
+++ /dev/null
@@ -1,35 +0,0 @@
-*****
-* @package imprint an ownCloud app
-* @author Christian Reiner
-* @copyright 2012-2014 Christian Reiner <foss@christian-reiner.info>
-* @license GNU Affero General Public license (AGPL)
-* @link information http://apps.owncloud.com/content/show.php?content=153220
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the license, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library.
-* If not, see <http://www.gnu.org/licenses/>.
-*****
-
-The current status of this package is as follows:
-
-The initial release is definately buggy and contains annoying shortcomings.
-It has been developed on a linux system using only a few browsers, so this is
-most likely the best working combination. Basic usage test have been made with
-a few other browsers. The package appears to be working in general though there
-might be some minor differences in apeparance.
-
-So "sorry for any inconveniences" !
-
-Contributions:
-I'd be more than happy to welcome all contributions to this little experiment.
-Drop me a note, an idea, a patch, a good bottle of wine, anything !
diff --git a/imprint/img/imprint-dusky.png b/imprint/img/imprint-dusky.png
deleted file mode 100644
index 44590c3fb..000000000
--- a/imprint/img/imprint-dusky.png
+++ /dev/null
Binary files differ
diff --git a/imprint/img/imprint-dusky.svg b/imprint/img/imprint-dusky.svg
deleted file mode 100644
index 9919ed3fe..000000000
--- a/imprint/img/imprint-dusky.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
- <title>imprint</title>
- <g opacity=".6" fill="#fff" transform="matrix(.61573 0 0 .47574 .38086 -.49189)">
- <path d="m6.4236 29.693 3.3066-0.47499c0.34101 1.5833 0.88298 2.6916 1.6259 3.3249 0.74292 0.64549 1.7538 0.96824 3.0326 0.96824 1.2423-0.000005 2.2105-0.31666 2.9047-0.94998 0.70638-0.63332 1.0596-1.3762 1.0596-2.2288 0-0.621-0.219-1.193-0.658-1.717-0.755-0.913-2.825-2.405-6.211-4.475-1.8024-1.109-3.063-1.973-3.7816-2.595-0.7063-0.633-1.2849-1.376-1.7355-2.228-0.4506-0.853-0.6759-1.742-0.6759-2.668 0-1.169 0.3653-2.228 1.0961-3.178 0.7307-0.95 1.7355-1.614 3.0143-1.992-0.8647-0.828-1.4736-1.5891-1.8268-2.2833-0.3532-0.7064-0.5298-1.4554-0.5298-2.2471 0-1.5589 0.6089-2.9108 1.8268-4.0556 1.2184-1.1449 2.8314-1.7173 4.8414-1.7173 2.2775 0.0000272 4.0556 0.542 5.3345 1.6259 1.2788 1.084 2.0461 2.6551 2.3019 4.7133l-3.416 0.3472c-0.256-1.4859-0.706-2.5211-1.352-3.1057-0.633-0.5846-1.492-0.8769-2.576-0.8769-1.1205 0.0000245-2.0278 0.3045-2.722 0.91344-0.68204 0.5968-1.0231 1.2606-1.0231 1.9913-0.000006 0.63334 0.21922 1.2179 0.65768 1.7538 0.68203 0.8282 2.5454 2.1679 5.5902 4.0191 1.9121 1.1692 3.2031 2.0278 3.873 2.5759 0.8647 0.73076 1.498 1.4859 1.9 2.2653 0.41407 0.77948 0.62112 1.6259 0.62114 2.5394-0.00002 1.3763-0.44456 2.5515-1.3336 3.5259-0.51154 0.56025-1.4493 1.1266-2.8134 1.699 0.97432 0.74293 1.699 1.5407 2.174 2.3932 0.48715 0.85254 0.73073 1.766 0.73075 2.7403-0.000018 1.0718-0.3045 2.0826-0.91344 3.0326-0.60897 0.96215-1.4859 1.6929-2.6307 2.1922-1.1449 0.51152-2.381 0.76728-3.7086 0.76729-2.3262-0.000008-4.1714-0.58461-5.5354-1.7538-1.3639-1.157-2.1799-2.77-2.4479-4.841m10.687-5.736c0.90124-0.4628 1.5711-0.99869 2.0096-1.6076 0.45061-0.62113 0.67593-1.224 0.67594-1.8086-0.000016-0.6942-0.31667-1.425-0.94998-2.1922-0.64551-0.76728-2.0157-1.7964-4.1105-3.0874-1.6686-1.023-2.9108-1.8634-3.7268-2.5211-0.98652 0.56026-1.6929 1.1205-2.1192 1.6807-0.4141 0.56026-0.62114 1.1814-0.62114 1.8634-0.0000045 0.7673 0.28012 1.498 0.84036 2.1922 0.56024 0.69422 1.8208 1.6198 3.7816 2.7769 1.632 0.96216 3.0387 1.8634 4.2201 2.7038"/>
- </g>
- <g opacity=".7" transform="matrix(.56782 0 0 .45568 -.018833 -.0000091250)">
- <path d="m6.4492 28.518 3.3066-0.47499c0.34101 1.5833 0.88298 2.6916 1.6259 3.3249 0.74292 0.64549 1.7538 0.96824 3.0326 0.96824 1.2423-0.000005 2.2105-0.31666 2.9047-0.94998 0.70638-0.63332 1.0596-1.3762 1.0596-2.2288-0.000015-0.62114-0.21924-1.1936-0.65768-1.7173-0.755-0.914-2.826-2.406-6.211-4.476-1.8029-1.108-3.0635-1.973-3.782-2.594-0.7064-0.634-1.2849-1.377-1.7356-2.229-0.4506-0.853-0.6759-1.742-0.6759-2.667 0-1.17 0.3654-2.229 1.0961-3.179 0.7308-0.95 1.7355-1.614 3.0144-1.991-0.8648-0.8286-1.4737-1.5898-1.8269-2.284-0.3532-0.7064-0.5298-1.4554-0.5298-2.2471 0-1.5589 0.6089-2.9108 1.8269-4.0556 1.2178-1.1448 2.8318-1.7173 4.8408-1.7173 2.278 0.000047264 4.056 0.54202 5.335 1.6259 1.2788 1.084 2.0461 2.6551 2.3019 4.7133l-3.417 0.3472c-0.255-1.4859-0.706-2.5211-1.351-3.1057-0.634-0.5846-1.492-0.8769-2.576-0.8769-1.1205 0.0000246-2.0278 0.3045-2.722 0.91344-0.68204 0.5968-1.0231 1.2606-1.0231 1.9913-0.000006 0.63334 0.21922 1.2179 0.65768 1.7538 0.68202 0.8282 2.5454 2.1679 5.5902 4.0191 1.9121 1.1692 3.2031 2.0278 3.873 2.5759 0.8647 0.73076 1.498 1.4859 1.9 2.2653 0.41407 0.77948 0.62112 1.6259 0.62114 2.5394-0.000019 1.3763-0.44456 2.5515-1.3336 3.5259-0.51154 0.56025-1.4493 1.1266-2.8134 1.699 0.97432 0.74293 1.699 1.5407 2.174 2.3932 0.48715 0.85254 0.73073 1.766 0.73075 2.7403-0.000018 1.0718-0.3045 2.0826-0.91344 3.0326-0.60898 0.96215-1.4859 1.6929-2.6307 2.1923-1.1449 0.51152-2.381 0.76728-3.7086 0.76729-2.3262-0.000008-4.1714-0.58461-5.5354-1.7538-1.3644-1.156-2.1804-2.77-2.4483-4.84m10.687-5.737c0.90124-0.4628 1.5711-0.99869 2.0096-1.6076 0.45061-0.62113 0.67593-1.224 0.67594-1.8086-0.000016-0.6942-0.31667-1.425-0.94998-2.1923-0.64551-0.76728-2.0157-1.7964-4.1105-3.0874-1.6686-1.023-2.9108-1.8634-3.7268-2.5211-0.98652 0.56026-1.6929 1.1205-2.1192 1.6807-0.4141 0.56026-0.62114 1.1814-0.62114 1.8634-0.0000045 0.7673 0.28012 1.498 0.84036 2.1923 0.56024 0.69422 1.8208 1.6198 3.7816 2.7768 1.632 0.96216 3.0387 1.8634 4.2201 2.7038"/>
- </g>
-</svg>
diff --git a/imprint/img/imprint-light.png b/imprint/img/imprint-light.png
deleted file mode 100644
index ec28ad674..000000000
--- a/imprint/img/imprint-light.png
+++ /dev/null
Binary files differ
diff --git a/imprint/img/imprint-light.svg b/imprint/img/imprint-light.svg
deleted file mode 100644
index 41b09b119..000000000
--- a/imprint/img/imprint-light.svg
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="25.6pt" width="25.6pt" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
- <title>imprint</title>
- <defs>
- <font id="font2986" horiz-adv-x="1024">
- <font-face font-family="SVGFont 1" units-per-em="1024"/>
- <missing-glyph d="M0,0h1000v1024h-1000z"/>
- </font>
- </defs>
- <g transform="scale(1.1233 .89021)">
- <path d="m6.4863 28.83 3.3429-0.48019c0.34475 1.6006 0.89266 2.7211 1.6437 3.3614 0.75106 0.65257 1.773 0.97885 3.0659 0.97886 1.2559-0.000005 2.2347-0.32013 2.9366-0.96039 0.71412-0.64026 1.0712-1.3913 1.0712-2.2532-0.000014-0.62795-0.22164-1.2066-0.66488-1.7361-0.7634-0.92345-2.8566-2.4318-6.2795-4.5249-1.8221-1.121-3.0964-1.995-3.8229-2.623-0.7141-0.64-1.2989-1.391-1.7545-2.253s-0.6834-1.761-0.6834-2.697c0-1.182 0.3694-2.253 1.1082-3.213 0.7387-0.961 1.7545-1.632 3.0474-2.013-0.8742-0.8377-1.4899-1.6073-1.8469-2.3091-0.3571-0.7141-0.5356-1.4714-0.5356-2.2717 0-1.576 0.6156-2.9427 1.8469-4.1001 1.2308-1.1574 2.8628-1.7361 4.8938-1.7361 2.303 0.000026613 4.101 0.54794 5.393 1.6437 1.293 1.0959 2.069 2.6842 2.327 4.765l-3.453 0.351c-0.259-1.5022-0.714-2.5487-1.367-3.1398-0.64-0.591-1.508-0.8865-2.604-0.8865-1.1328 0.0000248-2.0501 0.30784-2.7519 0.92345-0.68952 0.60334-1.0343 1.2744-1.0343 2.0131-0.000007 0.64028 0.22162 1.2313 0.66488 1.773 0.6895 0.83728 2.5733 2.1917 5.6515 4.0632 1.9331 1.182 3.2382 2.0501 3.9154 2.6041 0.87418 0.73877 1.5144 1.5022 1.9208 2.2902 0.41861 0.78802 0.62793 1.6438 0.62795 2.5672-0.000019 1.3913-0.44943 2.5795-1.3482 3.5645-0.51715 0.56639-1.4652 1.1389-2.8442 1.7176 0.985 0.75108 1.7176 1.5576 2.1978 2.4194 0.49249 0.86189 0.73874 1.7853 0.73876 2.7704-0.000018 1.0835-0.30783 2.1055-0.92345 3.0659-0.61565 0.9727-1.5022 1.7115-2.6595 2.2163-1.1574 0.51712-2.4071 0.77569-3.7492 0.7757-2.3517-0.000008-4.2171-0.59102-5.5961-1.773-1.3793-1.168-2.2042-2.8-2.4751-4.893m10.805-5.799c0.91112-0.46788 1.5883-1.0096 2.0316-1.6253 0.45555-0.62794 0.68334-1.2374 0.68335-1.8284-0.000016-0.70181-0.32014-1.4406-0.96039-2.2163-0.65259-0.77569-2.0378-1.8161-4.1555-3.1213-1.6868-1.0342-2.9427-1.8838-3.7677-2.5487-0.99733 0.5664-1.7115 1.1328-2.1424 1.6991-0.41864 0.5664-0.62795 1.1943-0.62795 1.8838-0.0000045 0.77571 0.28319 1.5145 0.84957 2.2163 0.56638 0.70183 1.8407 1.6376 3.8231 2.8073 1.6499 0.97271 3.072 1.8838 4.2663 2.7334"/>
- </g>
- <g fill="#fff" transform="scale(1.1233 .89021)">
- <path d="m6.4863 29.279 3.3429-0.48019c0.34475 1.6006 0.89266 2.7211 1.6437 3.3614 0.75106 0.65257 1.773 0.97885 3.0659 0.97886 1.2559-0.000005 2.2347-0.32013 2.9366-0.96039 0.71412-0.64026 1.0712-1.3913 1.0712-2.2532-0.000014-0.62795-0.22164-1.2066-0.66488-1.7361-0.764-0.924-2.857-2.432-6.28-4.525-1.8221-1.121-3.0964-1.995-3.8229-2.623-0.7141-0.64-1.2989-1.391-1.7545-2.253s-0.6834-1.761-0.6834-2.696c0-1.182 0.3694-2.254 1.1082-3.214 0.7387-0.96 1.7545-1.631 3.0474-2.013-0.8742-0.837-1.4899-1.607-1.8469-2.3088-0.3571-0.7141-0.5356-1.4713-0.5356-2.2717 0-1.576 0.6156-2.9427 1.8469-4.1001 1.2308-1.1574 2.8628-1.7361 4.8938-1.7361 2.3025 0.00002753 4.1001 0.54794 5.393 1.6437 1.2928 1.0959 2.0685 2.6842 2.3271 4.765l-3.453 0.351c-0.259-1.5022-0.714-2.5487-1.367-3.1398-0.64-0.591-1.508-0.8865-2.604-0.8865-1.1328 0.0000248-2.0501 0.30784-2.7519 0.92345-0.68952 0.60334-1.0343 1.2744-1.0343 2.0131-0.000007 0.64028 0.22162 1.2313 0.66488 1.773 0.6895 0.83728 2.5733 2.1917 5.6515 4.0632 1.9331 1.182 3.2382 2.0501 3.9154 2.6041 0.87418 0.73877 1.5144 1.5022 1.9208 2.2902 0.41861 0.78802 0.62793 1.6438 0.62795 2.5672-0.000019 1.3913-0.44943 2.5795-1.3482 3.5645-0.51715 0.56639-1.4652 1.1389-2.8442 1.7176 0.985 0.75108 1.7176 1.5576 2.1978 2.4194 0.49249 0.86189 0.73874 1.7853 0.73876 2.7704-0.000018 1.0835-0.30783 2.1055-0.92345 3.0659-0.61565 0.9727-1.5022 1.7115-2.6595 2.2163-1.1574 0.51712-2.4071 0.77569-3.7492 0.7757-2.3517-0.000008-4.2171-0.59102-5.5961-1.773-1.3793-1.169-2.2042-2.8-2.4751-4.894m10.805-5.799c0.91112-0.46788 1.5883-1.0096 2.0316-1.6253 0.45555-0.62794 0.68334-1.2374 0.68335-1.8284-0.000016-0.70181-0.32014-1.4406-0.96039-2.2163-0.65259-0.77569-2.0378-1.8161-4.1555-3.1213-1.6868-1.0342-2.9427-1.8838-3.7677-2.5487-0.99733 0.5664-1.7115 1.1328-2.1424 1.6991-0.41864 0.5664-0.62795 1.1943-0.62795 1.8838-0.0000045 0.77571 0.28319 1.5145 0.84957 2.2163 0.56638 0.70183 1.8407 1.6376 3.8231 2.8073 1.6499 0.97271 3.072 1.8838 4.2663 2.7334"/>
- </g>
-</svg>
diff --git a/imprint/index.php b/imprint/index.php
deleted file mode 100644
index 18976e76e..000000000
--- a/imprint/index.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-/**
-* @package imprint an ownCloud app
-* @author Christian Reiner
-* @copyright 2012-2014 Christian Reiner <foss@christian-reiner.info>
-* @license GNU Affero General Public license (AGPL)
-* @link information http://apps.owncloud.com/content/show.php?content=153220
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the license, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library.
-* If not, see <http://www.gnu.org/licenses/>.
-*
-*/
-
-/**
- * @file index.php
- * This is the apps central view
- * @access public
- * @author Christian Reiner
- */
-
-// Session checks
-\OCP\App::checkAppEnabled('imprint');
-\OCP\Util::addScript('imprint', 'content');
-
-\OCP\App::setActiveNavigationEntry('imprint');
-\OCP\Util::addStyle('imprint', 'reference');
-
-// prepare view
-$tmpl_view = (\OCP\User::isLoggedIn()) ? 'user' : 'guest';
-// fetch content
-$tmpl = new \OCP\Template( 'imprint', 'tmpl_index', $tmpl_view );
-// render template
-$tmpl->printPage ( );
-?>
diff --git a/imprint/js/content.js b/imprint/js/content.js
deleted file mode 100644
index f2d5ec783..000000000
--- a/imprint/js/content.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * @package imprint an ownCloud app
- * @author Christian Reiner
- * @copyright 2012-2014 Christian Reiner <foss@christian-reiner.info>
- * @license GNU Affero General Public license (AGPL)
- * @link information http://apps.owncloud.com/content/show.php?content=153220
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the license, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
- *
- * You should have received a copy of the GNU Affero General Public
- * License along with this library.
- * If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-/**
- * @file js/content.js
- * @brief Client side activity library
- * @author Christian Reiner
- */
-$(window).load(function(){
- var requiredHeight = $(window.frames[0].document).find('body').height();
- $('#imprint-frame').css({height:requiredHeight+'px'});
-});
diff --git a/imprint/js/reference.js b/imprint/js/reference.js
deleted file mode 100644
index f932781a4..000000000
--- a/imprint/js/reference.js
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
-* @package imprint an ownCloud app
-* @author Christian Reiner
-* @copyright 2012-2014 Christian Reiner <foss@christian-reiner.info>
-* @license GNU Affero General Public license (AGPL)
-* @link information http://apps.owncloud.com/content/show.php?content=153220
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the license, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library.
-* If not, see <http://www.gnu.org/licenses/>.
-*
-*/
-
-/**
- * @file js/reference.js
- * @brief Client side activity library
- * @author Christian Reiner
- */
-OC.Imprint = {
- Label: t('imprint',"Legal notice"),
- Target: OC.linkTo('imprint','index.php'),
- View: {
- 'body-user': 'user',
- 'body-settings': 'user',
- 'body-guest': 'guest',
- 'body-public': 'guest',
- 'body-login': 'login'
- }, // View
- Placement: {
- 'user': {
- 'header-left': function(anchor){$('#header a.menutoggle').after(anchor);},
- 'header-right': function(anchor){$('#header form.searchbox').after(anchor);}
- },
- 'guest': {
- 'header-left': function(anchor){$('#header #owncloud').after(anchor);},
- 'header-right': function(anchor){$('#header div.header-right').after(anchor);},
- 'footer-left': function(anchor){$('footer p.info').before(anchor);},
- 'footer-right': function(anchor){$('footer p.info').before(anchor);}
- },
- 'login': {
- 'header-left': function(anchor){$('header div#header').before(anchor);},
- 'header-right': function(anchor){$('header div#header').before(anchor);},
- 'footer-left': function(anchor){$('footer p.info').before(anchor);},
- 'footer-right': function(anchor){$('footer p.info').before(anchor);}
- }
- },
- injectAnchor: function(view,position){
- if (view && position) {
- // create an anchor element (imprint reference)
- var anchor=$('<a />');
- anchor.attr('href',OC.Imprint.Target);
- anchor.text(OC.Imprint.Label);
- anchor.addClass('imprint-anchor').addClass('imprint-view-'+view).addClass('imprint-position-'+position);
- // inject anchor element into DOM
- if (typeof OC.Imprint.Placement[view][position] === 'function') {
- OC.Imprint.Placement[view][position](anchor);
- }
- };
- } // injectAnchor
-}
-
-$(document).ready(function() {
- // extract positioning information from DOM
- var view = OC.Imprint.View[$('body').attr('id')];
- var position = $('head meta[data-imprint-position-'+view+']').attr('data-imprint-position-'+view);
- // inject a reference anchor (imprint link) into the page
- OC.Imprint.injectAnchor(view,position);
-})
diff --git a/imprint/js/settings.js b/imprint/js/settings.js
deleted file mode 100644
index 5ba0a17d7..000000000
--- a/imprint/js/settings.js
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
-* @package imprint an ownCloud app
-* @author Christian Reiner
-* @copyright 2012-2014 Christian Reiner <foss@christian-reiner.info>
-* @license GNU Affero General Public license (AGPL)
-* @link information http://apps.owncloud.com/content/show.php?content=153220
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the license, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library.
-* If not, see <http://www.gnu.org/licenses/>.
-*
-*/
-
-/**
- * @file js/settings.js
- * @brief Handle settings logic
- * @author Christian Reiner
- */
-
-$(document).ready(function(){
- // prepare storing of changed settings
- $('#imprint #imprint-option-position-user').on('change',function(){
- OC.AppConfig.setValue('imprint','position-user',$(this).val());
- })
- $('#imprint #imprint-option-position-guest').on('change',function(){
- OC.AppConfig.setValue('imprint','position-guest',$(this).val());
- })
- $('#imprint #imprint-option-position-login').on('change',function(){
- OC.AppConfig.setValue('imprint','position-login',$(this).val());
- })
- $('#imprint #imprint-option-standalone').on('change',function(){
- OC.AppConfig.setValue('imprint','standalone',$(this).is(':checked'));
- })
- $('#imprint').find('#imprint-content').on('focusout',function(){
- OC.AppConfig.setValue('imprint','content',$(this).val());
- })
-
- // initialize options with stored settings
- OC.AppConfig.getValue('imprint','position-user','',function(data){
- $('#imprint #imprint-option-position-user option[value="'+data+'"]').attr('selected', 'yes')
- });
- OC.AppConfig.getValue('imprint','position-guest','',function(data){
- $('#imprint #imprint-option-position-guest option[value="'+data+'"]').attr('selected', 'yes')
- });
- OC.AppConfig.getValue('imprint','position-login','',function(data){
- $('#imprint #imprint-option-position-login option[value="'+data+'"]').attr('selected', 'yes')
- });
- // checkbox 'standalone'
- OC.AppConfig.getValue('imprint','standalone','',function(data){
- if ('true' === data) {
- $('#imprint #imprint-option-standalone').attr('checked', 'checked');
- } else {
- $('#imprint #imprint-option-standalone').removeAttr('checked');
- }
- });
- OC.AppConfig.getValue('imprint','content','',function(data){
- $('#imprint #imprint-content').html(data);
- });
-})
diff --git a/imprint/l10n/af_ZA.js b/imprint/l10n/af_ZA.js
deleted file mode 100644
index 692932e92..000000000
--- a/imprint/l10n/af_ZA.js
+++ /dev/null
@@ -1,6 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Regs kennisgeving"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/af_ZA.json b/imprint/l10n/af_ZA.json
deleted file mode 100644
index 1f3d95e9d..000000000
--- a/imprint/l10n/af_ZA.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{ "translations": {
- "Legal notice" : "Regs kennisgeving"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/ar.js b/imprint/l10n/ar.js
deleted file mode 100644
index 59e66ddca..000000000
--- a/imprint/l10n/ar.js
+++ /dev/null
@@ -1,13 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "إشعار قانوني",
- "Nothing here yet" : "لا شيئ هنا إلى الآن.",
- "The content of the legal notice has to be configured first" : "يجب أن يتم تهيئة محتوى الإشعار القانوني أولا.",
- "That configuration has to be done by the system administration." : "هذا الإعداد يجب أن يتم بواسطة إدارة النظام.",
- "Imprint" : "الدمغة.",
- "Header left" : "رأس صفحة أيسر",
- "Header right" : "رأس صفحة أيمن",
- "Content" : "المحتوى"
-},
-"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;");
diff --git a/imprint/l10n/ar.json b/imprint/l10n/ar.json
deleted file mode 100644
index bee7f3dbf..000000000
--- a/imprint/l10n/ar.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{ "translations": {
- "Legal notice" : "إشعار قانوني",
- "Nothing here yet" : "لا شيئ هنا إلى الآن.",
- "The content of the legal notice has to be configured first" : "يجب أن يتم تهيئة محتوى الإشعار القانوني أولا.",
- "That configuration has to be done by the system administration." : "هذا الإعداد يجب أن يتم بواسطة إدارة النظام.",
- "Imprint" : "الدمغة.",
- "Header left" : "رأس صفحة أيسر",
- "Header right" : "رأس صفحة أيمن",
- "Content" : "المحتوى"
-},"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
-} \ No newline at end of file
diff --git a/imprint/l10n/ast.js b/imprint/l10n/ast.js
deleted file mode 100644
index 2abe687ef..000000000
--- a/imprint/l10n/ast.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Noticia llegal",
- "Nothing here yet" : "Entá nun hai un res equí",
- "The content of the legal notice has to be configured first" : "El conteníu de la noticia llegal tien de configurase primero",
- "That configuration has to be done by the system administration." : "Esa configuración tien de facese pela alministración del sistema.",
- "Imprint" : "Imprint",
- "Reference" : "Referencia",
- "Header left" : "Testera esquierda",
- "Header right" : "Testera derecha",
- "As guest" : "Como invitáu",
- "Footer left" : "Pie a manzorga",
- "Footer right" : "Pie a mandrecha",
- "At login" : "Al entamu de sesión",
- "Application" : "Aplicación",
- "Content" : "Conteníu",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Puedes utilizar testu ensin formatu, notación markdown o códigu html con atributos d'estilu."
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/ast.json b/imprint/l10n/ast.json
deleted file mode 100644
index 910607b5f..000000000
--- a/imprint/l10n/ast.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Noticia llegal",
- "Nothing here yet" : "Entá nun hai un res equí",
- "The content of the legal notice has to be configured first" : "El conteníu de la noticia llegal tien de configurase primero",
- "That configuration has to be done by the system administration." : "Esa configuración tien de facese pela alministración del sistema.",
- "Imprint" : "Imprint",
- "Reference" : "Referencia",
- "Header left" : "Testera esquierda",
- "Header right" : "Testera derecha",
- "As guest" : "Como invitáu",
- "Footer left" : "Pie a manzorga",
- "Footer right" : "Pie a mandrecha",
- "At login" : "Al entamu de sesión",
- "Application" : "Aplicación",
- "Content" : "Conteníu",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Puedes utilizar testu ensin formatu, notación markdown o códigu html con atributos d'estilu."
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/az.js b/imprint/l10n/az.js
deleted file mode 100644
index ced215bbf..000000000
--- a/imprint/l10n/az.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Qanuni xəbərdarlıq",
- "Nothing here yet" : "Hələki burda heçnə yoxdur",
- "The content of the legal notice has to be configured first" : "Leqal xəbərdarlıq kontenti ilk olaraq config edilməlidir",
- "That configuration has to be done by the system administration." : "Configurasiya sistem inzibatçısı tərəfindən bitdi.",
- "Imprint" : "İşarələmək",
- "Reference" : "Məsləhət",
- "Header left" : "Sol başlıq",
- "Header right" : "Başlıq yetkisi",
- "As guest" : "Qonaq kimi",
- "Footer left" : "Sol altliq",
- "Footer right" : "Sağ altlıq",
- "At login" : "Girişdə",
- "Application" : "Proqram",
- "Content" : "Tərkib",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Siz daxili stril atributları ilə düz mətn, işarə ucuzlaşdırmaları yada html qeydləri istifadə edə bilərsiniz."
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/az.json b/imprint/l10n/az.json
deleted file mode 100644
index 7c0b54f91..000000000
--- a/imprint/l10n/az.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Qanuni xəbərdarlıq",
- "Nothing here yet" : "Hələki burda heçnə yoxdur",
- "The content of the legal notice has to be configured first" : "Leqal xəbərdarlıq kontenti ilk olaraq config edilməlidir",
- "That configuration has to be done by the system administration." : "Configurasiya sistem inzibatçısı tərəfindən bitdi.",
- "Imprint" : "İşarələmək",
- "Reference" : "Məsləhət",
- "Header left" : "Sol başlıq",
- "Header right" : "Başlıq yetkisi",
- "As guest" : "Qonaq kimi",
- "Footer left" : "Sol altliq",
- "Footer right" : "Sağ altlıq",
- "At login" : "Girişdə",
- "Application" : "Proqram",
- "Content" : "Tərkib",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Siz daxili stril atributları ilə düz mətn, işarə ucuzlaşdırmaları yada html qeydləri istifadə edə bilərsiniz."
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/bg_BG.js b/imprint/l10n/bg_BG.js
deleted file mode 100644
index 9be554e5f..000000000
--- a/imprint/l10n/bg_BG.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Правна информация",
- "Nothing here yet" : "Празно е",
- "The content of the legal notice has to be configured first" : "Трябва първо да зададеш правна информация.",
- "That configuration has to be done by the system administration." : "Тази конфигурация трябва да се зададе в административната секция.",
- "Imprint" : "Imprint",
- "Reference" : "Препратка",
- "Header left" : "Ляво заглавие",
- "Header right" : "Дясно заглавие",
- "As guest" : "Като гост",
- "Footer left" : "Ляв футър",
- "Footer right" : "Десен футър",
- "At login" : "По време на вписване",
- "Application" : "Приложение",
- "Content" : "Съдържание",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Можеш да изполваш текст, отбелязваш или да използваш html с inline атрибути."
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/bg_BG.json b/imprint/l10n/bg_BG.json
deleted file mode 100644
index 611dc1008..000000000
--- a/imprint/l10n/bg_BG.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Правна информация",
- "Nothing here yet" : "Празно е",
- "The content of the legal notice has to be configured first" : "Трябва първо да зададеш правна информация.",
- "That configuration has to be done by the system administration." : "Тази конфигурация трябва да се зададе в административната секция.",
- "Imprint" : "Imprint",
- "Reference" : "Препратка",
- "Header left" : "Ляво заглавие",
- "Header right" : "Дясно заглавие",
- "As guest" : "Като гост",
- "Footer left" : "Ляв футър",
- "Footer right" : "Десен футър",
- "At login" : "По време на вписване",
- "Application" : "Приложение",
- "Content" : "Съдържание",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Можеш да изполваш текст, отбелязваш или да използваш html с inline атрибути."
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/bn_BD.js b/imprint/l10n/bn_BD.js
deleted file mode 100644
index c95d1bc5c..000000000
--- a/imprint/l10n/bn_BD.js
+++ /dev/null
@@ -1,10 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "আইনী বিজ্ঞপ্তি",
- "Nothing here yet" : "এখনো এখানে কিছু নেই",
- "The content of the legal notice has to be configured first" : "প্রথমে আইনী বিজ্ঞপ্তির বিষয়বস্তু কনফিগার করতে হবে",
- "Imprint" : "প্রতিচ্ছাপ",
- "Content" : "বিষয়বস্তু"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/bn_BD.json b/imprint/l10n/bn_BD.json
deleted file mode 100644
index 5ca833bcf..000000000
--- a/imprint/l10n/bn_BD.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{ "translations": {
- "Legal notice" : "আইনী বিজ্ঞপ্তি",
- "Nothing here yet" : "এখনো এখানে কিছু নেই",
- "The content of the legal notice has to be configured first" : "প্রথমে আইনী বিজ্ঞপ্তির বিষয়বস্তু কনফিগার করতে হবে",
- "Imprint" : "প্রতিচ্ছাপ",
- "Content" : "বিষয়বস্তু"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/bn_IN.js b/imprint/l10n/bn_IN.js
deleted file mode 100644
index ef52f483a..000000000
--- a/imprint/l10n/bn_IN.js
+++ /dev/null
@@ -1,13 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "লিগ্যাল নোটিশ",
- "Nothing here yet" : "কিছুই এখানে নেই এখনো",
- "The content of the legal notice has to be configured first" : "আইনি নোটিশের কন্টেন্ট প্রথমে কনফিগার করা হবে",
- "That configuration has to be done by the system administration." : "যে কনফিগারেশন সিস্টেম অ্যাডমিনিস্ট্রেশন দ্বারা সম্পন্ন করা হবে।",
- "Imprint" : "অঙ্কিত করা",
- "Header left" : "হেডারের বাম",
- "Header right" : "হেডারের ডান",
- "Content" : "বিষয়বস্তু"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/bn_IN.json b/imprint/l10n/bn_IN.json
deleted file mode 100644
index d1f1d6f00..000000000
--- a/imprint/l10n/bn_IN.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{ "translations": {
- "Legal notice" : "লিগ্যাল নোটিশ",
- "Nothing here yet" : "কিছুই এখানে নেই এখনো",
- "The content of the legal notice has to be configured first" : "আইনি নোটিশের কন্টেন্ট প্রথমে কনফিগার করা হবে",
- "That configuration has to be done by the system administration." : "যে কনফিগারেশন সিস্টেম অ্যাডমিনিস্ট্রেশন দ্বারা সম্পন্ন করা হবে।",
- "Imprint" : "অঙ্কিত করা",
- "Header left" : "হেডারের বাম",
- "Header right" : "হেডারের ডান",
- "Content" : "বিষয়বস্তু"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/ca.js b/imprint/l10n/ca.js
deleted file mode 100644
index 799555da4..000000000
--- a/imprint/l10n/ca.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Nota legal",
- "Nothing here yet" : "Aquí encara no hi ha res",
- "The content of the legal notice has to be configured first" : "Primer heu de configurar el contingut de la nota legal",
- "That configuration has to be done by the system administration." : "Aquesta configuració l'ha de realitzar l'administrador del sistema.",
- "Imprint" : "Imprint",
- "Reference" : "Referència",
- "Header left" : "Encapçalament esquerra",
- "Header right" : "Encapçalament dret",
- "As guest" : "Com convidat",
- "Footer left" : "Costat esquerre del peu",
- "Footer right" : "Costat dret del peu",
- "At login" : "En iniciar sessió",
- "Application" : "Aplicació",
- "Content" : "Contingut",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Pot usar text pla, notació markdown o codi html amb atributs d'estil."
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/ca.json b/imprint/l10n/ca.json
deleted file mode 100644
index 6ff2de0ed..000000000
--- a/imprint/l10n/ca.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Nota legal",
- "Nothing here yet" : "Aquí encara no hi ha res",
- "The content of the legal notice has to be configured first" : "Primer heu de configurar el contingut de la nota legal",
- "That configuration has to be done by the system administration." : "Aquesta configuració l'ha de realitzar l'administrador del sistema.",
- "Imprint" : "Imprint",
- "Reference" : "Referència",
- "Header left" : "Encapçalament esquerra",
- "Header right" : "Encapçalament dret",
- "As guest" : "Com convidat",
- "Footer left" : "Costat esquerre del peu",
- "Footer right" : "Costat dret del peu",
- "At login" : "En iniciar sessió",
- "Application" : "Aplicació",
- "Content" : "Contingut",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Pot usar text pla, notació markdown o codi html amb atributs d'estil."
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/cs_CZ.js b/imprint/l10n/cs_CZ.js
deleted file mode 100644
index d377d4b35..000000000
--- a/imprint/l10n/cs_CZ.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Právní upozornění",
- "Nothing here yet" : "Zatím zde nic není",
- "The content of the legal notice has to be configured first" : "Obsah právního upozornění musí být nejprve nastaven",
- "That configuration has to be done by the system administration." : "Nastavení musí být provedeno ve správě systému.",
- "Imprint" : "Imprint",
- "Reference" : "Zmínka",
- "Header left" : "Záhlaví vlevo",
- "Header right" : "Záhlaví vpravo",
- "As guest" : "Jako host",
- "Footer left" : "Zápatí vlevo",
- "Footer right" : "Zápatí vpravo",
- "At login" : "Při přihlášení",
- "Application" : "Aplikace",
- "Content" : "Obsah",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Můžete použít normální text, zápis ve formátu markdown nebo html s atributy stylů."
-},
-"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;");
diff --git a/imprint/l10n/cs_CZ.json b/imprint/l10n/cs_CZ.json
deleted file mode 100644
index 36dc910da..000000000
--- a/imprint/l10n/cs_CZ.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Právní upozornění",
- "Nothing here yet" : "Zatím zde nic není",
- "The content of the legal notice has to be configured first" : "Obsah právního upozornění musí být nejprve nastaven",
- "That configuration has to be done by the system administration." : "Nastavení musí být provedeno ve správě systému.",
- "Imprint" : "Imprint",
- "Reference" : "Zmínka",
- "Header left" : "Záhlaví vlevo",
- "Header right" : "Záhlaví vpravo",
- "As guest" : "Jako host",
- "Footer left" : "Zápatí vlevo",
- "Footer right" : "Zápatí vpravo",
- "At login" : "Při přihlášení",
- "Application" : "Aplikace",
- "Content" : "Obsah",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Můžete použít normální text, zápis ve formátu markdown nebo html s atributy stylů."
-},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
-} \ No newline at end of file
diff --git a/imprint/l10n/cy_GB.js b/imprint/l10n/cy_GB.js
deleted file mode 100644
index f4fc0ca2f..000000000
--- a/imprint/l10n/cy_GB.js
+++ /dev/null
@@ -1,13 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Hysbysiad cyfreithiol",
- "Nothing here yet" : "Does dim byd yma eto",
- "The content of the legal notice has to be configured first" : "Rhaid cyflunio'r hysbysiad cyfreithiol yn gyntaf",
- "That configuration has to be done by the system administration." : "Rhaid i'r gweinyddwr system gyflunio hwnna.",
- "Imprint" : "Imprint",
- "Header left" : "Pennyn chwith",
- "Header right" : "Pennyn dde",
- "Content" : "Cynnwys"
-},
-"nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;");
diff --git a/imprint/l10n/cy_GB.json b/imprint/l10n/cy_GB.json
deleted file mode 100644
index 166918493..000000000
--- a/imprint/l10n/cy_GB.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{ "translations": {
- "Legal notice" : "Hysbysiad cyfreithiol",
- "Nothing here yet" : "Does dim byd yma eto",
- "The content of the legal notice has to be configured first" : "Rhaid cyflunio'r hysbysiad cyfreithiol yn gyntaf",
- "That configuration has to be done by the system administration." : "Rhaid i'r gweinyddwr system gyflunio hwnna.",
- "Imprint" : "Imprint",
- "Header left" : "Pennyn chwith",
- "Header right" : "Pennyn dde",
- "Content" : "Cynnwys"
-},"pluralForm" :"nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;"
-} \ No newline at end of file
diff --git a/imprint/l10n/da.js b/imprint/l10n/da.js
deleted file mode 100644
index 01e3b2f50..000000000
--- a/imprint/l10n/da.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Juridisk meddelelse",
- "Nothing here yet" : "Her er intet, endnu.",
- "The content of the legal notice has to be configured first" : "Indholdet af den juridiske meddelelse skal først konfigureres",
- "That configuration has to be done by the system administration." : "Denne konfiguration skal foretages af en systemadministrator.",
- "Imprint" : "Aftryk",
- "Reference" : "Reference",
- "Header left" : "Sidehoved venstre",
- "Header right" : "Sidehoved højre",
- "As guest" : "Som gæst",
- "Footer left" : "Sidefod til venstre",
- "Footer right" : "Sidefod til højre",
- "At login" : "Ved login",
- "Application" : "Applikation",
- "Content" : "Indhold",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Du kan anvende ren tekst, markdown-notation eller html-opmærkning med inline-stilattributter."
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/da.json b/imprint/l10n/da.json
deleted file mode 100644
index 803d48b5a..000000000
--- a/imprint/l10n/da.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Juridisk meddelelse",
- "Nothing here yet" : "Her er intet, endnu.",
- "The content of the legal notice has to be configured first" : "Indholdet af den juridiske meddelelse skal først konfigureres",
- "That configuration has to be done by the system administration." : "Denne konfiguration skal foretages af en systemadministrator.",
- "Imprint" : "Aftryk",
- "Reference" : "Reference",
- "Header left" : "Sidehoved venstre",
- "Header right" : "Sidehoved højre",
- "As guest" : "Som gæst",
- "Footer left" : "Sidefod til venstre",
- "Footer right" : "Sidefod til højre",
- "At login" : "Ved login",
- "Application" : "Applikation",
- "Content" : "Indhold",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Du kan anvende ren tekst, markdown-notation eller html-opmærkning med inline-stilattributter."
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/de.js b/imprint/l10n/de.js
deleted file mode 100644
index 4708366c8..000000000
--- a/imprint/l10n/de.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Impressum",
- "Nothing here yet" : "Hier gibt's noch nichts",
- "The content of the legal notice has to be configured first" : "Der Inhalt des Impressums muss zuerst konfiguriert werden",
- "That configuration has to be done by the system administration." : "Diese Konfiguration muss von einem Administrator vorgenommen werden.",
- "Imprint" : "Impressum",
- "Reference" : "Referenz",
- "Header left" : "Kopfzeile links",
- "Header right" : "Kopfzeile rechts",
- "As guest" : "Als Gast",
- "Footer left" : "Fußzeile links",
- "Footer right" : "Fußzeile rechts",
- "At login" : "Beim Anmelden",
- "Application" : "Anwendung",
- "Content" : "Inhalt",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Du kannst einfachen Text, abgeschriebene Notizen oder HTML-Markups mit Inline-Stilattributen verwenden."
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/de.json b/imprint/l10n/de.json
deleted file mode 100644
index d9621fdc9..000000000
--- a/imprint/l10n/de.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Impressum",
- "Nothing here yet" : "Hier gibt's noch nichts",
- "The content of the legal notice has to be configured first" : "Der Inhalt des Impressums muss zuerst konfiguriert werden",
- "That configuration has to be done by the system administration." : "Diese Konfiguration muss von einem Administrator vorgenommen werden.",
- "Imprint" : "Impressum",
- "Reference" : "Referenz",
- "Header left" : "Kopfzeile links",
- "Header right" : "Kopfzeile rechts",
- "As guest" : "Als Gast",
- "Footer left" : "Fußzeile links",
- "Footer right" : "Fußzeile rechts",
- "At login" : "Beim Anmelden",
- "Application" : "Anwendung",
- "Content" : "Inhalt",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Du kannst einfachen Text, abgeschriebene Notizen oder HTML-Markups mit Inline-Stilattributen verwenden."
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/de_DE.js b/imprint/l10n/de_DE.js
deleted file mode 100644
index 627d310f7..000000000
--- a/imprint/l10n/de_DE.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Impressum",
- "Nothing here yet" : "Hier gibt's noch nichts",
- "The content of the legal notice has to be configured first" : "Der Inhalt des Impressums muss zuerst konfiguriert werden",
- "That configuration has to be done by the system administration." : "Diese Konfiguration muss von einem Administrator vorgenommen werden.",
- "Imprint" : "Impressum",
- "Reference" : "Referenz",
- "Header left" : "Kopfzeile links",
- "Header right" : "Kopfzeile rechts",
- "As guest" : "Als Gast",
- "Footer left" : "Fußzeile links",
- "Footer right" : "Fußzeile rechts",
- "At login" : "Beim Anmelden",
- "Application" : "Anwendung",
- "Content" : "Inhalt",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Sie können einfachen Text, abgeschriebene Notizen oder HTML-Markups mit Inline-Stilattributen verwenden."
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/de_DE.json b/imprint/l10n/de_DE.json
deleted file mode 100644
index 5391673d4..000000000
--- a/imprint/l10n/de_DE.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Impressum",
- "Nothing here yet" : "Hier gibt's noch nichts",
- "The content of the legal notice has to be configured first" : "Der Inhalt des Impressums muss zuerst konfiguriert werden",
- "That configuration has to be done by the system administration." : "Diese Konfiguration muss von einem Administrator vorgenommen werden.",
- "Imprint" : "Impressum",
- "Reference" : "Referenz",
- "Header left" : "Kopfzeile links",
- "Header right" : "Kopfzeile rechts",
- "As guest" : "Als Gast",
- "Footer left" : "Fußzeile links",
- "Footer right" : "Fußzeile rechts",
- "At login" : "Beim Anmelden",
- "Application" : "Anwendung",
- "Content" : "Inhalt",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Sie können einfachen Text, abgeschriebene Notizen oder HTML-Markups mit Inline-Stilattributen verwenden."
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/el.js b/imprint/l10n/el.js
deleted file mode 100644
index e587314ab..000000000
--- a/imprint/l10n/el.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Aνακοίνωση νομικού περιεχομένου",
- "Nothing here yet" : " Δεν υπάρχει τίποτα εδώ μέχρι στιγμής",
- "The content of the legal notice has to be configured first" : "Αρχικά πρέπει να διαμορφωθούν τα στοιχεία της ανακοίνωσης νομικού περιεχομένου",
- "That configuration has to be done by the system administration." : "Η διαμόρφωση πρέπει να γίνει από το διαχειριστή του συστήματος. ",
- "Imprint" : "Αποτύπωμα",
- "Reference" : "Παραπομπή",
- "Header left" : "Αριστερή επικεφαλίδα",
- "Header right" : "Δεξιά επικεφαλίδα",
- "As guest" : "Ως επισκέπτης",
- "Footer left" : "Αριστερό υποσέλιδο",
- "Footer right" : "Δεξιό υποσέλιδο",
- "At login" : "Κατά την σύνδεση",
- "Application" : "Εφαρμογή",
- "Content" : "Περιεχόμενο",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Μπορείτε να χρησιμοποιήσετε, απλό κείμενο, γλώσσα σχολιασμού markdown ή HTML με inline CSS "
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/el.json b/imprint/l10n/el.json
deleted file mode 100644
index 22b24deb7..000000000
--- a/imprint/l10n/el.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Aνακοίνωση νομικού περιεχομένου",
- "Nothing here yet" : " Δεν υπάρχει τίποτα εδώ μέχρι στιγμής",
- "The content of the legal notice has to be configured first" : "Αρχικά πρέπει να διαμορφωθούν τα στοιχεία της ανακοίνωσης νομικού περιεχομένου",
- "That configuration has to be done by the system administration." : "Η διαμόρφωση πρέπει να γίνει από το διαχειριστή του συστήματος. ",
- "Imprint" : "Αποτύπωμα",
- "Reference" : "Παραπομπή",
- "Header left" : "Αριστερή επικεφαλίδα",
- "Header right" : "Δεξιά επικεφαλίδα",
- "As guest" : "Ως επισκέπτης",
- "Footer left" : "Αριστερό υποσέλιδο",
- "Footer right" : "Δεξιό υποσέλιδο",
- "At login" : "Κατά την σύνδεση",
- "Application" : "Εφαρμογή",
- "Content" : "Περιεχόμενο",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Μπορείτε να χρησιμοποιήσετε, απλό κείμενο, γλώσσα σχολιασμού markdown ή HTML με inline CSS "
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/en_GB.js b/imprint/l10n/en_GB.js
deleted file mode 100644
index f28007c28..000000000
--- a/imprint/l10n/en_GB.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Legal notice",
- "Nothing here yet" : "Nothing here yet",
- "The content of the legal notice has to be configured first" : "The content of the legal notice has to be configured first",
- "That configuration has to be done by the system administration." : "That configuration has to be done by the system administrator.",
- "Imprint" : "Imprint",
- "Reference" : "Reference",
- "Header left" : "Header left",
- "Header right" : "Header right",
- "As guest" : "As guest",
- "Footer left" : "Footer left",
- "Footer right" : "Footer right",
- "At login" : "At login",
- "Application" : "Application",
- "Content" : "Content",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "You can use plain text, markdown notation or html markup with inline style attributes. "
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/en_GB.json b/imprint/l10n/en_GB.json
deleted file mode 100644
index 8f59ddd16..000000000
--- a/imprint/l10n/en_GB.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Legal notice",
- "Nothing here yet" : "Nothing here yet",
- "The content of the legal notice has to be configured first" : "The content of the legal notice has to be configured first",
- "That configuration has to be done by the system administration." : "That configuration has to be done by the system administrator.",
- "Imprint" : "Imprint",
- "Reference" : "Reference",
- "Header left" : "Header left",
- "Header right" : "Header right",
- "As guest" : "As guest",
- "Footer left" : "Footer left",
- "Footer right" : "Footer right",
- "At login" : "At login",
- "Application" : "Application",
- "Content" : "Content",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "You can use plain text, markdown notation or html markup with inline style attributes. "
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/eo.js b/imprint/l10n/eo.js
deleted file mode 100644
index f0e53faba..000000000
--- a/imprint/l10n/eo.js
+++ /dev/null
@@ -1,15 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Leĝa sciigilo",
- "Nothing here yet" : "Nenio ĉeestas ankoraŭ",
- "The content of the legal notice has to be configured first" : "La enhavo de la leĝa sciigilo devas agordiĝi unue",
- "That configuration has to be done by the system administration." : "Tiun agordon devas fari la sistemadministranto.",
- "Header left" : "Maldekstro de kapo",
- "Header right" : "Dekstro de kapo",
- "As guest" : "Gaste",
- "At login" : "Ĉe ensaluto",
- "Application" : "Aplikaĵo",
- "Content" : "Enhavo"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/eo.json b/imprint/l10n/eo.json
deleted file mode 100644
index 804581041..000000000
--- a/imprint/l10n/eo.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{ "translations": {
- "Legal notice" : "Leĝa sciigilo",
- "Nothing here yet" : "Nenio ĉeestas ankoraŭ",
- "The content of the legal notice has to be configured first" : "La enhavo de la leĝa sciigilo devas agordiĝi unue",
- "That configuration has to be done by the system administration." : "Tiun agordon devas fari la sistemadministranto.",
- "Header left" : "Maldekstro de kapo",
- "Header right" : "Dekstro de kapo",
- "As guest" : "Gaste",
- "At login" : "Ĉe ensaluto",
- "Application" : "Aplikaĵo",
- "Content" : "Enhavo"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/es.js b/imprint/l10n/es.js
deleted file mode 100644
index 578a2d174..000000000
--- a/imprint/l10n/es.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Información legal",
- "Nothing here yet" : "Todavía no hay nada aquí",
- "The content of the legal notice has to be configured first" : "El contenido de la información legal ha de ser configurado primero",
- "That configuration has to be done by the system administration." : "Esta configuración debe hacerse por el administrador del sistema.",
- "Imprint" : "Imprint",
- "Reference" : "Referencia",
- "Header left" : "Encabezado izquierdo",
- "Header right" : "Encabezado derecho",
- "As guest" : "Como invitado",
- "Footer left" : "Lado izquierdo del pie",
- "Footer right" : "Lado derecho del pie",
- "At login" : "Al iniciar sesión",
- "Application" : "Aplicación",
- "Content" : "Contenido",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Puede usar texto plano, notación markdown o código html con atributos de estilo incrustados."
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/es.json b/imprint/l10n/es.json
deleted file mode 100644
index 55776d794..000000000
--- a/imprint/l10n/es.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Información legal",
- "Nothing here yet" : "Todavía no hay nada aquí",
- "The content of the legal notice has to be configured first" : "El contenido de la información legal ha de ser configurado primero",
- "That configuration has to be done by the system administration." : "Esta configuración debe hacerse por el administrador del sistema.",
- "Imprint" : "Imprint",
- "Reference" : "Referencia",
- "Header left" : "Encabezado izquierdo",
- "Header right" : "Encabezado derecho",
- "As guest" : "Como invitado",
- "Footer left" : "Lado izquierdo del pie",
- "Footer right" : "Lado derecho del pie",
- "At login" : "Al iniciar sesión",
- "Application" : "Aplicación",
- "Content" : "Contenido",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Puede usar texto plano, notación markdown o código html con atributos de estilo incrustados."
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/es_AR.js b/imprint/l10n/es_AR.js
deleted file mode 100644
index 1fe62ef04..000000000
--- a/imprint/l10n/es_AR.js
+++ /dev/null
@@ -1,13 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Información Legal",
- "Nothing here yet" : "Todavía no hay nada aquí",
- "The content of the legal notice has to be configured first" : "El contenido acerca de la información legal tiene que ser configurado primero",
- "That configuration has to be done by the system administration." : "Eso tiene que configurarse en administración de sistema.",
- "Imprint" : "Imprint",
- "Header left" : "Encabezado izquierdo",
- "Header right" : "Encabezado derecho",
- "Content" : "Contenido"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/es_AR.json b/imprint/l10n/es_AR.json
deleted file mode 100644
index ab92a8b20..000000000
--- a/imprint/l10n/es_AR.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{ "translations": {
- "Legal notice" : "Información Legal",
- "Nothing here yet" : "Todavía no hay nada aquí",
- "The content of the legal notice has to be configured first" : "El contenido acerca de la información legal tiene que ser configurado primero",
- "That configuration has to be done by the system administration." : "Eso tiene que configurarse en administración de sistema.",
- "Imprint" : "Imprint",
- "Header left" : "Encabezado izquierdo",
- "Header right" : "Encabezado derecho",
- "Content" : "Contenido"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/es_MX.js b/imprint/l10n/es_MX.js
deleted file mode 100644
index 67f3e4081..000000000
--- a/imprint/l10n/es_MX.js
+++ /dev/null
@@ -1,13 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Información legal",
- "Nothing here yet" : "Todavía no hay nada aquí",
- "The content of the legal notice has to be configured first" : "El contenido de la información legal ha de ser configurado primero",
- "That configuration has to be done by the system administration." : "Esta configuración debe hacerse por el administrador del sistema.",
- "Imprint" : "Imprint",
- "Header left" : "Encabezado izquierdo",
- "Header right" : "Encabezado derecho",
- "Content" : "Contenido"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/es_MX.json b/imprint/l10n/es_MX.json
deleted file mode 100644
index 614a601bc..000000000
--- a/imprint/l10n/es_MX.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{ "translations": {
- "Legal notice" : "Información legal",
- "Nothing here yet" : "Todavía no hay nada aquí",
- "The content of the legal notice has to be configured first" : "El contenido de la información legal ha de ser configurado primero",
- "That configuration has to be done by the system administration." : "Esta configuración debe hacerse por el administrador del sistema.",
- "Imprint" : "Imprint",
- "Header left" : "Encabezado izquierdo",
- "Header right" : "Encabezado derecho",
- "Content" : "Contenido"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/et_EE.js b/imprint/l10n/et_EE.js
deleted file mode 100644
index 2179cb9a2..000000000
--- a/imprint/l10n/et_EE.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Õigusalane teave",
- "Nothing here yet" : "Siin pole veel midagi",
- "The content of the legal notice has to be configured first" : "Õigusalase teabe sisu tuleb esmalt seadistada",
- "That configuration has to be done by the system administration." : "Selle peab seadistama süsteemi administraator.",
- "Imprint" : "Impressum",
- "Reference" : "Viide",
- "Header left" : "Vasak päis",
- "Header right" : "Parem päis",
- "As guest" : "Külalisena",
- "Footer left" : "Jalus vasakul",
- "Footer right" : "Jalus paremal",
- "At login" : "Logimisel",
- "Application" : "Rakendus",
- "Content" : "Sisu",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Saad kasutada lihtteksti, märgenditega kirjaviisi või HTML märgendeid koos inline stiili atribuutidega"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/et_EE.json b/imprint/l10n/et_EE.json
deleted file mode 100644
index a0d7a382c..000000000
--- a/imprint/l10n/et_EE.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Õigusalane teave",
- "Nothing here yet" : "Siin pole veel midagi",
- "The content of the legal notice has to be configured first" : "Õigusalase teabe sisu tuleb esmalt seadistada",
- "That configuration has to be done by the system administration." : "Selle peab seadistama süsteemi administraator.",
- "Imprint" : "Impressum",
- "Reference" : "Viide",
- "Header left" : "Vasak päis",
- "Header right" : "Parem päis",
- "As guest" : "Külalisena",
- "Footer left" : "Jalus vasakul",
- "Footer right" : "Jalus paremal",
- "At login" : "Logimisel",
- "Application" : "Rakendus",
- "Content" : "Sisu",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Saad kasutada lihtteksti, märgenditega kirjaviisi või HTML märgendeid koos inline stiili atribuutidega"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/eu.js b/imprint/l10n/eu.js
deleted file mode 100644
index cffdbb518..000000000
--- a/imprint/l10n/eu.js
+++ /dev/null
@@ -1,18 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Lege oharra",
- "Nothing here yet" : "Ezer hemen oraindik",
- "The content of the legal notice has to be configured first" : "Lege oharraren edukia konfiguratu behar da lehenengo",
- "That configuration has to be done by the system administration." : "Konfigurazioa sistema kudeatzaileak egin du.",
- "Imprint" : "Imprint",
- "Header left" : "Ezker goiburua",
- "Header right" : "Eskuin goiburua",
- "As guest" : "Gonbidatu gisa",
- "Footer left" : "Ezker orri oina",
- "Footer right" : "Eskuin orri oina",
- "At login" : "Saioa hasterakoan",
- "Application" : "Aplikazioa",
- "Content" : "Edukia"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/eu.json b/imprint/l10n/eu.json
deleted file mode 100644
index 418117fe7..000000000
--- a/imprint/l10n/eu.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{ "translations": {
- "Legal notice" : "Lege oharra",
- "Nothing here yet" : "Ezer hemen oraindik",
- "The content of the legal notice has to be configured first" : "Lege oharraren edukia konfiguratu behar da lehenengo",
- "That configuration has to be done by the system administration." : "Konfigurazioa sistema kudeatzaileak egin du.",
- "Imprint" : "Imprint",
- "Header left" : "Ezker goiburua",
- "Header right" : "Eskuin goiburua",
- "As guest" : "Gonbidatu gisa",
- "Footer left" : "Ezker orri oina",
- "Footer right" : "Eskuin orri oina",
- "At login" : "Saioa hasterakoan",
- "Application" : "Aplikazioa",
- "Content" : "Edukia"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/fa.js b/imprint/l10n/fa.js
deleted file mode 100644
index e3437dede..000000000
--- a/imprint/l10n/fa.js
+++ /dev/null
@@ -1,17 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "اخطار قانونی",
- "Nothing here yet" : "اینجا هنوز چیزی نیست.",
- "The content of the legal notice has to be configured first" : "محتوی اخطار قانونی ابتدا باید تنظیم شود.",
- "That configuration has to be done by the system administration." : "پیکر بندی باید توسط مدیریت سیستم انجام شود.",
- "Imprint" : "مهر زدن",
- "Reference" : "مرجع",
- "Header left" : "سربرگ سمت چپ",
- "Header right" : "سربرگ سمت راست",
- "As guest" : "به عنوان میهمان",
- "At login" : "در زمان ورود",
- "Application" : "برنامه‌",
- "Content" : "محتوا"
-},
-"nplurals=1; plural=0;");
diff --git a/imprint/l10n/fa.json b/imprint/l10n/fa.json
deleted file mode 100644
index 58dea89aa..000000000
--- a/imprint/l10n/fa.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{ "translations": {
- "Legal notice" : "اخطار قانونی",
- "Nothing here yet" : "اینجا هنوز چیزی نیست.",
- "The content of the legal notice has to be configured first" : "محتوی اخطار قانونی ابتدا باید تنظیم شود.",
- "That configuration has to be done by the system administration." : "پیکر بندی باید توسط مدیریت سیستم انجام شود.",
- "Imprint" : "مهر زدن",
- "Reference" : "مرجع",
- "Header left" : "سربرگ سمت چپ",
- "Header right" : "سربرگ سمت راست",
- "As guest" : "به عنوان میهمان",
- "At login" : "در زمان ورود",
- "Application" : "برنامه‌",
- "Content" : "محتوا"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/imprint/l10n/fi_FI.js b/imprint/l10n/fi_FI.js
deleted file mode 100644
index d9a0fb28b..000000000
--- a/imprint/l10n/fi_FI.js
+++ /dev/null
@@ -1,19 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Lainopillinen huomautus",
- "Nothing here yet" : "Täällä ei ole vielä mitään",
- "The content of the legal notice has to be configured first" : "Lainopillinen huomautus on määriteltävä ensin",
- "That configuration has to be done by the system administration." : "Kyseiset asetukset tulee tehdä järjestelmän ylläpitäjän toimesta.",
- "Imprint" : "Tiedot",
- "Reference" : "Viittaus",
- "Header left" : "Ylätunniste vasen",
- "Header right" : "Ylätunniste oikea",
- "As guest" : "Vieraana",
- "Footer left" : "Alatunniste vasen",
- "Footer right" : "Alatunniste oikea",
- "At login" : "Kirjautuessa",
- "Application" : "Sovellus",
- "Content" : "Sisältö"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/fi_FI.json b/imprint/l10n/fi_FI.json
deleted file mode 100644
index 4f6a6446f..000000000
--- a/imprint/l10n/fi_FI.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{ "translations": {
- "Legal notice" : "Lainopillinen huomautus",
- "Nothing here yet" : "Täällä ei ole vielä mitään",
- "The content of the legal notice has to be configured first" : "Lainopillinen huomautus on määriteltävä ensin",
- "That configuration has to be done by the system administration." : "Kyseiset asetukset tulee tehdä järjestelmän ylläpitäjän toimesta.",
- "Imprint" : "Tiedot",
- "Reference" : "Viittaus",
- "Header left" : "Ylätunniste vasen",
- "Header right" : "Ylätunniste oikea",
- "As guest" : "Vieraana",
- "Footer left" : "Alatunniste vasen",
- "Footer right" : "Alatunniste oikea",
- "At login" : "Kirjautuessa",
- "Application" : "Sovellus",
- "Content" : "Sisältö"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/fr.js b/imprint/l10n/fr.js
deleted file mode 100644
index 55b37541c..000000000
--- a/imprint/l10n/fr.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Mentions légales",
- "Nothing here yet" : "Rien à afficher pour le moment",
- "The content of the legal notice has to be configured first" : "Le contenu des mentions légales doit d'abord être configuré",
- "That configuration has to be done by the system administration." : "Cette configuration doit être effectuée par l'administrateur système.",
- "Imprint" : "Mentions légales",
- "Reference" : "Référence",
- "Header left" : "En-tête gauche",
- "Header right" : "En-tête droit",
- "As guest" : "En tant qu'invité",
- "Footer left" : "Pied de page gauche",
- "Footer right" : "Pied de page droit",
- "At login" : "Au login",
- "Application" : "Application",
- "Content" : "Contenu",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Il est possible d'utiliser du texte brut, de la notation markdown ou du code HTML avec les attributs de style en ligne."
-},
-"nplurals=2; plural=(n > 1);");
diff --git a/imprint/l10n/fr.json b/imprint/l10n/fr.json
deleted file mode 100644
index 99004c27c..000000000
--- a/imprint/l10n/fr.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Mentions légales",
- "Nothing here yet" : "Rien à afficher pour le moment",
- "The content of the legal notice has to be configured first" : "Le contenu des mentions légales doit d'abord être configuré",
- "That configuration has to be done by the system administration." : "Cette configuration doit être effectuée par l'administrateur système.",
- "Imprint" : "Mentions légales",
- "Reference" : "Référence",
- "Header left" : "En-tête gauche",
- "Header right" : "En-tête droit",
- "As guest" : "En tant qu'invité",
- "Footer left" : "Pied de page gauche",
- "Footer right" : "Pied de page droit",
- "At login" : "Au login",
- "Application" : "Application",
- "Content" : "Contenu",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Il est possible d'utiliser du texte brut, de la notation markdown ou du code HTML avec les attributs de style en ligne."
-},"pluralForm" :"nplurals=2; plural=(n > 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/gl.js b/imprint/l10n/gl.js
deleted file mode 100644
index ccdbaedc2..000000000
--- a/imprint/l10n/gl.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Aviso legal",
- "Nothing here yet" : "Aquí aínda non hai nada",
- "The content of the legal notice has to be configured first" : "Primeiro ten que configurar o contido do aviso legal",
- "That configuration has to be done by the system administration." : "Esa configuración ten de ser feita pola administración do sistema.",
- "Imprint" : "Impresión",
- "Reference" : "Referencia",
- "Header left" : "Cabeceira esquerda",
- "Header right" : "Cabeceira dereita",
- "As guest" : "Como convidado",
- "Footer left" : "Rodapé esquerdo",
- "Footer right" : "Rodapé dereito",
- "At login" : "No acceso",
- "Application" : "Aplicación",
- "Content" : "Contido",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Pode empregar texto simple, notación markdown ou marcado HTML con atributos de estilo en liña."
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/gl.json b/imprint/l10n/gl.json
deleted file mode 100644
index 5a9131347..000000000
--- a/imprint/l10n/gl.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Aviso legal",
- "Nothing here yet" : "Aquí aínda non hai nada",
- "The content of the legal notice has to be configured first" : "Primeiro ten que configurar o contido do aviso legal",
- "That configuration has to be done by the system administration." : "Esa configuración ten de ser feita pola administración do sistema.",
- "Imprint" : "Impresión",
- "Reference" : "Referencia",
- "Header left" : "Cabeceira esquerda",
- "Header right" : "Cabeceira dereita",
- "As guest" : "Como convidado",
- "Footer left" : "Rodapé esquerdo",
- "Footer right" : "Rodapé dereito",
- "At login" : "No acceso",
- "Application" : "Aplicación",
- "Content" : "Contido",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Pode empregar texto simple, notación markdown ou marcado HTML con atributos de estilo en liña."
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/he.js b/imprint/l10n/he.js
deleted file mode 100644
index 3dd2a3ac8..000000000
--- a/imprint/l10n/he.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "הערות משפטיות",
- "Nothing here yet" : "אין כאן כלום עדיין",
- "The content of the legal notice has to be configured first" : "יש להגדיר את תוכן ההערות המשפטיות תחילה",
- "That configuration has to be done by the system administration." : "הגדרות אלו ניתנות לשינוי על ידי מנהל המערכת.",
- "Imprint" : "חותמת",
- "Reference" : "סימוכין",
- "Header left" : "כותרת שמאלית",
- "Header right" : "כותרת ימנית",
- "As guest" : "כאורח",
- "Footer left" : "כותרת תחתונה שמאלית",
- "Footer right" : "כותרת תחתונה ימנית",
- "At login" : "בזמן התחברות",
- "Application" : "יישום",
- "Content" : "תוכן",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "ניתן להשתמש בטקסט פשוט, הערת הדגשה או הדגשת html בעיצוב מאפייני שורה. "
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/he.json b/imprint/l10n/he.json
deleted file mode 100644
index 40142c66c..000000000
--- a/imprint/l10n/he.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "הערות משפטיות",
- "Nothing here yet" : "אין כאן כלום עדיין",
- "The content of the legal notice has to be configured first" : "יש להגדיר את תוכן ההערות המשפטיות תחילה",
- "That configuration has to be done by the system administration." : "הגדרות אלו ניתנות לשינוי על ידי מנהל המערכת.",
- "Imprint" : "חותמת",
- "Reference" : "סימוכין",
- "Header left" : "כותרת שמאלית",
- "Header right" : "כותרת ימנית",
- "As guest" : "כאורח",
- "Footer left" : "כותרת תחתונה שמאלית",
- "Footer right" : "כותרת תחתונה ימנית",
- "At login" : "בזמן התחברות",
- "Application" : "יישום",
- "Content" : "תוכן",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "ניתן להשתמש בטקסט פשוט, הערת הדגשה או הדגשת html בעיצוב מאפייני שורה. "
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/hr.js b/imprint/l10n/hr.js
deleted file mode 100644
index 2e22282d4..000000000
--- a/imprint/l10n/hr.js
+++ /dev/null
@@ -1,7 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Pravne obavijesti",
- "Nothing here yet" : "Ovdje nema ničega"
-},
-"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;");
diff --git a/imprint/l10n/hr.json b/imprint/l10n/hr.json
deleted file mode 100644
index e19a048d5..000000000
--- a/imprint/l10n/hr.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{ "translations": {
- "Legal notice" : "Pravne obavijesti",
- "Nothing here yet" : "Ovdje nema ničega"
-},"pluralForm" :"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;"
-} \ No newline at end of file
diff --git a/imprint/l10n/hu_HU.js b/imprint/l10n/hu_HU.js
deleted file mode 100644
index ccc3a4dc9..000000000
--- a/imprint/l10n/hu_HU.js
+++ /dev/null
@@ -1,19 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Jogi nyilatkozat",
- "Nothing here yet" : "Még semmi nincs itt",
- "The content of the legal notice has to be configured first" : "Elsőként a jogi nyilatkozat tartalmát kell meghatározni",
- "That configuration has to be done by the system administration." : "Ezt a konfigurációt a rendszer adminisztráció szekciónál kell beállítani.",
- "Imprint" : "Impresszum",
- "Reference" : "Referencia",
- "Header left" : "Fejléc bal",
- "Header right" : "Fejléc jobb",
- "As guest" : "Vendégként",
- "Footer left" : "Bal lábléc",
- "Footer right" : "Jobb lábléc",
- "At login" : "Bejelentkezéskor",
- "Application" : "Alkalmazás",
- "Content" : "Tartalom"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/hu_HU.json b/imprint/l10n/hu_HU.json
deleted file mode 100644
index 52a98e051..000000000
--- a/imprint/l10n/hu_HU.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{ "translations": {
- "Legal notice" : "Jogi nyilatkozat",
- "Nothing here yet" : "Még semmi nincs itt",
- "The content of the legal notice has to be configured first" : "Elsőként a jogi nyilatkozat tartalmát kell meghatározni",
- "That configuration has to be done by the system administration." : "Ezt a konfigurációt a rendszer adminisztráció szekciónál kell beállítani.",
- "Imprint" : "Impresszum",
- "Reference" : "Referencia",
- "Header left" : "Fejléc bal",
- "Header right" : "Fejléc jobb",
- "As guest" : "Vendégként",
- "Footer left" : "Bal lábléc",
- "Footer right" : "Jobb lábléc",
- "At login" : "Bejelentkezéskor",
- "Application" : "Alkalmazás",
- "Content" : "Tartalom"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/ia.php b/imprint/l10n/ia.php
deleted file mode 100644
index 508b6e7ec..000000000
--- a/imprint/l10n/ia.php
+++ /dev/null
@@ -1,3 +0,0 @@
-<?php $TRANSLATIONS = array(
-"Admin" => "Administration"
-);
diff --git a/imprint/l10n/id.js b/imprint/l10n/id.js
deleted file mode 100644
index f5b0f0809..000000000
--- a/imprint/l10n/id.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Pernyataan hukum",
- "Nothing here yet" : "Masih belum ada isinya",
- "The content of the legal notice has to be configured first" : "Isi pernyataan hukum harus dikonfigurasikan terlebih dulu",
- "That configuration has to be done by the system administration." : "Konfigurasi yang harus dilakukan oleh sistem administrasi.",
- "Imprint" : "Imprint",
- "Reference" : "Referensi",
- "Header left" : "Tajuk kiri",
- "Header right" : "Tajuk kanan",
- "As guest" : "Sebagai tamu",
- "Footer left" : "Kaki kiri",
- "Footer right" : "Kaki kanan",
- "At login" : "Saat masuk",
- "Application" : "Aplikasi",
- "Content" : "Konten",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Anda dapat menggunakan teks biasa, notasi markdown atau markup html dengan atribut gaya inline."
-},
-"nplurals=1; plural=0;");
diff --git a/imprint/l10n/id.json b/imprint/l10n/id.json
deleted file mode 100644
index 23b3f1e2c..000000000
--- a/imprint/l10n/id.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Pernyataan hukum",
- "Nothing here yet" : "Masih belum ada isinya",
- "The content of the legal notice has to be configured first" : "Isi pernyataan hukum harus dikonfigurasikan terlebih dulu",
- "That configuration has to be done by the system administration." : "Konfigurasi yang harus dilakukan oleh sistem administrasi.",
- "Imprint" : "Imprint",
- "Reference" : "Referensi",
- "Header left" : "Tajuk kiri",
- "Header right" : "Tajuk kanan",
- "As guest" : "Sebagai tamu",
- "Footer left" : "Kaki kiri",
- "Footer right" : "Kaki kanan",
- "At login" : "Saat masuk",
- "Application" : "Aplikasi",
- "Content" : "Konten",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Anda dapat menggunakan teks biasa, notasi markdown atau markup html dengan atribut gaya inline."
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/imprint/l10n/is.js b/imprint/l10n/is.js
deleted file mode 100644
index 2e43dc9ab..000000000
--- a/imprint/l10n/is.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Lagaleg atriði",
- "Nothing here yet" : "Ekkert hér ennþá",
- "The content of the legal notice has to be configured first" : "Það þarf fyrst að ganga frá innihaldi lagatæknitextans",
- "That configuration has to be done by the system administration." : "Sú uppsetning þarf að gerast í kerfisstjórnunaraðgerð.",
- "Imprint" : "Prenta",
- "Reference" : "Tilvísun",
- "Header left" : "Síðuhaus til vinstri",
- "Header right" : "Síðuhaus til hægri",
- "As guest" : "Sem gestur",
- "Footer left" : "Síðufótur til vinstri",
- "Footer right" : "Síðufótur til hægri",
- "At login" : "Við innskráningu",
- "Application" : "Forrit",
- "Content" : "Innihald",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Þú getur notað hreinan texta, markdown-merkingar eða html-merki með innfelldum stíleigindum. "
-},
-"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);");
diff --git a/imprint/l10n/is.json b/imprint/l10n/is.json
deleted file mode 100644
index f530df95d..000000000
--- a/imprint/l10n/is.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Lagaleg atriði",
- "Nothing here yet" : "Ekkert hér ennþá",
- "The content of the legal notice has to be configured first" : "Það þarf fyrst að ganga frá innihaldi lagatæknitextans",
- "That configuration has to be done by the system administration." : "Sú uppsetning þarf að gerast í kerfisstjórnunaraðgerð.",
- "Imprint" : "Prenta",
- "Reference" : "Tilvísun",
- "Header left" : "Síðuhaus til vinstri",
- "Header right" : "Síðuhaus til hægri",
- "As guest" : "Sem gestur",
- "Footer left" : "Síðufótur til vinstri",
- "Footer right" : "Síðufótur til hægri",
- "At login" : "Við innskráningu",
- "Application" : "Forrit",
- "Content" : "Innihald",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Þú getur notað hreinan texta, markdown-merkingar eða html-merki með innfelldum stíleigindum. "
-},"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"
-} \ No newline at end of file
diff --git a/imprint/l10n/it.js b/imprint/l10n/it.js
deleted file mode 100644
index dc3d763d1..000000000
--- a/imprint/l10n/it.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Note legali",
- "Nothing here yet" : "Qui ancora niente",
- "The content of the legal notice has to be configured first" : "Il contenuto delle note legali deve essere precedentemente configurato ",
- "That configuration has to be done by the system administration." : "La configurazione deve essere fatta dall'amministrazione di sistema.",
- "Imprint" : "Imprint",
- "Reference" : "Riferimento",
- "Header left" : "Intestazione a sinistra",
- "Header right" : "Intestazione a destra",
- "As guest" : "Come ospite",
- "Footer left" : "Piè di pagina a sinistra",
- "Footer right" : "Piè di pagina a destra",
- "At login" : "All'accesso",
- "Application" : "Applicazione",
- "Content" : "Contenuto",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Puoi utilizzare testo semplice, la notazione Markdown o i contrassegni html con attributi di stile in linea."
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/it.json b/imprint/l10n/it.json
deleted file mode 100644
index 8704ebdfc..000000000
--- a/imprint/l10n/it.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Note legali",
- "Nothing here yet" : "Qui ancora niente",
- "The content of the legal notice has to be configured first" : "Il contenuto delle note legali deve essere precedentemente configurato ",
- "That configuration has to be done by the system administration." : "La configurazione deve essere fatta dall'amministrazione di sistema.",
- "Imprint" : "Imprint",
- "Reference" : "Riferimento",
- "Header left" : "Intestazione a sinistra",
- "Header right" : "Intestazione a destra",
- "As guest" : "Come ospite",
- "Footer left" : "Piè di pagina a sinistra",
- "Footer right" : "Piè di pagina a destra",
- "At login" : "All'accesso",
- "Application" : "Applicazione",
- "Content" : "Contenuto",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Puoi utilizzare testo semplice, la notazione Markdown o i contrassegni html con attributi di stile in linea."
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/ja.js b/imprint/l10n/ja.js
deleted file mode 100644
index c2caa8464..000000000
--- a/imprint/l10n/ja.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "免責事項",
- "Nothing here yet" : "ここにはまだ何もありません",
- "The content of the legal notice has to be configured first" : "免責事項の内容をまず設定しなくてはなりません",
- "That configuration has to be done by the system administration." : "その設定はシステム管理で行う必要があります。",
- "Imprint" : "インプリント",
- "Reference" : "参照",
- "Header left" : "ヘッダの左",
- "Header right" : "ヘッダの右",
- "As guest" : "ゲストとして",
- "Footer left" : "フッターの左",
- "Footer right" : "フッターの右",
- "At login" : "ログイン時",
- "Application" : "アプリケーション",
- "Content" : "内容",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "プレーンテキストかマークダウン表記、インラインスタイル属性のhtmlマークアップが使用できます。"
-},
-"nplurals=1; plural=0;");
diff --git a/imprint/l10n/ja.json b/imprint/l10n/ja.json
deleted file mode 100644
index 71c9b4ab2..000000000
--- a/imprint/l10n/ja.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "免責事項",
- "Nothing here yet" : "ここにはまだ何もありません",
- "The content of the legal notice has to be configured first" : "免責事項の内容をまず設定しなくてはなりません",
- "That configuration has to be done by the system administration." : "その設定はシステム管理で行う必要があります。",
- "Imprint" : "インプリント",
- "Reference" : "参照",
- "Header left" : "ヘッダの左",
- "Header right" : "ヘッダの右",
- "As guest" : "ゲストとして",
- "Footer left" : "フッターの左",
- "Footer right" : "フッターの右",
- "At login" : "ログイン時",
- "Application" : "アプリケーション",
- "Content" : "内容",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "プレーンテキストかマークダウン表記、インラインスタイル属性のhtmlマークアップが使用できます。"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/imprint/l10n/ka_GE.js b/imprint/l10n/ka_GE.js
deleted file mode 100644
index 740bb5e87..000000000
--- a/imprint/l10n/ka_GE.js
+++ /dev/null
@@ -1,13 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "იურიდიული ცნობა",
- "Nothing here yet" : "აქ არაფერი არ არის.",
- "The content of the legal notice has to be configured first" : "საწყის ეტაპზე დააკონფიგურირეთ იურიდიული ცნობის კონტენტი",
- "That configuration has to be done by the system administration." : "ეს კონფიგურაცია უნდა დასრულდეს ადმინისტრაციის მიერ.",
- "Imprint" : "ბეჭედი",
- "Header left" : "სათაური მარცხნივ",
- "Header right" : "სათაური მარჯვნივ",
- "Content" : "კონტენტი"
-},
-"nplurals=1; plural=0;");
diff --git a/imprint/l10n/ka_GE.json b/imprint/l10n/ka_GE.json
deleted file mode 100644
index 97eb569e9..000000000
--- a/imprint/l10n/ka_GE.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{ "translations": {
- "Legal notice" : "იურიდიული ცნობა",
- "Nothing here yet" : "აქ არაფერი არ არის.",
- "The content of the legal notice has to be configured first" : "საწყის ეტაპზე დააკონფიგურირეთ იურიდიული ცნობის კონტენტი",
- "That configuration has to be done by the system administration." : "ეს კონფიგურაცია უნდა დასრულდეს ადმინისტრაციის მიერ.",
- "Imprint" : "ბეჭედი",
- "Header left" : "სათაური მარცხნივ",
- "Header right" : "სათაური მარჯვნივ",
- "Content" : "კონტენტი"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/imprint/l10n/km.js b/imprint/l10n/km.js
deleted file mode 100644
index 3f89dc1b3..000000000
--- a/imprint/l10n/km.js
+++ /dev/null
@@ -1,7 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Nothing here yet" : "នៅ​ទីនេះ​មិន​ទាន់​មាន​អ្វី​ទេ",
- "Content" : "មាតិកា"
-},
-"nplurals=1; plural=0;");
diff --git a/imprint/l10n/km.json b/imprint/l10n/km.json
deleted file mode 100644
index 1506e349f..000000000
--- a/imprint/l10n/km.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{ "translations": {
- "Nothing here yet" : "នៅ​ទីនេះ​មិន​ទាន់​មាន​អ្វី​ទេ",
- "Content" : "មាតិកា"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/imprint/l10n/kn.js b/imprint/l10n/kn.js
deleted file mode 100644
index 16eb8b905..000000000
--- a/imprint/l10n/kn.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "ಕಾನೂನು ಅಧಿಸೂಚನೆಗಳು",
- "Nothing here yet" : "ಇಲ್ಲಿ ಏನೂ ಇಲ್ಲ",
- "The content of the legal notice has to be configured first" : "ಕಾನೂನು ಅಧಿಸೂಚನೆಯನ್ನು ಮೊದಲ ಸಂರಚಿಸಬೇಕಾಗುತ್ತದೆ",
- "That configuration has to be done by the system administration." : "ಸಂರಚನಾ ವ್ಯವಸ್ಥೆಯನ್ನು ನಿರ್ವಾಹಕರು ಸಜ್ಜುಗೊಳಿಸಬೇಕು.",
- "Imprint" : "ಮುದ್ರೆ",
- "Reference" : "ಉಲ್ಲೇಖ",
- "Header left" : "ಎಡ ಶೀರ್ಷಿಕೆ",
- "Header right" : "ಬಲ ಶೀರ್ಷಿಕೆ",
- "As guest" : "ಅತಿಥಿಯಾಗಿ",
- "Footer left" : "ಎಡ ಅಡಿಬರಹ",
- "Footer right" : "ಬಲ ಅಡಿಬರಹ",
- "At login" : "ಪ್ರವೇಶದಲ್ಲಿ",
- "Application" : "ಕಾರ್ಯಕ್ರಮ",
- "Content" : "ವಿಷಯ",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "ನೀವು ಸರಳ ಪಠ್ಯ, HTML ಸಂಕೇತಗಳು ಅಥವಾ ಒಳಸಾಲು-ಶೈಲಿಯ ಲಕ್ಷಣಗಳನ್ನು ಬಳಸಬಹುದು"
-},
-"nplurals=1; plural=0;");
diff --git a/imprint/l10n/kn.json b/imprint/l10n/kn.json
deleted file mode 100644
index 7ad75b6aa..000000000
--- a/imprint/l10n/kn.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "ಕಾನೂನು ಅಧಿಸೂಚನೆಗಳು",
- "Nothing here yet" : "ಇಲ್ಲಿ ಏನೂ ಇಲ್ಲ",
- "The content of the legal notice has to be configured first" : "ಕಾನೂನು ಅಧಿಸೂಚನೆಯನ್ನು ಮೊದಲ ಸಂರಚಿಸಬೇಕಾಗುತ್ತದೆ",
- "That configuration has to be done by the system administration." : "ಸಂರಚನಾ ವ್ಯವಸ್ಥೆಯನ್ನು ನಿರ್ವಾಹಕರು ಸಜ್ಜುಗೊಳಿಸಬೇಕು.",
- "Imprint" : "ಮುದ್ರೆ",
- "Reference" : "ಉಲ್ಲೇಖ",
- "Header left" : "ಎಡ ಶೀರ್ಷಿಕೆ",
- "Header right" : "ಬಲ ಶೀರ್ಷಿಕೆ",
- "As guest" : "ಅತಿಥಿಯಾಗಿ",
- "Footer left" : "ಎಡ ಅಡಿಬರಹ",
- "Footer right" : "ಬಲ ಅಡಿಬರಹ",
- "At login" : "ಪ್ರವೇಶದಲ್ಲಿ",
- "Application" : "ಕಾರ್ಯಕ್ರಮ",
- "Content" : "ವಿಷಯ",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "ನೀವು ಸರಳ ಪಠ್ಯ, HTML ಸಂಕೇತಗಳು ಅಥವಾ ಒಳಸಾಲು-ಶೈಲಿಯ ಲಕ್ಷಣಗಳನ್ನು ಬಳಸಬಹುದು"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/imprint/l10n/ko.js b/imprint/l10n/ko.js
deleted file mode 100644
index 80bb187bd..000000000
--- a/imprint/l10n/ko.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "법적 고지",
- "Nothing here yet" : "아무것도 없습니다",
- "The content of the legal notice has to be configured first" : "법적 고지의 내용을 먼저 설정해야 합니다",
- "That configuration has to be done by the system administration." : "이 설정은 시스템 관리자에 의해 완료되었습니다.",
- "Imprint" : "Imprint",
- "Reference" : "참조",
- "Header left" : "머릿글 왼쪽",
- "Header right" : "머릿글 오른쪽",
- "As guest" : "손님으로",
- "Footer left" : "바닥글 왼쪽",
- "Footer right" : "바닥글 오른쪽",
- "At login" : "로그인 시",
- "Application" : "앱",
- "Content" : "내용",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "일반 텍스트, Markdown 마크업, 인라인 스타일 속성을 사용하는 HTML 마크업을 사용할 수 있습니다."
-},
-"nplurals=1; plural=0;");
diff --git a/imprint/l10n/ko.json b/imprint/l10n/ko.json
deleted file mode 100644
index 9b83c0a79..000000000
--- a/imprint/l10n/ko.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "법적 고지",
- "Nothing here yet" : "아무것도 없습니다",
- "The content of the legal notice has to be configured first" : "법적 고지의 내용을 먼저 설정해야 합니다",
- "That configuration has to be done by the system administration." : "이 설정은 시스템 관리자에 의해 완료되었습니다.",
- "Imprint" : "Imprint",
- "Reference" : "참조",
- "Header left" : "머릿글 왼쪽",
- "Header right" : "머릿글 오른쪽",
- "As guest" : "손님으로",
- "Footer left" : "바닥글 왼쪽",
- "Footer right" : "바닥글 오른쪽",
- "At login" : "로그인 시",
- "Application" : "앱",
- "Content" : "내용",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "일반 텍스트, Markdown 마크업, 인라인 스타일 속성을 사용하는 HTML 마크업을 사용할 수 있습니다."
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/imprint/l10n/ku_IQ.php b/imprint/l10n/ku_IQ.php
deleted file mode 100644
index cd1b6abd4..000000000
--- a/imprint/l10n/ku_IQ.php
+++ /dev/null
@@ -1,3 +0,0 @@
-<?php $TRANSLATIONS = array(
-"Admin" => "به‌ڕێوه‌به‌ری سه‌ره‌كی"
-);
diff --git a/imprint/l10n/lb.js b/imprint/l10n/lb.js
deleted file mode 100644
index d1103a4f3..000000000
--- a/imprint/l10n/lb.js
+++ /dev/null
@@ -1,9 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Imprint" : "Impressum",
- "Reference" : "Referenz",
- "Application" : "Applikatioun",
- "Content" : "Inhalt"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/lb.json b/imprint/l10n/lb.json
deleted file mode 100644
index 093e2f756..000000000
--- a/imprint/l10n/lb.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{ "translations": {
- "Imprint" : "Impressum",
- "Reference" : "Referenz",
- "Application" : "Applikatioun",
- "Content" : "Inhalt"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/lt_LT.js b/imprint/l10n/lt_LT.js
deleted file mode 100644
index 13ec0a771..000000000
--- a/imprint/l10n/lt_LT.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Teisinis pranešimas",
- "Nothing here yet" : "Kol kas čia nieko nėra",
- "The content of the legal notice has to be configured first" : "Pirmiausia turi būti sukonfigūruotas teisinio pranešimo turinys",
- "That configuration has to be done by the system administration." : "Šie nustatymai turi būti atlikti sistemos administratoriaus.",
- "Imprint" : "Imprint",
- "Reference" : "Nuoroda",
- "Header left" : "Antraštė kairėje",
- "Header right" : "Antraštė dešinėje",
- "As guest" : "Kaip svečias",
- "Footer left" : "Poraštė kairėje",
- "Footer right" : "Poraštė dešinėje",
- "At login" : "Prisijungime",
- "Application" : "Programa",
- "Content" : "Turinys",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Galite naudoti įprastą tekstą, markdown arba html žymėjimą su stiliaus atributais."
-},
-"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/imprint/l10n/lt_LT.json b/imprint/l10n/lt_LT.json
deleted file mode 100644
index 09f4ff551..000000000
--- a/imprint/l10n/lt_LT.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Teisinis pranešimas",
- "Nothing here yet" : "Kol kas čia nieko nėra",
- "The content of the legal notice has to be configured first" : "Pirmiausia turi būti sukonfigūruotas teisinio pranešimo turinys",
- "That configuration has to be done by the system administration." : "Šie nustatymai turi būti atlikti sistemos administratoriaus.",
- "Imprint" : "Imprint",
- "Reference" : "Nuoroda",
- "Header left" : "Antraštė kairėje",
- "Header right" : "Antraštė dešinėje",
- "As guest" : "Kaip svečias",
- "Footer left" : "Poraštė kairėje",
- "Footer right" : "Poraštė dešinėje",
- "At login" : "Prisijungime",
- "Application" : "Programa",
- "Content" : "Turinys",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Galite naudoti įprastą tekstą, markdown arba html žymėjimą su stiliaus atributais."
-},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);"
-} \ No newline at end of file
diff --git a/imprint/l10n/lv.js b/imprint/l10n/lv.js
deleted file mode 100644
index e817147a1..000000000
--- a/imprint/l10n/lv.js
+++ /dev/null
@@ -1,7 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Nothing here yet" : "Te neka vēl nav",
- "Content" : "Saturs"
-},
-"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);");
diff --git a/imprint/l10n/lv.json b/imprint/l10n/lv.json
deleted file mode 100644
index 03712a4ff..000000000
--- a/imprint/l10n/lv.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{ "translations": {
- "Nothing here yet" : "Te neka vēl nav",
- "Content" : "Saturs"
-},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"
-} \ No newline at end of file
diff --git a/imprint/l10n/mk.js b/imprint/l10n/mk.js
deleted file mode 100644
index 4d85bd014..000000000
--- a/imprint/l10n/mk.js
+++ /dev/null
@@ -1,11 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Правна забелешка",
- "Nothing here yet" : "Тука сеуште нема ништо",
- "Imprint" : "Печат",
- "Header left" : "Заглавие лево",
- "Header right" : "Заглавие десно",
- "Content" : "Содржина"
-},
-"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;");
diff --git a/imprint/l10n/mk.json b/imprint/l10n/mk.json
deleted file mode 100644
index eb0e8ddb9..000000000
--- a/imprint/l10n/mk.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{ "translations": {
- "Legal notice" : "Правна забелешка",
- "Nothing here yet" : "Тука сеуште нема ништо",
- "Imprint" : "Печат",
- "Header left" : "Заглавие лево",
- "Header right" : "Заглавие десно",
- "Content" : "Содржина"
-},"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"
-} \ No newline at end of file
diff --git a/imprint/l10n/ms_MY.php b/imprint/l10n/ms_MY.php
deleted file mode 100644
index 3a15b5d1f..000000000
--- a/imprint/l10n/ms_MY.php
+++ /dev/null
@@ -1,3 +0,0 @@
-<?php $TRANSLATIONS = array(
-"Admin" => "Admin"
-);
diff --git a/imprint/l10n/my_MM.php b/imprint/l10n/my_MM.php
deleted file mode 100644
index 146cf25c4..000000000
--- a/imprint/l10n/my_MM.php
+++ /dev/null
@@ -1,3 +0,0 @@
-<?php $TRANSLATIONS = array(
-"Admin" => "အက်ဒမင်"
-);
diff --git a/imprint/l10n/nb_NO.js b/imprint/l10n/nb_NO.js
deleted file mode 100644
index ea3cb3607..000000000
--- a/imprint/l10n/nb_NO.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Juridiske merknader",
- "Nothing here yet" : "Ingenting her ennå",
- "The content of the legal notice has to be configured first" : "Innholdet i de juridiske merknadene må konfigureres først",
- "That configuration has to be done by the system administration." : "Den konfigureringen må gjøres av systemadministrasjonen.",
- "Imprint" : "Avtrykk",
- "Reference" : "Referanse",
- "Header left" : "Overskrift venstre",
- "Header right" : "Overskrift høyre",
- "As guest" : "Som gjest",
- "Footer left" : "Bunntekst venstre",
- "Footer right" : "Bunntekst høyre",
- "At login" : "Ved innlogging",
- "Application" : "Applikasjon",
- "Content" : "Innhold",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Du kan bruke ren tekst, markdown-notasjon eller html-format inkludert stil-attributter."
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/nb_NO.json b/imprint/l10n/nb_NO.json
deleted file mode 100644
index e16bde9a8..000000000
--- a/imprint/l10n/nb_NO.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Juridiske merknader",
- "Nothing here yet" : "Ingenting her ennå",
- "The content of the legal notice has to be configured first" : "Innholdet i de juridiske merknadene må konfigureres først",
- "That configuration has to be done by the system administration." : "Den konfigureringen må gjøres av systemadministrasjonen.",
- "Imprint" : "Avtrykk",
- "Reference" : "Referanse",
- "Header left" : "Overskrift venstre",
- "Header right" : "Overskrift høyre",
- "As guest" : "Som gjest",
- "Footer left" : "Bunntekst venstre",
- "Footer right" : "Bunntekst høyre",
- "At login" : "Ved innlogging",
- "Application" : "Applikasjon",
- "Content" : "Innhold",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Du kan bruke ren tekst, markdown-notasjon eller html-format inkludert stil-attributter."
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/nds.js b/imprint/l10n/nds.js
deleted file mode 100644
index b002862fe..000000000
--- a/imprint/l10n/nds.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Rechtlicher Hinweis",
- "Nothing here yet" : "Hier gibt es noch nichts",
- "The content of the legal notice has to be configured first" : "Der Inhalt des rechtlichen Hinweises muss zuerst konfiguriert werden",
- "That configuration has to be done by the system administration." : "Die Konfiguration muss von der Systemverwaltung vorgenommen werden.",
- "Imprint" : "Impressum",
- "Reference" : "Referenz",
- "Header left" : "Kopfbereich links",
- "Header right" : "Kopfbereich rechts",
- "As guest" : "Als Gast",
- "Footer left" : "Fußbereich links",
- "Footer right" : "Fußbereich rechts",
- "At login" : "Bei der Anmeldung",
- "Application" : "Anwendung",
- "Content" : "Inhalt",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Du kannst einfachen Text, Markdown-Notierungen oder HTML Markup mit eingebetten CSS Attributen verwenden."
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/nds.json b/imprint/l10n/nds.json
deleted file mode 100644
index 0868462af..000000000
--- a/imprint/l10n/nds.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Rechtlicher Hinweis",
- "Nothing here yet" : "Hier gibt es noch nichts",
- "The content of the legal notice has to be configured first" : "Der Inhalt des rechtlichen Hinweises muss zuerst konfiguriert werden",
- "That configuration has to be done by the system administration." : "Die Konfiguration muss von der Systemverwaltung vorgenommen werden.",
- "Imprint" : "Impressum",
- "Reference" : "Referenz",
- "Header left" : "Kopfbereich links",
- "Header right" : "Kopfbereich rechts",
- "As guest" : "Als Gast",
- "Footer left" : "Fußbereich links",
- "Footer right" : "Fußbereich rechts",
- "At login" : "Bei der Anmeldung",
- "Application" : "Anwendung",
- "Content" : "Inhalt",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Du kannst einfachen Text, Markdown-Notierungen oder HTML Markup mit eingebetten CSS Attributen verwenden."
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/nl.js b/imprint/l10n/nl.js
deleted file mode 100644
index ceb366e0a..000000000
--- a/imprint/l10n/nl.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Disclaimer",
- "Nothing here yet" : "Nog niets",
- "The content of the legal notice has to be configured first" : "De inhoud van de disclaimer moet eerst worden geconfigureerd",
- "That configuration has to be done by the system administration." : "Deze configuratie moet worden ingesteld door de systeembeheerder.",
- "Imprint" : "afdruk",
- "Reference" : "Verwijs",
- "Header left" : "Kop links",
- "Header right" : "Kop rechts",
- "As guest" : "Als gast",
- "Footer left" : "Voettekst links",
- "Footer right" : "Voettekst rechts",
- "At login" : "Bij inloggen",
- "Application" : "Applicatie",
- "Content" : "Inhoud",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "U kunt gebruik maken van kale tekst, 'markdown' notatie of html-opmaak met ingebedde stijl attributen."
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/nl.json b/imprint/l10n/nl.json
deleted file mode 100644
index 6dda8f959..000000000
--- a/imprint/l10n/nl.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Disclaimer",
- "Nothing here yet" : "Nog niets",
- "The content of the legal notice has to be configured first" : "De inhoud van de disclaimer moet eerst worden geconfigureerd",
- "That configuration has to be done by the system administration." : "Deze configuratie moet worden ingesteld door de systeembeheerder.",
- "Imprint" : "afdruk",
- "Reference" : "Verwijs",
- "Header left" : "Kop links",
- "Header right" : "Kop rechts",
- "As guest" : "Als gast",
- "Footer left" : "Voettekst links",
- "Footer right" : "Voettekst rechts",
- "At login" : "Bij inloggen",
- "Application" : "Applicatie",
- "Content" : "Inhoud",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "U kunt gebruik maken van kale tekst, 'markdown' notatie of html-opmaak met ingebedde stijl attributen."
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/nn_NO.js b/imprint/l10n/nn_NO.js
deleted file mode 100644
index 7e590e396..000000000
--- a/imprint/l10n/nn_NO.js
+++ /dev/null
@@ -1,13 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Juridisk informasjon",
- "Nothing here yet" : "Ingenting her enno",
- "The content of the legal notice has to be configured first" : "Du må skriva inn tekst i den juridiske informasjonen først",
- "That configuration has to be done by the system administration." : "Den konfigurasjonen må gjerast av systemadministrasjonen.",
- "Imprint" : "Impressum",
- "Header left" : "Topptekst, venstre",
- "Header right" : "Topptekst, høgre",
- "Content" : "Innhald"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/nn_NO.json b/imprint/l10n/nn_NO.json
deleted file mode 100644
index d1c3966c0..000000000
--- a/imprint/l10n/nn_NO.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{ "translations": {
- "Legal notice" : "Juridisk informasjon",
- "Nothing here yet" : "Ingenting her enno",
- "The content of the legal notice has to be configured first" : "Du må skriva inn tekst i den juridiske informasjonen først",
- "That configuration has to be done by the system administration." : "Den konfigurasjonen må gjerast av systemadministrasjonen.",
- "Imprint" : "Impressum",
- "Header left" : "Topptekst, venstre",
- "Header right" : "Topptekst, høgre",
- "Content" : "Innhald"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/oc.js b/imprint/l10n/oc.js
deleted file mode 100644
index 2acb2a8c9..000000000
--- a/imprint/l10n/oc.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Mencions legalas",
- "Nothing here yet" : "Res d'afichar pel moment",
- "The content of the legal notice has to be configured first" : "Lo contengut de las mencions legalas deu, d'en primièr, èsser configurat",
- "That configuration has to be done by the system administration." : "Aquesta configuracion deu èsser efectuada per l'administrator del sistèma.",
- "Imprint" : "Mencions legalas",
- "Reference" : "Referéncia",
- "Header left" : "Entèsta esquèrra",
- "Header right" : "Entèsta drecha",
- "As guest" : "En tant que convidat",
- "Footer left" : "Pè de pagina esquèrre",
- "Footer right" : "Pè de pagina drech",
- "At login" : "A la connexion",
- "Application" : "Aplicacion",
- "Content" : "Contengut",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Es possible d'utilizar de tèxte brut, de la notacion markdown o de còde HTML amb los atributs d'estil en linha."
-},
-"nplurals=2; plural=(n > 1);");
diff --git a/imprint/l10n/oc.json b/imprint/l10n/oc.json
deleted file mode 100644
index 64932e865..000000000
--- a/imprint/l10n/oc.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Mencions legalas",
- "Nothing here yet" : "Res d'afichar pel moment",
- "The content of the legal notice has to be configured first" : "Lo contengut de las mencions legalas deu, d'en primièr, èsser configurat",
- "That configuration has to be done by the system administration." : "Aquesta configuracion deu èsser efectuada per l'administrator del sistèma.",
- "Imprint" : "Mencions legalas",
- "Reference" : "Referéncia",
- "Header left" : "Entèsta esquèrra",
- "Header right" : "Entèsta drecha",
- "As guest" : "En tant que convidat",
- "Footer left" : "Pè de pagina esquèrre",
- "Footer right" : "Pè de pagina drech",
- "At login" : "A la connexion",
- "Application" : "Aplicacion",
- "Content" : "Contengut",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Es possible d'utilizar de tèxte brut, de la notacion markdown o de còde HTML amb los atributs d'estil en linha."
-},"pluralForm" :"nplurals=2; plural=(n > 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/pl.js b/imprint/l10n/pl.js
deleted file mode 100644
index 03731df39..000000000
--- a/imprint/l10n/pl.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Informacja prawna",
- "Nothing here yet" : "Nic tu jeszcze nie ma",
- "The content of the legal notice has to be configured first" : "Zawartość noty prawnej musi być skonfigurowana najpierw",
- "That configuration has to be done by the system administration." : "Ta konfiguracja musi być wykonana w administracji systemem.",
- "Imprint" : "Stopka",
- "Reference" : "Referencja",
- "Header left" : "Lewy nagłowek",
- "Header right" : "Prawy nagłówek",
- "As guest" : "Jako gość",
- "Footer left" : "Lewa stopka",
- "Footer right" : "Prawa stopka",
- "At login" : "Jako użytkownik",
- "Application" : "Aplikacje",
- "Content" : "Treść",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Możesz użyć czystego tekstu, znakowania lub znaczników html z atrybutami stylów"
-},
-"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/imprint/l10n/pl.json b/imprint/l10n/pl.json
deleted file mode 100644
index c542304c4..000000000
--- a/imprint/l10n/pl.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Informacja prawna",
- "Nothing here yet" : "Nic tu jeszcze nie ma",
- "The content of the legal notice has to be configured first" : "Zawartość noty prawnej musi być skonfigurowana najpierw",
- "That configuration has to be done by the system administration." : "Ta konfiguracja musi być wykonana w administracji systemem.",
- "Imprint" : "Stopka",
- "Reference" : "Referencja",
- "Header left" : "Lewy nagłowek",
- "Header right" : "Prawy nagłówek",
- "As guest" : "Jako gość",
- "Footer left" : "Lewa stopka",
- "Footer right" : "Prawa stopka",
- "At login" : "Jako użytkownik",
- "Application" : "Aplikacje",
- "Content" : "Treść",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Możesz użyć czystego tekstu, znakowania lub znaczników html z atrybutami stylów"
-},"pluralForm" :"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
-} \ No newline at end of file
diff --git a/imprint/l10n/pt_BR.js b/imprint/l10n/pt_BR.js
deleted file mode 100644
index 52cf87095..000000000
--- a/imprint/l10n/pt_BR.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Aviso legal",
- "Nothing here yet" : "Nada aqui ainda",
- "The content of the legal notice has to be configured first" : "O conteúdo do aviso legal deve ser configurado primeiro",
- "That configuration has to be done by the system administration." : "Esta configuração deverá ser feita pela administração do sistema.",
- "Imprint" : "Marca",
- "Reference" : "Referência",
- "Header left" : "Cabeçalho esquerdo",
- "Header right" : "Cabeçalho direito",
- "As guest" : "Como convidado",
- "Footer left" : "Rodapé esquerdo",
- "Footer right" : "Redapé direito",
- "At login" : "No login",
- "Application" : "Aplicação",
- "Content" : "Conteúdo",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Você pode usar texto simples, notação de remarcação ou marcação html com atributos de estilo sequencial."
-},
-"nplurals=2; plural=(n > 1);");
diff --git a/imprint/l10n/pt_BR.json b/imprint/l10n/pt_BR.json
deleted file mode 100644
index 169db7a7f..000000000
--- a/imprint/l10n/pt_BR.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Aviso legal",
- "Nothing here yet" : "Nada aqui ainda",
- "The content of the legal notice has to be configured first" : "O conteúdo do aviso legal deve ser configurado primeiro",
- "That configuration has to be done by the system administration." : "Esta configuração deverá ser feita pela administração do sistema.",
- "Imprint" : "Marca",
- "Reference" : "Referência",
- "Header left" : "Cabeçalho esquerdo",
- "Header right" : "Cabeçalho direito",
- "As guest" : "Como convidado",
- "Footer left" : "Rodapé esquerdo",
- "Footer right" : "Redapé direito",
- "At login" : "No login",
- "Application" : "Aplicação",
- "Content" : "Conteúdo",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Você pode usar texto simples, notação de remarcação ou marcação html com atributos de estilo sequencial."
-},"pluralForm" :"nplurals=2; plural=(n > 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/pt_PT.js b/imprint/l10n/pt_PT.js
deleted file mode 100644
index c83f7d74c..000000000
--- a/imprint/l10n/pt_PT.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Notificação Legal",
- "Nothing here yet" : "Nada aqui por enquanto",
- "The content of the legal notice has to be configured first" : "Primeiro, deve configurar o conteúdo da notificação legal",
- "That configuration has to be done by the system administration." : "A configuração deve ser efetuada pelo administrador do sistema.",
- "Imprint" : "Imprint",
- "Reference" : "Referência",
- "Header left" : "Cabeçalho à Esquerda",
- "Header right" : "Cabeçalho à Direita",
- "As guest" : "Como convidado",
- "Footer left" : "Rodapé à Esquerda",
- "Footer right" : "Rodapé à Direita",
- "At login" : "Ao iniciar a sessão",
- "Application" : "Aplicação",
- "Content" : "Conteúdo",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Pode usar texto simples, notação de remarcação ou marcação html com atributos de estilo em linha."
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/pt_PT.json b/imprint/l10n/pt_PT.json
deleted file mode 100644
index 4c8ed7c05..000000000
--- a/imprint/l10n/pt_PT.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Notificação Legal",
- "Nothing here yet" : "Nada aqui por enquanto",
- "The content of the legal notice has to be configured first" : "Primeiro, deve configurar o conteúdo da notificação legal",
- "That configuration has to be done by the system administration." : "A configuração deve ser efetuada pelo administrador do sistema.",
- "Imprint" : "Imprint",
- "Reference" : "Referência",
- "Header left" : "Cabeçalho à Esquerda",
- "Header right" : "Cabeçalho à Direita",
- "As guest" : "Como convidado",
- "Footer left" : "Rodapé à Esquerda",
- "Footer right" : "Rodapé à Direita",
- "At login" : "Ao iniciar a sessão",
- "Application" : "Aplicação",
- "Content" : "Conteúdo",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Pode usar texto simples, notação de remarcação ou marcação html com atributos de estilo em linha."
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/ro.js b/imprint/l10n/ro.js
deleted file mode 100644
index 824996ade..000000000
--- a/imprint/l10n/ro.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Înștiințare legală",
- "Nothing here yet" : "Nimic aici. Încarcă ceva!",
- "The content of the legal notice has to be configured first" : "Conținutul înștiințării legale trebuie mai întâi configurat",
- "That configuration has to be done by the system administration." : "Această configurare trebuie făcută de un administrator de sistem.",
- "Imprint" : "Imprint",
- "Reference" : "Referință",
- "Header left" : "Antet stânga",
- "Header right" : "Antet dreapta",
- "As guest" : "Ca vizitator",
- "Footer left" : "Subsol stânga",
- "Footer right" : "Subsol dreapta",
- "At login" : "La autentificare",
- "Application" : "Aplicație",
- "Content" : "Conținut",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Poți folosi text simplu, notație markdown sau format html cu atribute de stil incluse."
-},
-"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));");
diff --git a/imprint/l10n/ro.json b/imprint/l10n/ro.json
deleted file mode 100644
index 44b21dcaa..000000000
--- a/imprint/l10n/ro.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Înștiințare legală",
- "Nothing here yet" : "Nimic aici. Încarcă ceva!",
- "The content of the legal notice has to be configured first" : "Conținutul înștiințării legale trebuie mai întâi configurat",
- "That configuration has to be done by the system administration." : "Această configurare trebuie făcută de un administrator de sistem.",
- "Imprint" : "Imprint",
- "Reference" : "Referință",
- "Header left" : "Antet stânga",
- "Header right" : "Antet dreapta",
- "As guest" : "Ca vizitator",
- "Footer left" : "Subsol stânga",
- "Footer right" : "Subsol dreapta",
- "At login" : "La autentificare",
- "Application" : "Aplicație",
- "Content" : "Conținut",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Poți folosi text simplu, notație markdown sau format html cu atribute de stil incluse."
-},"pluralForm" :"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"
-} \ No newline at end of file
diff --git a/imprint/l10n/ru.js b/imprint/l10n/ru.js
deleted file mode 100644
index a4e7736a3..000000000
--- a/imprint/l10n/ru.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Юридическое уведомление",
- "Nothing here yet" : "Пока ничего нет",
- "The content of the legal notice has to be configured first" : "Сначала следует задать содержимое юридического уведомления",
- "That configuration has to be done by the system administration." : "Эту конфигурацию должен сделать системный администратор",
- "Imprint" : "Штамп",
- "Reference" : "Ссылка",
- "Header left" : "Заголовок слева",
- "Header right" : "Заголовок справа",
- "As guest" : "Как гость",
- "Footer left" : "Низ страницы слева",
- "Footer right" : "Низ страницы справа",
- "At login" : "При логине",
- "Application" : "Приложение",
- "Content" : "Содержимое",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Вы можете использовать простой текст, нотацию markdown или разметку HTML со встроенными стилями в атрибутах тегов."
-},
-"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);");
diff --git a/imprint/l10n/ru.json b/imprint/l10n/ru.json
deleted file mode 100644
index 697580fb6..000000000
--- a/imprint/l10n/ru.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Юридическое уведомление",
- "Nothing here yet" : "Пока ничего нет",
- "The content of the legal notice has to be configured first" : "Сначала следует задать содержимое юридического уведомления",
- "That configuration has to be done by the system administration." : "Эту конфигурацию должен сделать системный администратор",
- "Imprint" : "Штамп",
- "Reference" : "Ссылка",
- "Header left" : "Заголовок слева",
- "Header right" : "Заголовок справа",
- "As guest" : "Как гость",
- "Footer left" : "Низ страницы слева",
- "Footer right" : "Низ страницы справа",
- "At login" : "При логине",
- "Application" : "Приложение",
- "Content" : "Содержимое",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Вы можете использовать простой текст, нотацию markdown или разметку HTML со встроенными стилями в атрибутах тегов."
-},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
-} \ No newline at end of file
diff --git a/imprint/l10n/si_LK.php b/imprint/l10n/si_LK.php
deleted file mode 100644
index 91cf5df8a..000000000
--- a/imprint/l10n/si_LK.php
+++ /dev/null
@@ -1,3 +0,0 @@
-<?php $TRANSLATIONS = array(
-"Admin" => "පරිපාලක"
-);
diff --git a/imprint/l10n/sk_SK.js b/imprint/l10n/sk_SK.js
deleted file mode 100644
index e0dfe2655..000000000
--- a/imprint/l10n/sk_SK.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Právne informácie",
- "Nothing here yet" : "Ešte tu nič nie je",
- "The content of the legal notice has to be configured first" : "Najskôr musíte nastaviť obsah právnych informácií",
- "That configuration has to be done by the system administration." : "Nastavenie musí byť vykonané administrátorom systému.",
- "Imprint" : "Podmienky používania",
- "Reference" : "Referencia",
- "Header left" : "V hlavičke vľavo",
- "Header right" : "V hlavičke vpravo",
- "As guest" : "Ako hosť",
- "Footer left" : "Päta vľavo",
- "Footer right" : "Päta vpravo",
- "At login" : "Pri prihlasovaní",
- "Application" : "Aplikácia",
- "Content" : "Obsah",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Môžete použiť obyčajný text, formátovaný zápis alebo html formátovanie. "
-},
-"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;");
diff --git a/imprint/l10n/sk_SK.json b/imprint/l10n/sk_SK.json
deleted file mode 100644
index e9524249c..000000000
--- a/imprint/l10n/sk_SK.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Právne informácie",
- "Nothing here yet" : "Ešte tu nič nie je",
- "The content of the legal notice has to be configured first" : "Najskôr musíte nastaviť obsah právnych informácií",
- "That configuration has to be done by the system administration." : "Nastavenie musí byť vykonané administrátorom systému.",
- "Imprint" : "Podmienky používania",
- "Reference" : "Referencia",
- "Header left" : "V hlavičke vľavo",
- "Header right" : "V hlavičke vpravo",
- "As guest" : "Ako hosť",
- "Footer left" : "Päta vľavo",
- "Footer right" : "Päta vpravo",
- "At login" : "Pri prihlasovaní",
- "Application" : "Aplikácia",
- "Content" : "Obsah",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Môžete použiť obyčajný text, formátovaný zápis alebo html formátovanie. "
-},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
-} \ No newline at end of file
diff --git a/imprint/l10n/sl.js b/imprint/l10n/sl.js
deleted file mode 100644
index 8fd2becfa..000000000
--- a/imprint/l10n/sl.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Pravno obvestilo",
- "Nothing here yet" : "Ni še vsebine",
- "The content of the legal notice has to be configured first" : "Najprej je treba nastaviti vsebino pravnega obvestila",
- "That configuration has to be done by the system administration." : "Te nastavitve lahko spreminja le skrbnik sistema.",
- "Imprint" : "Natis",
- "Reference" : "Sklic",
- "Header left" : "Leva glava",
- "Header right" : "Desna glava",
- "As guest" : "Kot gost",
- "Footer left" : "Leva noga",
- "Footer right" : "Desna noga",
- "At login" : "Pri prijavi",
- "Application" : "Program",
- "Content" : "Vsebina",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Uporabiti je mogoče le besedilo, označene opombe ali pa oblikovanje HTML z atributi navedenimi v vmesnih slogih."
-},
-"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);");
diff --git a/imprint/l10n/sl.json b/imprint/l10n/sl.json
deleted file mode 100644
index 44d7d242d..000000000
--- a/imprint/l10n/sl.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Pravno obvestilo",
- "Nothing here yet" : "Ni še vsebine",
- "The content of the legal notice has to be configured first" : "Najprej je treba nastaviti vsebino pravnega obvestila",
- "That configuration has to be done by the system administration." : "Te nastavitve lahko spreminja le skrbnik sistema.",
- "Imprint" : "Natis",
- "Reference" : "Sklic",
- "Header left" : "Leva glava",
- "Header right" : "Desna glava",
- "As guest" : "Kot gost",
- "Footer left" : "Leva noga",
- "Footer right" : "Desna noga",
- "At login" : "Pri prijavi",
- "Application" : "Program",
- "Content" : "Vsebina",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Uporabiti je mogoče le besedilo, označene opombe ali pa oblikovanje HTML z atributi navedenimi v vmesnih slogih."
-},"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"
-} \ No newline at end of file
diff --git a/imprint/l10n/sq.js b/imprint/l10n/sq.js
deleted file mode 100644
index 556f02f07..000000000
--- a/imprint/l10n/sq.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Shënim ligjor",
- "Nothing here yet" : "Asgjë këtu ende",
- "The content of the legal notice has to be configured first" : "Lënda e shënimit ligjor së pari duhet të jetë formësuar",
- "That configuration has to be done by the system administration." : "Ai formësim duhet bërë nga përgjegjësi i sistemit.",
- "Imprint" : "Imprint",
- "Reference" : "Referencë",
- "Header left" : "Kryet majtas",
- "Header right" : "Kryet djathtas",
- "As guest" : "Si mysafir",
- "Footer left" : "Poshtëshënim majtas",
- "Footer right" : "Poshtëshënim djathtas",
- "At login" : "Në hyrje",
- "Application" : "Aplikacion",
- "Content" : "Lëndë",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Mund të përdorni tekst të thjeshtë, shënime Markdown ose HTML me atribute stilistike brendazi."
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/sq.json b/imprint/l10n/sq.json
deleted file mode 100644
index 26142ebbf..000000000
--- a/imprint/l10n/sq.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Shënim ligjor",
- "Nothing here yet" : "Asgjë këtu ende",
- "The content of the legal notice has to be configured first" : "Lënda e shënimit ligjor së pari duhet të jetë formësuar",
- "That configuration has to be done by the system administration." : "Ai formësim duhet bërë nga përgjegjësi i sistemit.",
- "Imprint" : "Imprint",
- "Reference" : "Referencë",
- "Header left" : "Kryet majtas",
- "Header right" : "Kryet djathtas",
- "As guest" : "Si mysafir",
- "Footer left" : "Poshtëshënim majtas",
- "Footer right" : "Poshtëshënim djathtas",
- "At login" : "Në hyrje",
- "Application" : "Aplikacion",
- "Content" : "Lëndë",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Mund të përdorni tekst të thjeshtë, shënime Markdown ose HTML me atribute stilistike brendazi."
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/sr.js b/imprint/l10n/sr.js
deleted file mode 100644
index 2d9ddb729..000000000
--- a/imprint/l10n/sr.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Правно обавештење",
- "Nothing here yet" : "Овде још увек нема ничега",
- "The content of the legal notice has to be configured first" : "Прво треба подесити садржај правног обавештења",
- "That configuration has to be done by the system administration." : "То подешавање треба да обави систем администратор.",
- "Imprint" : "Жиг",
- "Reference" : "Препорука",
- "Header left" : "Заглавље лево",
- "Header right" : "Заглавље десно",
- "As guest" : "Као гост",
- "Footer left" : "Подножје лево",
- "Footer right" : "Подножје десно",
- "At login" : "При пријави",
- "Application" : "Апликација",
- "Content" : "Садржај",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Можете користити обичан текст, маркдаун запис или хипертекст ознаке са линијским атрибутима стила."
-},
-"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/imprint/l10n/sr.json b/imprint/l10n/sr.json
deleted file mode 100644
index f9a5db0fb..000000000
--- a/imprint/l10n/sr.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Правно обавештење",
- "Nothing here yet" : "Овде још увек нема ничега",
- "The content of the legal notice has to be configured first" : "Прво треба подесити садржај правног обавештења",
- "That configuration has to be done by the system administration." : "То подешавање треба да обави систем администратор.",
- "Imprint" : "Жиг",
- "Reference" : "Препорука",
- "Header left" : "Заглавље лево",
- "Header right" : "Заглавље десно",
- "As guest" : "Као гост",
- "Footer left" : "Подножје лево",
- "Footer right" : "Подножје десно",
- "At login" : "При пријави",
- "Application" : "Апликација",
- "Content" : "Садржај",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Можете користити обичан текст, маркдаун запис или хипертекст ознаке са линијским атрибутима стила."
-},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
-} \ No newline at end of file
diff --git a/imprint/l10n/sr@latin.js b/imprint/l10n/sr@latin.js
deleted file mode 100644
index 1fbe7f5b8..000000000
--- a/imprint/l10n/sr@latin.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Pravno obaveštenje",
- "Nothing here yet" : "Ovde još uvek nema ničega",
- "The content of the legal notice has to be configured first" : "Prvo treba podesiti sadržaj pravnog obaveštenja",
- "That configuration has to be done by the system administration." : "To podešavanje treba da obavi sistem administrator.",
- "Imprint" : "Žig",
- "Reference" : "Preporuka",
- "Header left" : "Zaglavlje levo",
- "Header right" : "Zaglavlje desno",
- "As guest" : "Kao gost",
- "Footer left" : "Podnožje levo",
- "Footer right" : "Podnožje desno",
- "At login" : "Pri prijavi",
- "Application" : "Aplikacija",
- "Content" : "Sadržaj",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Možete koristiti običan tekst, markdaun zapis ili hipertekst oznake sa linijskim atributima stila."
-},
-"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/imprint/l10n/sr@latin.json b/imprint/l10n/sr@latin.json
deleted file mode 100644
index 39a4f713d..000000000
--- a/imprint/l10n/sr@latin.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Pravno obaveštenje",
- "Nothing here yet" : "Ovde još uvek nema ničega",
- "The content of the legal notice has to be configured first" : "Prvo treba podesiti sadržaj pravnog obaveštenja",
- "That configuration has to be done by the system administration." : "To podešavanje treba da obavi sistem administrator.",
- "Imprint" : "Žig",
- "Reference" : "Preporuka",
- "Header left" : "Zaglavlje levo",
- "Header right" : "Zaglavlje desno",
- "As guest" : "Kao gost",
- "Footer left" : "Podnožje levo",
- "Footer right" : "Podnožje desno",
- "At login" : "Pri prijavi",
- "Application" : "Aplikacija",
- "Content" : "Sadržaj",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Možete koristiti običan tekst, markdaun zapis ili hipertekst oznake sa linijskim atributima stila."
-},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
-} \ No newline at end of file
diff --git a/imprint/l10n/sv.js b/imprint/l10n/sv.js
deleted file mode 100644
index 5c06100a5..000000000
--- a/imprint/l10n/sv.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Rättsligt meddelande",
- "Nothing here yet" : "Ingenting här än",
- "The content of the legal notice has to be configured first" : "Innehållet i de rättsliga meddelandet måste först ha konfigurerats",
- "That configuration has to be done by the system administration." : "Den konfigureringen måste göras av systemadministratören.",
- "Imprint" : "Imprint",
- "Reference" : "Referens",
- "Header left" : "Sidhuvud vänster",
- "Header right" : "Sidhuvud höger",
- "As guest" : "Som gäst",
- "Footer left" : "Sidfot vänster",
- "Footer right" : "Sidfotd höger",
- "At login" : "Vid inloggning",
- "Application" : "Applikation",
- "Content" : "Innehåll",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Du kan använda vanlig text, markdown notation eller HTML"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/imprint/l10n/sv.json b/imprint/l10n/sv.json
deleted file mode 100644
index 6a5d1a004..000000000
--- a/imprint/l10n/sv.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Rättsligt meddelande",
- "Nothing here yet" : "Ingenting här än",
- "The content of the legal notice has to be configured first" : "Innehållet i de rättsliga meddelandet måste först ha konfigurerats",
- "That configuration has to be done by the system administration." : "Den konfigureringen måste göras av systemadministratören.",
- "Imprint" : "Imprint",
- "Reference" : "Referens",
- "Header left" : "Sidhuvud vänster",
- "Header right" : "Sidhuvud höger",
- "As guest" : "Som gäst",
- "Footer left" : "Sidfot vänster",
- "Footer right" : "Sidfotd höger",
- "At login" : "Vid inloggning",
- "Application" : "Applikation",
- "Content" : "Innehåll",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Du kan använda vanlig text, markdown notation eller HTML"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/ta_LK.php b/imprint/l10n/ta_LK.php
deleted file mode 100644
index efebd7f72..000000000
--- a/imprint/l10n/ta_LK.php
+++ /dev/null
@@ -1,3 +0,0 @@
-<?php $TRANSLATIONS = array(
-"Admin" => "நிர்வாகம்"
-);
diff --git a/imprint/l10n/th_TH.js b/imprint/l10n/th_TH.js
deleted file mode 100644
index e95145e27..000000000
--- a/imprint/l10n/th_TH.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "ประกาศด้านกฎหมาย",
- "Nothing here yet" : "ไม่มีอะไรเลยที่นี่",
- "The content of the legal notice has to be configured first" : "เนื้อหาของประกาศตามกฎหมายจะต้องมีการกำหนดค่าก่อน",
- "That configuration has to be done by the system administration." : "การกำหนดค่าจะต้องดำเนินการโดยผู้ดูแลระบบ",
- "Imprint" : "ประทับ",
- "Reference" : "การอ้างอิง",
- "Header left" : "ส่วนหัวด้านซ้าย",
- "Header right" : "ส่วนหัวด้านขวา",
- "As guest" : "ในฐานะผู้เยี่ยมชม",
- "Footer left" : "ส่วนท้ายด้านซ้าย",
- "Footer right" : "ส่วนท้ายด้านขวา",
- "At login" : "ตอนเข้าสู่ระบบ",
- "Application" : "แอพฯ",
- "Content" : "เนื้อหา",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "คุณสามารถใช้ข้อความธรรมดา เครื่องหมาย Markdown หรือ Html Markup ที่มีลักษณะรูปแบบอินไลน์"
-},
-"nplurals=1; plural=0;");
diff --git a/imprint/l10n/th_TH.json b/imprint/l10n/th_TH.json
deleted file mode 100644
index a880d0186..000000000
--- a/imprint/l10n/th_TH.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "ประกาศด้านกฎหมาย",
- "Nothing here yet" : "ไม่มีอะไรเลยที่นี่",
- "The content of the legal notice has to be configured first" : "เนื้อหาของประกาศตามกฎหมายจะต้องมีการกำหนดค่าก่อน",
- "That configuration has to be done by the system administration." : "การกำหนดค่าจะต้องดำเนินการโดยผู้ดูแลระบบ",
- "Imprint" : "ประทับ",
- "Reference" : "การอ้างอิง",
- "Header left" : "ส่วนหัวด้านซ้าย",
- "Header right" : "ส่วนหัวด้านขวา",
- "As guest" : "ในฐานะผู้เยี่ยมชม",
- "Footer left" : "ส่วนท้ายด้านซ้าย",
- "Footer right" : "ส่วนท้ายด้านขวา",
- "At login" : "ตอนเข้าสู่ระบบ",
- "Application" : "แอพฯ",
- "Content" : "เนื้อหา",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "คุณสามารถใช้ข้อความธรรมดา เครื่องหมาย Markdown หรือ Html Markup ที่มีลักษณะรูปแบบอินไลน์"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/imprint/l10n/tr.js b/imprint/l10n/tr.js
deleted file mode 100644
index adc7d956b..000000000
--- a/imprint/l10n/tr.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Yasal uyarı",
- "Nothing here yet" : "Henüz burada bir şey yok",
- "The content of the legal notice has to be configured first" : "İlk olarak yasal uyarı içeriği yapılandırılmalıdır",
- "That configuration has to be done by the system administration." : "Bu yapılandırma sistem yöneticisi tarafından yapılmalıdır.",
- "Imprint" : "İzlenim",
- "Reference" : "Referans",
- "Header left" : "Sol başlık",
- "Header right" : "Sağ başlık",
- "As guest" : "Kullanıcı olarak",
- "Footer left" : "Sol dipnot",
- "Footer right" : "Sağ dipnot",
- "At login" : "Girişte",
- "Application" : "Uygulama",
- "Content" : "İçerik",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Düz metin, markdown yazımı veya html etiketlerini inline biçem nitelikleri ile kullanabilirsiniz."
-},
-"nplurals=2; plural=(n > 1);");
diff --git a/imprint/l10n/tr.json b/imprint/l10n/tr.json
deleted file mode 100644
index 83c51e2b3..000000000
--- a/imprint/l10n/tr.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Yasal uyarı",
- "Nothing here yet" : "Henüz burada bir şey yok",
- "The content of the legal notice has to be configured first" : "İlk olarak yasal uyarı içeriği yapılandırılmalıdır",
- "That configuration has to be done by the system administration." : "Bu yapılandırma sistem yöneticisi tarafından yapılmalıdır.",
- "Imprint" : "İzlenim",
- "Reference" : "Referans",
- "Header left" : "Sol başlık",
- "Header right" : "Sağ başlık",
- "As guest" : "Kullanıcı olarak",
- "Footer left" : "Sol dipnot",
- "Footer right" : "Sağ dipnot",
- "At login" : "Girişte",
- "Application" : "Uygulama",
- "Content" : "İçerik",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Düz metin, markdown yazımı veya html etiketlerini inline biçem nitelikleri ile kullanabilirsiniz."
-},"pluralForm" :"nplurals=2; plural=(n > 1);"
-} \ No newline at end of file
diff --git a/imprint/l10n/ug.js b/imprint/l10n/ug.js
deleted file mode 100644
index 2563a951c..000000000
--- a/imprint/l10n/ug.js
+++ /dev/null
@@ -1,9 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Nothing here yet" : "بۇ جايدا تېخى ھېچنېمە يوق",
- "Header left" : "سول بەت قېشى",
- "Header right" : "ئوڭ بەت قېشى",
- "Content" : "مەزمۇن"
-},
-"nplurals=1; plural=0;");
diff --git a/imprint/l10n/ug.json b/imprint/l10n/ug.json
deleted file mode 100644
index bd7604850..000000000
--- a/imprint/l10n/ug.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{ "translations": {
- "Nothing here yet" : "بۇ جايدا تېخى ھېچنېمە يوق",
- "Header left" : "سول بەت قېشى",
- "Header right" : "ئوڭ بەت قېشى",
- "Content" : "مەزمۇن"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/imprint/l10n/uk.js b/imprint/l10n/uk.js
deleted file mode 100644
index 36ded9f36..000000000
--- a/imprint/l10n/uk.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Юридичне застереження",
- "Nothing here yet" : "Тут ще нічого немає",
- "The content of the legal notice has to be configured first" : "Спочатку має бути налаштований зміст юридичного застереження",
- "That configuration has to be done by the system administration." : "Це налаштування повинно бути зроблене системним адміністратором.",
- "Imprint" : "Відбиток",
- "Reference" : "Рекомендація",
- "Header left" : "Заголовок ліворуч",
- "Header right" : "Заголовок праворуч",
- "As guest" : "Як гість",
- "Footer left" : "Нижній колонтитул ліворуч",
- "Footer right" : "Нижній колонтитул праворуч ",
- "At login" : "При вході",
- "Application" : "Додаток",
- "Content" : "Зміст",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Ви можете використовувати звичайний текст, позначення або HTML-розмітку з атрибутами вбудованого стилю."
-},
-"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/imprint/l10n/uk.json b/imprint/l10n/uk.json
deleted file mode 100644
index 2c479b0c4..000000000
--- a/imprint/l10n/uk.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "Юридичне застереження",
- "Nothing here yet" : "Тут ще нічого немає",
- "The content of the legal notice has to be configured first" : "Спочатку має бути налаштований зміст юридичного застереження",
- "That configuration has to be done by the system administration." : "Це налаштування повинно бути зроблене системним адміністратором.",
- "Imprint" : "Відбиток",
- "Reference" : "Рекомендація",
- "Header left" : "Заголовок ліворуч",
- "Header right" : "Заголовок праворуч",
- "As guest" : "Як гість",
- "Footer left" : "Нижній колонтитул ліворуч",
- "Footer right" : "Нижній колонтитул праворуч ",
- "At login" : "При вході",
- "Application" : "Додаток",
- "Content" : "Зміст",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "Ви можете використовувати звичайний текст, позначення або HTML-розмітку з атрибутами вбудованого стилю."
-},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
-} \ No newline at end of file
diff --git a/imprint/l10n/ur_PK.php b/imprint/l10n/ur_PK.php
deleted file mode 100644
index b09990c57..000000000
--- a/imprint/l10n/ur_PK.php
+++ /dev/null
@@ -1,3 +0,0 @@
-<?php $TRANSLATIONS = array(
-"Admin" => "ایڈمن"
-);
diff --git a/imprint/l10n/vi.js b/imprint/l10n/vi.js
deleted file mode 100644
index 8b5d41408..000000000
--- a/imprint/l10n/vi.js
+++ /dev/null
@@ -1,10 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "Thông báo pháp lý",
- "Nothing here yet" : "Không có gì ở đây",
- "The content of the legal notice has to be configured first" : "Các nội dung của thông báo pháp lý phải được cấu hình đầu tiên",
- "Imprint" : "Đánh dấu",
- "Content" : "Nội dung"
-},
-"nplurals=1; plural=0;");
diff --git a/imprint/l10n/vi.json b/imprint/l10n/vi.json
deleted file mode 100644
index 246742382..000000000
--- a/imprint/l10n/vi.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{ "translations": {
- "Legal notice" : "Thông báo pháp lý",
- "Nothing here yet" : "Không có gì ở đây",
- "The content of the legal notice has to be configured first" : "Các nội dung của thông báo pháp lý phải được cấu hình đầu tiên",
- "Imprint" : "Đánh dấu",
- "Content" : "Nội dung"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/imprint/l10n/zh_CN.js b/imprint/l10n/zh_CN.js
deleted file mode 100644
index 47badfa81..000000000
--- a/imprint/l10n/zh_CN.js
+++ /dev/null
@@ -1,14 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "法律声明",
- "Nothing here yet" : "这里还什么都没有",
- "The content of the legal notice has to be configured first" : "必须先配置法律通知等内容",
- "That configuration has to be done by the system administration." : "那个配置必须在系统管理部分完成。",
- "Imprint" : "版本说明",
- "Reference" : "引用",
- "Header left" : "页眉居左",
- "Header right" : "页眉居右",
- "Content" : "内容"
-},
-"nplurals=1; plural=0;");
diff --git a/imprint/l10n/zh_CN.json b/imprint/l10n/zh_CN.json
deleted file mode 100644
index e10a81626..000000000
--- a/imprint/l10n/zh_CN.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{ "translations": {
- "Legal notice" : "法律声明",
- "Nothing here yet" : "这里还什么都没有",
- "The content of the legal notice has to be configured first" : "必须先配置法律通知等内容",
- "That configuration has to be done by the system administration." : "那个配置必须在系统管理部分完成。",
- "Imprint" : "版本说明",
- "Reference" : "引用",
- "Header left" : "页眉居左",
- "Header right" : "页眉居右",
- "Content" : "内容"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/imprint/l10n/zh_HK.js b/imprint/l10n/zh_HK.js
deleted file mode 100644
index 9ccef391a..000000000
--- a/imprint/l10n/zh_HK.js
+++ /dev/null
@@ -1,6 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Content" : "內容"
-},
-"nplurals=1; plural=0;");
diff --git a/imprint/l10n/zh_HK.json b/imprint/l10n/zh_HK.json
deleted file mode 100644
index f6eb6fcab..000000000
--- a/imprint/l10n/zh_HK.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{ "translations": {
- "Content" : "內容"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/imprint/l10n/zh_TW.js b/imprint/l10n/zh_TW.js
deleted file mode 100644
index a94d50aed..000000000
--- a/imprint/l10n/zh_TW.js
+++ /dev/null
@@ -1,20 +0,0 @@
-OC.L10N.register(
- "imprint",
- {
- "Legal notice" : "法律聲明",
- "Nothing here yet" : "這裡沒有東西",
- "The content of the legal notice has to be configured first" : "必須先設定法律聲明的內容",
- "That configuration has to be done by the system administration." : "該設定必須由系統管理者來完成",
- "Imprint" : "法律聲明",
- "Reference" : "參考",
- "Header left" : "頁首內靠左",
- "Header right" : "頁首內靠右",
- "As guest" : "以訪客身份",
- "Footer left" : "頁尾內靠左",
- "Footer right" : "頁尾內靠右",
- "At login" : "登入時",
- "Application" : "應用程式",
- "Content" : "內容",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "您可以輸入純文字、Markdown 格式文字,或是包含 inline style 的 HTML"
-},
-"nplurals=1; plural=0;");
diff --git a/imprint/l10n/zh_TW.json b/imprint/l10n/zh_TW.json
deleted file mode 100644
index 4744d92e0..000000000
--- a/imprint/l10n/zh_TW.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{ "translations": {
- "Legal notice" : "法律聲明",
- "Nothing here yet" : "這裡沒有東西",
- "The content of the legal notice has to be configured first" : "必須先設定法律聲明的內容",
- "That configuration has to be done by the system administration." : "該設定必須由系統管理者來完成",
- "Imprint" : "法律聲明",
- "Reference" : "參考",
- "Header left" : "頁首內靠左",
- "Header right" : "頁首內靠右",
- "As guest" : "以訪客身份",
- "Footer left" : "頁尾內靠左",
- "Footer right" : "頁尾內靠右",
- "At login" : "登入時",
- "Application" : "應用程式",
- "Content" : "內容",
- "You can use plain text, markdown notation or html markup with inline style attributes. " : "您可以輸入純文字、Markdown 格式文字,或是包含 inline style 的 HTML"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/imprint/settings.php b/imprint/settings.php
deleted file mode 100644
index 8e751c625..000000000
--- a/imprint/settings.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-/**
-* @package imprint an ownCloud app
-* @author Christian Reiner
-* @copyright 2012-2014 Christian Reiner <foss@christian-reiner.info>
-* @license GNU Affero General Public license (AGPL)
-* @link information http://apps.owncloud.com/content/show.php?content=153220
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the license, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library.
-* If not, see <http://www.gnu.org/licenses/>.
-*
-*/
-
-/**
- * @file settings.php
- * This apps system settings dialog
- * The dialog will be included in the general framework of the system settings page
- * @access public
- * @author Christian Reiner
- */
-
-// Session checks
-\OCP\User::checkLoggedIn();
-\OCP\User::checkAdminUser();
-\OCP\App::checkAppEnabled('imprint');
-
-\OCP\Util::addStyle('imprint', 'settings');
-\OCP\Util::addStyle('imprint', 'reference');
-
-\OCP\Util::addScript('imprint', 'settings');
-
-// fetch template
-$tmpl = new \OCP\Template('imprint', 'tmpl_settings');
-// render template
-return $tmpl->fetchPage();
-?>
diff --git a/imprint/templates/tmpl_content.php b/imprint/templates/tmpl_content.php
deleted file mode 100644
index 317ca3549..000000000
--- a/imprint/templates/tmpl_content.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-/**
-* @package imprint an ownCloud app
-* @author Christian Reiner
-* @copyright 2012-2014 Christian Reiner <foss@christian-reiner.info>
-* @license GNU Affero General Public license (AGPL)
-* @link information http://apps.owncloud.com/content/show.php?content=153220
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the license, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library.
-* If not, see <http://www.gnu.org/licenses/>.
-*
-*/
-?>
-
-<?php
-/**
- * @file templates/tmpl_content.php
- * Visualizes the configured imprint content.
- * @access public
- * @author Christian Reiner
- */
-?>
-
-<html>
- <head>
- <link rel="stylesheet" href="<?php p(\OCP\Util::linkTo('imprint','css/content.css'));?>" type="text/css" media="screen" />
- </head>
- <body id="imprint-body">
- <div id="imprint-content">
- <?php print_unescaped($_['content']); ?>
- </div>
- </body>
-</html>
diff --git a/imprint/templates/tmpl_dummy.php b/imprint/templates/tmpl_dummy.php
deleted file mode 100644
index d1727d299..000000000
--- a/imprint/templates/tmpl_dummy.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-/**
-* @package imprint an ownCloud app
-* @author Christian Reiner
-* @copyright 2012-2014 Christian Reiner <foss@christian-reiner.info>
-* @license GNU Affero General Public license (AGPL)
-* @link information http://apps.owncloud.com/content/show.php?content=153220
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the license, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library.
-* If not, see <http://www.gnu.org/licenses/>.
-*
-*/
-?>
-
-<?php
-/**
- * @file templates/tmpl_dummy.php
- * Fallback imprint content guiding towards the required settings.
- * @access public
- * @author Christian Reiner
- */
-?>
-
-#<?php p($l->t("Nothing here yet")."!");?>
-
-##<?php p($l->t("The content of the legal notice has to be configured first").".");?>
-
------
-
-_<?php p($l->t("That configuration has to be done by the system administration.")); ?>_
diff --git a/imprint/templates/tmpl_index.php b/imprint/templates/tmpl_index.php
deleted file mode 100644
index 6f98bd9eb..000000000
--- a/imprint/templates/tmpl_index.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-/**
-* @package imprint an ownCloud app
-* @author Christian Reiner
-* @copyright 2012-2014 Christian Reiner <foss@christian-reiner.info>
-* @license GNU Affero General Public license (AGPL)
-* @link information http://apps.owncloud.com/content/show.php?content=153220
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the license, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library.
-* If not, see <http://www.gnu.org/licenses/>.
-*
-*/
-?>
-
-<?php
-/**
- * @file templates/tmpl_content.php
- * Visualizes the configured imprint content.
- * @access public
- * @author Christian Reiner
- */
-?>
-
-<iframe id="imprint-frame" src="<?php p(\OCP\Util::linkTo('imprint','content.php'));?>" width="100%"></iframe>
diff --git a/imprint/templates/tmpl_settings.php b/imprint/templates/tmpl_settings.php
deleted file mode 100644
index 67e9d2172..000000000
--- a/imprint/templates/tmpl_settings.php
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php
-/**
-* @package imprint an ownCloud app
-* @author Christian Reiner
-* @copyright 2012-2014 Christian Reiner <foss@christian-reiner.info>
-* @license GNU Affero General Public license (AGPL)
-* @link information http://apps.owncloud.com/content/show.php?content=153220
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the license, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library.
-* If not, see <http://www.gnu.org/licenses/>.
-*
-*/
-
-vendor_style('imprint', 'chosen.jquery.min');
-vendor_script('imprint', 'chosen.jquery.min');
-
-?>
-
-<?php
-/**
- * @file templates/tmpl_settings.php
- * Dialog to change app settings, to be included in the clouds settings page.
- * @access public
- * @author Christian Reiner
- */
-?>
-
-
-<!-- settings of app 'imprint' -->
-<div class="section" id="imprint">
- <img src="<?php p(\OCP\Util::imagePath("imprint","imprint-dusky.svg")); ?> ">
- <h2><?php p($l->t("Imprint"));?></h2>
- <div id="imprint-options" class="imprint-option">
- <label for="imprint-option-position-user" class="imprint-option"><?php p($l->t("Reference").": ");?></label>
- <select id="imprint-option-position-user" class="imprint-option" type="select" name="position-user">
- <option value=""></option>
- <option value="header-left"><?php p($l->t("Header left"));?></option>
- <option value="header-right"><?php p($l->t("Header right"));?></option>
- </select>
- <label for="imprint-option-position-guest" class="imprint-option followup"><?php p($l->t("As guest").": ");?></label>
- <select id="imprint-option-position-guest" class="imprint-option" type="select" name="position-guest">
- <option value=""></option>
- <option value="header-left"><?php p($l->t("Header left"));?></option>
- <option value="header-right"><?php p($l->t("Header right"));?></option>
- <option value="footer-left"><?php p($l->t("Footer left"));?></option>
- <option value="footer-right"><?php p($l->t("Footer right"));?></option>
- </select>
- <label for="imprint-option-position-login" class="imprint-option followup"><?php p($l->t("At login").": ");?></label>
- <select id="imprint-option-position-login" class="imprint-option" type="select" name="position-login">
- <option value=""></option>
- <option value="header-left"><?php p($l->t("Header left"));?></option>
- <option value="header-right"><?php p($l->t("Header right"));?></option>
- <option value="footer-left"><?php p($l->t("Footer left"));?></option>
- <option value="footer-right"><?php p($l->t("Footer right"));?></option>
- </select>
- <br>
- <label for="imprint-option-standalone" class="imprint-option"><?php p($l->t("Application").": ");?></label>
- <input id="imprint-option-standalone" type="checkbox" class="imprint-option">Offer as application inside the menu</input>
- <br>
- <label for="imprint-content" class="imprint-option"><?php p($l->t("Content").': ');?></label>
- <textarea id="imprint-content" class="imprint-option"></textarea>
- <br>
- <label for="imprint-usage" class="imprint-option"></label>
- <span id="imprint-usage" class="imprint-option imprint-hint">
- <?php p($l->t("You can use plain text, markdown notation or html markup with inline style attributes. "));?>
- </span>
- </div>
-</div>
diff --git a/imprint/vendor/chosen.jquery.README.md b/imprint/vendor/chosen.jquery.README.md
deleted file mode 100644
index ee865a696..000000000
--- a/imprint/vendor/chosen.jquery.README.md
+++ /dev/null
@@ -1,55 +0,0 @@
-# Chosen
-
-Chosen is a library for making long, unwieldy select boxes more user friendly.
-
-- jQuery support: 1.4+
-- Prototype support: 1.7+
-
-For **documentation**, usage, and examples, see:
-http://harvesthq.github.io/chosen/
-
-For **downloads**, see:
-https://github.com/harvesthq/chosen/releases/
-
-### Bower Installation
-
-Chosen does _**not**_ currently support command-line `bower install chosen` installation. This is because the repo does not contain the compiled sources, and bower does not currently support adding a post-install/build step.
-
-However, you can specify that you'd like to use [the release ZIP](https://github.com/harvesthq/chosen/releases/latest), which includes the compiled and minified sources.
-
-Either install from the command line with
-
-```
-$ bower install https://github.com/harvesthq/chosen/releases/download/v1.3.0/chosen_v1.3.0.zip
-````
-
-or add Chosen to your own project's `bower.json` file, like:
-
-```json
-{
- "name": "my-project",
- "version": "1.0.0",
- "dependencies": {
- "jquery": "1.11.0",
- "chosen": "https://github.com/harvesthq/chosen/releases/download/v1.3.0/chosen_v1.3.0.zip"
- }
-}
-```
-
-See [#1509](https://github.com/harvesthq/chosen/issues/1509), [#1472](https://github.com/harvesthq/chosen/issues/1472), and [#1333](https://github.com/harvesthq/chosen/issues/1333) for more info.
-
-### Contributing to this project
-
-We welcome all to participate in making Chosen the best software it can be. The repository is maintained by only a few people, but has accepted contributions from over 50 authors after reviewing hundreds of pull requests related to thousands of issues. You can help reduce the maintainers' workload (and increase your chance of having an accepted contribution to Chosen) by following the
-[guidelines for contributing](contributing.md).
-
-* [Bug reports](contributing.md#bugs)
-* [Feature requests](contributing.md#features)
-* [Pull requests](contributing.md#pull-requests)
-
-### Chosen Credits
-
-- Concept and development by [Patrick Filler](http://patrickfiller.com) for [Harvest](http://getharvest.com/).
-- Design and CSS by [Matthew Lettini](http://matthewlettini.com/)
-- Repository maintained by [@pfiller](http://github.com/pfiller), [@kenearley](http://github.com/kenearley), [@stof](http://github.com/stof), [@koenpunt](http://github.com/koenpunt), and [@tjschuck](http://github.com/tjschuck).
-- Chosen includes [contributions by many fine folks](https://github.com/harvesthq/chosen/contributors).
diff --git a/imprint/vendor/chosen.jquery.VERSION b/imprint/vendor/chosen.jquery.VERSION
deleted file mode 100644
index 589268e6f..000000000
--- a/imprint/vendor/chosen.jquery.VERSION
+++ /dev/null
@@ -1 +0,0 @@
-1.3.0 \ No newline at end of file
diff --git a/imprint/vendor/chosen.jquery.min.css b/imprint/vendor/chosen.jquery.min.css
deleted file mode 100644
index 13553b2ed..000000000
--- a/imprint/vendor/chosen.jquery.min.css
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Chosen v1.3.0 | (c) 2011-2014 by Harvest | MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md */
-
-.chosen-container{position:relative;display:inline-block;vertical-align:middle;font-size:13px;zoom:1;*display:inline;-webkit-user-select:none;-moz-user-select:none;user-select:none}.chosen-container *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.chosen-container .chosen-drop{position:absolute;top:100%;left:-9999px;z-index:1010;width:100%;border:1px solid #aaa;border-top:0;background:#fff;box-shadow:0 4px 5px rgba(0,0,0,.15)}.chosen-container.chosen-with-drop .chosen-drop{left:0}.chosen-container a{cursor:pointer}.chosen-container-single .chosen-single{position:relative;display:block;overflow:hidden;padding:0 0 0 8px;height:25px;border:1px solid #aaa;border-radius:5px;background-color:#fff;background:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#fff),color-stop(50%,#f6f6f6),color-stop(52%,#eee),color-stop(100%,#f4f4f4));background:-webkit-linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background:-moz-linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background:-o-linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background:linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background-clip:padding-box;box-shadow:0 0 3px #fff inset,0 1px 1px rgba(0,0,0,.1);color:#444;text-decoration:none;white-space:nowrap;line-height:24px}.chosen-container-single .chosen-default{color:#999}.chosen-container-single .chosen-single span{display:block;overflow:hidden;margin-right:26px;text-overflow:ellipsis;white-space:nowrap}.chosen-container-single .chosen-single-with-deselect span{margin-right:38px}.chosen-container-single .chosen-single abbr{position:absolute;top:6px;right:26px;display:block;width:12px;height:12px;background:url(chosen-sprite.png) -42px 1px no-repeat;font-size:1px}.chosen-container-single .chosen-single abbr:hover{background-position:-42px -10px}.chosen-container-single.chosen-disabled .chosen-single abbr:hover{background-position:-42px -10px}.chosen-container-single .chosen-single div{position:absolute;top:0;right:0;display:block;width:18px;height:100%}.chosen-container-single .chosen-single div b{display:block;width:100%;height:100%;background:url(chosen-sprite.png) no-repeat 0 2px}.chosen-container-single .chosen-search{position:relative;z-index:1010;margin:0;padding:3px 4px;white-space:nowrap}.chosen-container-single .chosen-search input[type=text]{margin:1px 0;padding:4px 20px 4px 5px;width:100%;height:auto;outline:0;border:1px solid #aaa;background:#fff url(chosen-sprite.png) no-repeat 100% -20px;background:url(chosen-sprite.png) no-repeat 100% -20px;font-size:1em;font-family:sans-serif;line-height:normal;border-radius:0}.chosen-container-single .chosen-drop{margin-top:-1px;border-radius:0 0 4px 4px;background-clip:padding-box}.chosen-container-single.chosen-container-single-nosearch .chosen-search{position:absolute;left:-9999px}.chosen-container .chosen-results{color:#444;position:relative;overflow-x:hidden;overflow-y:auto;margin:0 4px 4px 0;padding:0 0 0 4px;max-height:240px;-webkit-overflow-scrolling:touch}.chosen-container .chosen-results li{display:none;margin:0;padding:5px 6px;list-style:none;line-height:15px;word-wrap:break-word;-webkit-touch-callout:none}.chosen-container .chosen-results li.active-result{display:list-item;cursor:pointer}.chosen-container .chosen-results li.disabled-result{display:list-item;color:#ccc;cursor:default}.chosen-container .chosen-results li.highlighted{background-color:#3875d7;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#3875d7),color-stop(90%,#2a62bc));background-image:-webkit-linear-gradient(#3875d7 20%,#2a62bc 90%);background-image:-moz-linear-gradient(#3875d7 20%,#2a62bc 90%);background-image:-o-linear-gradient(#3875d7 20%,#2a62bc 90%);background-image:linear-gradient(#3875d7 20%,#2a62bc 90%);color:#fff}.chosen-container .chosen-results li.no-results{color:#777;display:list-item;background:#f4f4f4}.chosen-container .chosen-results li.group-result{display:list-item;font-weight:700;cursor:default}.chosen-container .chosen-results li.group-option{padding-left:15px}.chosen-container .chosen-results li em{font-style:normal;text-decoration:underline}.chosen-container-multi .chosen-choices{position:relative;overflow:hidden;margin:0;padding:0 5px;width:100%;height:auto!important;height:1%;border:1px solid #aaa;background-color:#fff;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(1%,#eee),color-stop(15%,#fff));background-image:-webkit-linear-gradient(#eee 1%,#fff 15%);background-image:-moz-linear-gradient(#eee 1%,#fff 15%);background-image:-o-linear-gradient(#eee 1%,#fff 15%);background-image:linear-gradient(#eee 1%,#fff 15%);cursor:text}.chosen-container-multi .chosen-choices li{float:left;list-style:none}.chosen-container-multi .chosen-choices li.search-field{margin:0;padding:0;white-space:nowrap}.chosen-container-multi .chosen-choices li.search-field input[type=text]{margin:1px 0;padding:0;height:25px;outline:0;border:0!important;background:transparent!important;box-shadow:none;color:#999;font-size:100%;font-family:sans-serif;line-height:normal;border-radius:0}.chosen-container-multi .chosen-choices li.search-choice{position:relative;margin:3px 5px 3px 0;padding:3px 20px 3px 5px;border:1px solid #aaa;max-width:100%;border-radius:3px;background-color:#eee;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#f4f4f4),color-stop(50%,#f0f0f0),color-stop(52%,#e8e8e8),color-stop(100%,#eee));background-image:-webkit-linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-moz-linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-o-linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-size:100% 19px;background-repeat:repeat-x;background-clip:padding-box;box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);color:#333;line-height:13px;cursor:default}.chosen-container-multi .chosen-choices li.search-choice span{word-wrap:break-word}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close{position:absolute;top:4px;right:3px;display:block;width:12px;height:12px;background:url(chosen-sprite.png) -42px 1px no-repeat;font-size:1px}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover{background-position:-42px -10px}.chosen-container-multi .chosen-choices li.search-choice-disabled{padding-right:5px;border:1px solid #ccc;background-color:#e4e4e4;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#f4f4f4),color-stop(50%,#f0f0f0),color-stop(52%,#e8e8e8),color-stop(100%,#eee));background-image:-webkit-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-moz-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-o-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);color:#666}.chosen-container-multi .chosen-choices li.search-choice-focus{background:#d4d4d4}.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close{background-position:-42px -10px}.chosen-container-multi .chosen-results{margin:0;padding:0}.chosen-container-multi .chosen-drop .result-selected{display:list-item;color:#ccc;cursor:default}.chosen-container-active .chosen-single{border:1px solid #5897fb;box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active.chosen-with-drop .chosen-single{border:1px solid #aaa;-moz-border-radius-bottomright:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:0;border-bottom-left-radius:0;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#eee),color-stop(80%,#fff));background-image:-webkit-linear-gradient(#eee 20%,#fff 80%);background-image:-moz-linear-gradient(#eee 20%,#fff 80%);background-image:-o-linear-gradient(#eee 20%,#fff 80%);background-image:linear-gradient(#eee 20%,#fff 80%);box-shadow:0 1px 0 #fff inset}.chosen-container-active.chosen-with-drop .chosen-single div{border-left:0;background:transparent}.chosen-container-active.chosen-with-drop .chosen-single div b{background-position:-18px 2px}.chosen-container-active .chosen-choices{border:1px solid #5897fb;box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active .chosen-choices li.search-field input[type=text]{color:#222!important}.chosen-disabled{opacity:.5!important;cursor:default}.chosen-disabled .chosen-single{cursor:default}.chosen-disabled .chosen-choices .search-choice .search-choice-close{cursor:default}.chosen-rtl{text-align:right}.chosen-rtl .chosen-single{overflow:visible;padding:0 8px 0 0}.chosen-rtl .chosen-single span{margin-right:0;margin-left:26px;direction:rtl}.chosen-rtl .chosen-single-with-deselect span{margin-left:38px}.chosen-rtl .chosen-single div{right:auto;left:3px}.chosen-rtl .chosen-single abbr{right:auto;left:26px}.chosen-rtl .chosen-choices li{float:right}.chosen-rtl .chosen-choices li.search-field input[type=text]{direction:rtl}.chosen-rtl .chosen-choices li.search-choice{margin:3px 5px 3px 0;padding:3px 5px 3px 19px}.chosen-rtl .chosen-choices li.search-choice .search-choice-close{right:auto;left:4px}.chosen-rtl.chosen-container-single-nosearch .chosen-search,.chosen-rtl .chosen-drop{left:9999px}.chosen-rtl.chosen-container-single .chosen-results{margin:0 0 4px 4px;padding:0 4px 0 0}.chosen-rtl .chosen-results li.group-option{padding-right:15px;padding-left:0}.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div{border-right:0}.chosen-rtl .chosen-search input[type=text]{padding:4px 5px 4px 20px;background:#fff url(chosen-sprite.png) no-repeat -30px -20px;background:url(chosen-sprite.png) no-repeat -30px -20px;direction:rtl}.chosen-rtl.chosen-container-single .chosen-single div b{background-position:6px 2px}.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b{background-position:-12px 2px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-resolution:144dpi){.chosen-rtl .chosen-search input[type=text],.chosen-container-single .chosen-single abbr,.chosen-container-single .chosen-single div b,.chosen-container-single .chosen-search input[type=text],.chosen-container-multi .chosen-choices .search-choice .search-choice-close,.chosen-container .chosen-results-scroll-down span,.chosen-container .chosen-results-scroll-up span{background-image:url(chosen-sprite@2x.png)!important;background-size:52px 37px!important;background-repeat:no-repeat!important}} \ No newline at end of file
diff --git a/imprint/vendor/chosen.jquery.min.js b/imprint/vendor/chosen.jquery.min.js
deleted file mode 100644
index 3197538cd..000000000
--- a/imprint/vendor/chosen.jquery.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* Chosen v1.3.0 | (c) 2011-2014 by Harvest | MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md */
-!function(){var a,AbstractChosen,Chosen,SelectParser,b,c={}.hasOwnProperty,d=function(a,b){function d(){this.constructor=a}for(var e in b)c.call(b,e)&&(a[e]=b[e]);return d.prototype=b.prototype,a.prototype=new d,a.__super__=b.prototype,a};SelectParser=function(){function SelectParser(){this.options_index=0,this.parsed=[]}return SelectParser.prototype.add_node=function(a){return"OPTGROUP"===a.nodeName.toUpperCase()?this.add_group(a):this.add_option(a)},SelectParser.prototype.add_group=function(a){var b,c,d,e,f,g;for(b=this.parsed.length,this.parsed.push({array_index:b,group:!0,label:this.escapeExpression(a.label),children:0,disabled:a.disabled,classes:a.className}),f=a.childNodes,g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(this.add_option(c,b,a.disabled));return g},SelectParser.prototype.add_option=function(a,b,c){return"OPTION"===a.nodeName.toUpperCase()?(""!==a.text?(null!=b&&(this.parsed[b].children+=1),this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,value:a.value,text:a.text,html:a.innerHTML,selected:a.selected,disabled:c===!0?c:a.disabled,group_array_index:b,classes:a.className,style:a.style.cssText})):this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,empty:!0}),this.options_index+=1):void 0},SelectParser.prototype.escapeExpression=function(a){var b,c;return null==a||a===!1?"":/[\&\<\>\"\'\`]/.test(a)?(b={"<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"},c=/&(?!\w+;)|[\<\>\"\'\`]/g,a.replace(c,function(a){return b[a]||"&amp;"})):a},SelectParser}(),SelectParser.select_to_array=function(a){var b,c,d,e,f;for(c=new SelectParser,f=a.childNodes,d=0,e=f.length;e>d;d++)b=f[d],c.add_node(b);return c.parsed},AbstractChosen=function(){function AbstractChosen(a,b){this.form_field=a,this.options=null!=b?b:{},AbstractChosen.browser_is_supported()&&(this.is_multiple=this.form_field.multiple,this.set_default_text(),this.set_default_values(),this.setup(),this.set_up_html(),this.register_observers(),this.on_ready())}return AbstractChosen.prototype.set_default_values=function(){var a=this;return this.click_test_action=function(b){return a.test_active_click(b)},this.activate_action=function(b){return a.activate_field(b)},this.active_field=!1,this.mouse_on_container=!1,this.results_showing=!1,this.result_highlighted=null,this.allow_single_deselect=null!=this.options.allow_single_deselect&&null!=this.form_field.options[0]&&""===this.form_field.options[0].text?this.options.allow_single_deselect:!1,this.disable_search_threshold=this.options.disable_search_threshold||0,this.disable_search=this.options.disable_search||!1,this.enable_split_word_search=null!=this.options.enable_split_word_search?this.options.enable_split_word_search:!0,this.group_search=null!=this.options.group_search?this.options.group_search:!0,this.search_contains=this.options.search_contains||!1,this.single_backstroke_delete=null!=this.options.single_backstroke_delete?this.options.single_backstroke_delete:!0,this.max_selected_options=this.options.max_selected_options||1/0,this.inherit_select_classes=this.options.inherit_select_classes||!1,this.display_selected_options=null!=this.options.display_selected_options?this.options.display_selected_options:!0,this.display_disabled_options=null!=this.options.display_disabled_options?this.options.display_disabled_options:!0},AbstractChosen.prototype.set_default_text=function(){return this.default_text=this.form_field.getAttribute("data-placeholder")?this.form_field.getAttribute("data-placeholder"):this.is_multiple?this.options.placeholder_text_multiple||this.options.placeholder_text||AbstractChosen.default_multiple_text:this.options.placeholder_text_single||this.options.placeholder_text||AbstractChosen.default_single_text,this.results_none_found=this.form_field.getAttribute("data-no_results_text")||this.options.no_results_text||AbstractChosen.default_no_result_text},AbstractChosen.prototype.mouse_enter=function(){return this.mouse_on_container=!0},AbstractChosen.prototype.mouse_leave=function(){return this.mouse_on_container=!1},AbstractChosen.prototype.input_focus=function(){var a=this;if(this.is_multiple){if(!this.active_field)return setTimeout(function(){return a.container_mousedown()},50)}else if(!this.active_field)return this.activate_field()},AbstractChosen.prototype.input_blur=function(){var a=this;return this.mouse_on_container?void 0:(this.active_field=!1,setTimeout(function(){return a.blur_test()},100))},AbstractChosen.prototype.results_option_build=function(a){var b,c,d,e,f;for(b="",f=this.results_data,d=0,e=f.length;e>d;d++)c=f[d],b+=c.group?this.result_add_group(c):this.result_add_option(c),(null!=a?a.first:void 0)&&(c.selected&&this.is_multiple?this.choice_build(c):c.selected&&!this.is_multiple&&this.single_set_selected_text(c.text));return b},AbstractChosen.prototype.result_add_option=function(a){var b,c;return a.search_match?this.include_option_in_results(a)?(b=[],a.disabled||a.selected&&this.is_multiple||b.push("active-result"),!a.disabled||a.selected&&this.is_multiple||b.push("disabled-result"),a.selected&&b.push("result-selected"),null!=a.group_array_index&&b.push("group-option"),""!==a.classes&&b.push(a.classes),c=document.createElement("li"),c.className=b.join(" "),c.style.cssText=a.style,c.setAttribute("data-option-array-index",a.array_index),c.innerHTML=a.search_text,this.outerHTML(c)):"":""},AbstractChosen.prototype.result_add_group=function(a){var b,c;return a.search_match||a.group_match?a.active_options>0?(b=[],b.push("group-result"),a.classes&&b.push(a.classes),c=document.createElement("li"),c.className=b.join(" "),c.innerHTML=a.search_text,this.outerHTML(c)):"":""},AbstractChosen.prototype.results_update_field=function(){return this.set_default_text(),this.is_multiple||this.results_reset_cleanup(),this.result_clear_highlight(),this.results_build(),this.results_showing?this.winnow_results():void 0},AbstractChosen.prototype.reset_single_select_options=function(){var a,b,c,d,e;for(d=this.results_data,e=[],b=0,c=d.length;c>b;b++)a=d[b],a.selected?e.push(a.selected=!1):e.push(void 0);return e},AbstractChosen.prototype.results_toggle=function(){return this.results_showing?this.results_hide():this.results_show()},AbstractChosen.prototype.results_search=function(){return this.results_showing?this.winnow_results():this.results_show()},AbstractChosen.prototype.winnow_results=function(){var a,b,c,d,e,f,g,h,i,j,k,l;for(this.no_results_clear(),d=0,f=this.get_search_text(),a=f.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),i=new RegExp(a,"i"),c=this.get_search_regex(a),l=this.results_data,j=0,k=l.length;k>j;j++)b=l[j],b.search_match=!1,e=null,this.include_option_in_results(b)&&(b.group&&(b.group_match=!1,b.active_options=0),null!=b.group_array_index&&this.results_data[b.group_array_index]&&(e=this.results_data[b.group_array_index],0===e.active_options&&e.search_match&&(d+=1),e.active_options+=1),(!b.group||this.group_search)&&(b.search_text=b.group?b.label:b.text,b.search_match=this.search_string_match(b.search_text,c),b.search_match&&!b.group&&(d+=1),b.search_match?(f.length&&(g=b.search_text.search(i),h=b.search_text.substr(0,g+f.length)+"</em>"+b.search_text.substr(g+f.length),b.search_text=h.substr(0,g)+"<em>"+h.substr(g)),null!=e&&(e.group_match=!0)):null!=b.group_array_index&&this.results_data[b.group_array_index].search_match&&(b.search_match=!0)));return this.result_clear_highlight(),1>d&&f.length?(this.update_results_content(""),this.no_results(f)):(this.update_results_content(this.results_option_build()),this.winnow_results_set_highlight())},AbstractChosen.prototype.get_search_regex=function(a){var b;return b=this.search_contains?"":"^",new RegExp(b+a,"i")},AbstractChosen.prototype.search_string_match=function(a,b){var c,d,e,f;if(b.test(a))return!0;if(this.enable_split_word_search&&(a.indexOf(" ")>=0||0===a.indexOf("["))&&(d=a.replace(/\[|\]/g,"").split(" "),d.length))for(e=0,f=d.length;f>e;e++)if(c=d[e],b.test(c))return!0},AbstractChosen.prototype.choices_count=function(){var a,b,c,d;if(null!=this.selected_option_count)return this.selected_option_count;for(this.selected_option_count=0,d=this.form_field.options,b=0,c=d.length;c>b;b++)a=d[b],a.selected&&(this.selected_option_count+=1);return this.selected_option_count},AbstractChosen.prototype.choices_click=function(a){return a.preventDefault(),this.results_showing||this.is_disabled?void 0:this.results_show()},AbstractChosen.prototype.keyup_checker=function(a){var b,c;switch(b=null!=(c=a.which)?c:a.keyCode,this.search_field_scale(),b){case 8:if(this.is_multiple&&this.backstroke_length<1&&this.choices_count()>0)return this.keydown_backstroke();if(!this.pending_backstroke)return this.result_clear_highlight(),this.results_search();break;case 13:if(a.preventDefault(),this.results_showing)return this.result_select(a);break;case 27:return this.results_showing&&this.results_hide(),!0;case 9:case 38:case 40:case 16:case 91:case 17:break;default:return this.results_search()}},AbstractChosen.prototype.clipboard_event_checker=function(){var a=this;return setTimeout(function(){return a.results_search()},50)},AbstractChosen.prototype.container_width=function(){return null!=this.options.width?this.options.width:""+this.form_field.offsetWidth+"px"},AbstractChosen.prototype.include_option_in_results=function(a){return this.is_multiple&&!this.display_selected_options&&a.selected?!1:!this.display_disabled_options&&a.disabled?!1:a.empty?!1:!0},AbstractChosen.prototype.search_results_touchstart=function(a){return this.touch_started=!0,this.search_results_mouseover(a)},AbstractChosen.prototype.search_results_touchmove=function(a){return this.touch_started=!1,this.search_results_mouseout(a)},AbstractChosen.prototype.search_results_touchend=function(a){return this.touch_started?this.search_results_mouseup(a):void 0},AbstractChosen.prototype.outerHTML=function(a){var b;return a.outerHTML?a.outerHTML:(b=document.createElement("div"),b.appendChild(a),b.innerHTML)},AbstractChosen.browser_is_supported=function(){return"Microsoft Internet Explorer"===window.navigator.appName?document.documentMode>=8:/iP(od|hone)/i.test(window.navigator.userAgent)?!1:/Android/i.test(window.navigator.userAgent)&&/Mobile/i.test(window.navigator.userAgent)?!1:!0},AbstractChosen.default_multiple_text="Select Some Options",AbstractChosen.default_single_text="Select an Option",AbstractChosen.default_no_result_text="No results match",AbstractChosen}(),a=jQuery,a.fn.extend({chosen:function(b){return AbstractChosen.browser_is_supported()?this.each(function(){var c,d;c=a(this),d=c.data("chosen"),"destroy"===b&&d instanceof Chosen?d.destroy():d instanceof Chosen||c.data("chosen",new Chosen(this,b))}):this}}),Chosen=function(c){function Chosen(){return b=Chosen.__super__.constructor.apply(this,arguments)}return d(Chosen,c),Chosen.prototype.setup=function(){return this.form_field_jq=a(this.form_field),this.current_selectedIndex=this.form_field.selectedIndex,this.is_rtl=this.form_field_jq.hasClass("chosen-rtl")},Chosen.prototype.set_up_html=function(){var b,c;return b=["chosen-container"],b.push("chosen-container-"+(this.is_multiple?"multi":"single")),this.inherit_select_classes&&this.form_field.className&&b.push(this.form_field.className),this.is_rtl&&b.push("chosen-rtl"),c={"class":b.join(" "),style:"width: "+this.container_width()+";",title:this.form_field.title},this.form_field.id.length&&(c.id=this.form_field.id.replace(/[^\w]/g,"_")+"_chosen"),this.container=a("<div />",c),this.is_multiple?this.container.html('<ul class="chosen-choices"><li class="search-field"><input type="text" value="'+this.default_text+'" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chosen-drop"><ul class="chosen-results"></ul></div>'):this.container.html('<a class="chosen-single chosen-default" tabindex="-1"><span>'+this.default_text+'</span><div><b></b></div></a><div class="chosen-drop"><div class="chosen-search"><input type="text" autocomplete="off" /></div><ul class="chosen-results"></ul></div>'),this.form_field_jq.hide().after(this.container),this.dropdown=this.container.find("div.chosen-drop").first(),this.search_field=this.container.find("input").first(),this.search_results=this.container.find("ul.chosen-results").first(),this.search_field_scale(),this.search_no_results=this.container.find("li.no-results").first(),this.is_multiple?(this.search_choices=this.container.find("ul.chosen-choices").first(),this.search_container=this.container.find("li.search-field").first()):(this.search_container=this.container.find("div.chosen-search").first(),this.selected_item=this.container.find(".chosen-single").first()),this.results_build(),this.set_tab_index(),this.set_label_behavior()},Chosen.prototype.on_ready=function(){return this.form_field_jq.trigger("chosen:ready",{chosen:this})},Chosen.prototype.register_observers=function(){var a=this;return this.container.bind("touchstart.chosen",function(b){a.container_mousedown(b)}),this.container.bind("touchend.chosen",function(b){a.container_mouseup(b)}),this.container.bind("mousedown.chosen",function(b){a.container_mousedown(b)}),this.container.bind("mouseup.chosen",function(b){a.container_mouseup(b)}),this.container.bind("mouseenter.chosen",function(b){a.mouse_enter(b)}),this.container.bind("mouseleave.chosen",function(b){a.mouse_leave(b)}),this.search_results.bind("mouseup.chosen",function(b){a.search_results_mouseup(b)}),this.search_results.bind("mouseover.chosen",function(b){a.search_results_mouseover(b)}),this.search_results.bind("mouseout.chosen",function(b){a.search_results_mouseout(b)}),this.search_results.bind("mousewheel.chosen DOMMouseScroll.chosen",function(b){a.search_results_mousewheel(b)}),this.search_results.bind("touchstart.chosen",function(b){a.search_results_touchstart(b)}),this.search_results.bind("touchmove.chosen",function(b){a.search_results_touchmove(b)}),this.search_results.bind("touchend.chosen",function(b){a.search_results_touchend(b)}),this.form_field_jq.bind("chosen:updated.chosen",function(b){a.results_update_field(b)}),this.form_field_jq.bind("chosen:activate.chosen",function(b){a.activate_field(b)}),this.form_field_jq.bind("chosen:open.chosen",function(b){a.container_mousedown(b)}),this.form_field_jq.bind("chosen:close.chosen",function(b){a.input_blur(b)}),this.search_field.bind("blur.chosen",function(b){a.input_blur(b)}),this.search_field.bind("keyup.chosen",function(b){a.keyup_checker(b)}),this.search_field.bind("keydown.chosen",function(b){a.keydown_checker(b)}),this.search_field.bind("focus.chosen",function(b){a.input_focus(b)}),this.search_field.bind("cut.chosen",function(b){a.clipboard_event_checker(b)}),this.search_field.bind("paste.chosen",function(b){a.clipboard_event_checker(b)}),this.is_multiple?this.search_choices.bind("click.chosen",function(b){a.choices_click(b)}):this.container.bind("click.chosen",function(a){a.preventDefault()})},Chosen.prototype.destroy=function(){return a(this.container[0].ownerDocument).unbind("click.chosen",this.click_test_action),this.search_field[0].tabIndex&&(this.form_field_jq[0].tabIndex=this.search_field[0].tabIndex),this.container.remove(),this.form_field_jq.removeData("chosen"),this.form_field_jq.show()},Chosen.prototype.search_field_disabled=function(){return this.is_disabled=this.form_field_jq[0].disabled,this.is_disabled?(this.container.addClass("chosen-disabled"),this.search_field[0].disabled=!0,this.is_multiple||this.selected_item.unbind("focus.chosen",this.activate_action),this.close_field()):(this.container.removeClass("chosen-disabled"),this.search_field[0].disabled=!1,this.is_multiple?void 0:this.selected_item.bind("focus.chosen",this.activate_action))},Chosen.prototype.container_mousedown=function(b){return this.is_disabled||(b&&"mousedown"===b.type&&!this.results_showing&&b.preventDefault(),null!=b&&a(b.target).hasClass("search-choice-close"))?void 0:(this.active_field?this.is_multiple||!b||a(b.target)[0]!==this.selected_item[0]&&!a(b.target).parents("a.chosen-single").length||(b.preventDefault(),this.results_toggle()):(this.is_multiple&&this.search_field.val(""),a(this.container[0].ownerDocument).bind("click.chosen",this.click_test_action),this.results_show()),this.activate_field())},Chosen.prototype.container_mouseup=function(a){return"ABBR"!==a.target.nodeName||this.is_disabled?void 0:this.results_reset(a)},Chosen.prototype.search_results_mousewheel=function(a){var b;return a.originalEvent&&(b=a.originalEvent.deltaY||-a.originalEvent.wheelDelta||a.originalEvent.detail),null!=b?(a.preventDefault(),"DOMMouseScroll"===a.type&&(b=40*b),this.search_results.scrollTop(b+this.search_results.scrollTop())):void 0},Chosen.prototype.blur_test=function(){return!this.active_field&&this.container.hasClass("chosen-container-active")?this.close_field():void 0},Chosen.prototype.close_field=function(){return a(this.container[0].ownerDocument).unbind("click.chosen",this.click_test_action),this.active_field=!1,this.results_hide(),this.container.removeClass("chosen-container-active"),this.clear_backstroke(),this.show_search_field_default(),this.search_field_scale()},Chosen.prototype.activate_field=function(){return this.container.addClass("chosen-container-active"),this.active_field=!0,this.search_field.val(this.search_field.val()),this.search_field.focus()},Chosen.prototype.test_active_click=function(b){var c;return c=a(b.target).closest(".chosen-container"),c.length&&this.container[0]===c[0]?this.active_field=!0:this.close_field()},Chosen.prototype.results_build=function(){return this.parsing=!0,this.selected_option_count=null,this.results_data=SelectParser.select_to_array(this.form_field),this.is_multiple?this.search_choices.find("li.search-choice").remove():this.is_multiple||(this.single_set_selected_text(),this.disable_search||this.form_field.options.length<=this.disable_search_threshold?(this.search_field[0].readOnly=!0,this.container.addClass("chosen-container-single-nosearch")):(this.search_field[0].readOnly=!1,this.container.removeClass("chosen-container-single-nosearch"))),this.update_results_content(this.results_option_build({first:!0})),this.search_field_disabled(),this.show_search_field_default(),this.search_field_scale(),this.parsing=!1},Chosen.prototype.result_do_highlight=function(a){var b,c,d,e,f;if(a.length){if(this.result_clear_highlight(),this.result_highlight=a,this.result_highlight.addClass("highlighted"),d=parseInt(this.search_results.css("maxHeight"),10),f=this.search_results.scrollTop(),e=d+f,c=this.result_highlight.position().top+this.search_results.scrollTop(),b=c+this.result_highlight.outerHeight(),b>=e)return this.search_results.scrollTop(b-d>0?b-d:0);if(f>c)return this.search_results.scrollTop(c)}},Chosen.prototype.result_clear_highlight=function(){return this.result_highlight&&this.result_highlight.removeClass("highlighted"),this.result_highlight=null},Chosen.prototype.results_show=function(){return this.is_multiple&&this.max_selected_options<=this.choices_count()?(this.form_field_jq.trigger("chosen:maxselected",{chosen:this}),!1):(this.container.addClass("chosen-with-drop"),this.results_showing=!0,this.search_field.focus(),this.search_field.val(this.search_field.val()),this.winnow_results(),this.form_field_jq.trigger("chosen:showing_dropdown",{chosen:this}))},Chosen.prototype.update_results_content=function(a){return this.search_results.html(a)},Chosen.prototype.results_hide=function(){return this.results_showing&&(this.result_clear_highlight(),this.container.removeClass("chosen-with-drop"),this.form_field_jq.trigger("chosen:hiding_dropdown",{chosen:this})),this.results_showing=!1},Chosen.prototype.set_tab_index=function(){var a;return this.form_field.tabIndex?(a=this.form_field.tabIndex,this.form_field.tabIndex=-1,this.search_field[0].tabIndex=a):void 0},Chosen.prototype.set_label_behavior=function(){var b=this;return this.form_field_label=this.form_field_jq.parents("label"),!this.form_field_label.length&&this.form_field.id.length&&(this.form_field_label=a("label[for='"+this.form_field.id+"']")),this.form_field_label.length>0?this.form_field_label.bind("click.chosen",function(a){return b.is_multiple?b.container_mousedown(a):b.activate_field()}):void 0},Chosen.prototype.show_search_field_default=function(){return this.is_multiple&&this.choices_count()<1&&!this.active_field?(this.search_field.val(this.default_text),this.search_field.addClass("default")):(this.search_field.val(""),this.search_field.removeClass("default"))},Chosen.prototype.search_results_mouseup=function(b){var c;return c=a(b.target).hasClass("active-result")?a(b.target):a(b.target).parents(".active-result").first(),c.length?(this.result_highlight=c,this.result_select(b),this.search_field.focus()):void 0},Chosen.prototype.search_results_mouseover=function(b){var c;return c=a(b.target).hasClass("active-result")?a(b.target):a(b.target).parents(".active-result").first(),c?this.result_do_highlight(c):void 0},Chosen.prototype.search_results_mouseout=function(b){return a(b.target).hasClass("active-result")?this.result_clear_highlight():void 0},Chosen.prototype.choice_build=function(b){var c,d,e=this;return c=a("<li />",{"class":"search-choice"}).html("<span>"+b.html+"</span>"),b.disabled?c.addClass("search-choice-disabled"):(d=a("<a />",{"class":"search-choice-close","data-option-array-index":b.array_index}),d.bind("click.chosen",function(a){return e.choice_destroy_link_click(a)}),c.append(d)),this.search_container.before(c)},Chosen.prototype.choice_destroy_link_click=function(b){return b.preventDefault(),b.stopPropagation(),this.is_disabled?void 0:this.choice_destroy(a(b.target))},Chosen.prototype.choice_destroy=function(a){return this.result_deselect(a[0].getAttribute("data-option-array-index"))?(this.show_search_field_default(),this.is_multiple&&this.choices_count()>0&&this.search_field.val().length<1&&this.results_hide(),a.parents("li").first().remove(),this.search_field_scale()):void 0},Chosen.prototype.results_reset=function(){return this.reset_single_select_options(),this.form_field.options[0].selected=!0,this.single_set_selected_text(),this.show_search_field_default(),this.results_reset_cleanup(),this.form_field_jq.trigger("change"),this.active_field?this.results_hide():void 0},Chosen.prototype.results_reset_cleanup=function(){return this.current_selectedIndex=this.form_field.selectedIndex,this.selected_item.find("abbr").remove()},Chosen.prototype.result_select=function(a){var b,c;return this.result_highlight?(b=this.result_highlight,this.result_clear_highlight(),this.is_multiple&&this.max_selected_options<=this.choices_count()?(this.form_field_jq.trigger("chosen:maxselected",{chosen:this}),!1):(this.is_multiple?b.removeClass("active-result"):this.reset_single_select_options(),c=this.results_data[b[0].getAttribute("data-option-array-index")],c.selected=!0,this.form_field.options[c.options_index].selected=!0,this.selected_option_count=null,this.is_multiple?this.choice_build(c):this.single_set_selected_text(c.text),(a.metaKey||a.ctrlKey)&&this.is_multiple||this.results_hide(),this.search_field.val(""),(this.is_multiple||this.form_field.selectedIndex!==this.current_selectedIndex)&&this.form_field_jq.trigger("change",{selected:this.form_field.options[c.options_index].value}),this.current_selectedIndex=this.form_field.selectedIndex,this.search_field_scale())):void 0},Chosen.prototype.single_set_selected_text=function(a){return null==a&&(a=this.default_text),a===this.default_text?this.selected_item.addClass("chosen-default"):(this.single_deselect_control_build(),this.selected_item.removeClass("chosen-default")),this.selected_item.find("span").text(a)},Chosen.prototype.result_deselect=function(a){var b;return b=this.results_data[a],this.form_field.options[b.options_index].disabled?!1:(b.selected=!1,this.form_field.options[b.options_index].selected=!1,this.selected_option_count=null,this.result_clear_highlight(),this.results_showing&&this.winnow_results(),this.form_field_jq.trigger("change",{deselected:this.form_field.options[b.options_index].value}),this.search_field_scale(),!0)},Chosen.prototype.single_deselect_control_build=function(){return this.allow_single_deselect?(this.selected_item.find("abbr").length||this.selected_item.find("span").first().after('<abbr class="search-choice-close"></abbr>'),this.selected_item.addClass("chosen-single-with-deselect")):void 0},Chosen.prototype.get_search_text=function(){return this.search_field.val()===this.default_text?"":a("<div/>").text(a.trim(this.search_field.val())).html()},Chosen.prototype.winnow_results_set_highlight=function(){var a,b;return b=this.is_multiple?[]:this.search_results.find(".result-selected.active-result"),a=b.length?b.first():this.search_results.find(".active-result").first(),null!=a?this.result_do_highlight(a):void 0},Chosen.prototype.no_results=function(b){var c;return c=a('<li class="no-results">'+this.results_none_found+' "<span></span>"</li>'),c.find("span").first().html(b),this.search_results.append(c),this.form_field_jq.trigger("chosen:no_results",{chosen:this})},Chosen.prototype.no_results_clear=function(){return this.search_results.find(".no-results").remove()},Chosen.prototype.keydown_arrow=function(){var a;return this.results_showing&&this.result_highlight?(a=this.result_highlight.nextAll("li.active-result").first())?this.result_do_highlight(a):void 0:this.results_show()},Chosen.prototype.keyup_arrow=function(){var a;return this.results_showing||this.is_multiple?this.result_highlight?(a=this.result_highlight.prevAll("li.active-result"),a.length?this.result_do_highlight(a.first()):(this.choices_count()>0&&this.results_hide(),this.result_clear_highlight())):void 0:this.results_show()},Chosen.prototype.keydown_backstroke=function(){var a;return this.pending_backstroke?(this.choice_destroy(this.pending_backstroke.find("a").first()),this.clear_backstroke()):(a=this.search_container.siblings("li.search-choice").last(),a.length&&!a.hasClass("search-choice-disabled")?(this.pending_backstroke=a,this.single_backstroke_delete?this.keydown_backstroke():this.pending_backstroke.addClass("search-choice-focus")):void 0)},Chosen.prototype.clear_backstroke=function(){return this.pending_backstroke&&this.pending_backstroke.removeClass("search-choice-focus"),this.pending_backstroke=null},Chosen.prototype.keydown_checker=function(a){var b,c;switch(b=null!=(c=a.which)?c:a.keyCode,this.search_field_scale(),8!==b&&this.pending_backstroke&&this.clear_backstroke(),b){case 8:this.backstroke_length=this.search_field.val().length;break;case 9:this.results_showing&&!this.is_multiple&&this.result_select(a),this.mouse_on_container=!1;break;case 13:this.results_showing&&a.preventDefault();break;case 32:this.disable_search&&a.preventDefault();break;case 38:a.preventDefault(),this.keyup_arrow();break;case 40:a.preventDefault(),this.keydown_arrow()}},Chosen.prototype.search_field_scale=function(){var b,c,d,e,f,g,h,i,j;if(this.is_multiple){for(d=0,h=0,f="position:absolute; left: -1000px; top: -1000px; display:none;",g=["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"],i=0,j=g.length;j>i;i++)e=g[i],f+=e+":"+this.search_field.css(e)+";";return b=a("<div />",{style:f}),b.text(this.search_field.val()),a("body").append(b),h=b.width()+25,b.remove(),c=this.container.outerWidth(),h>c-10&&(h=c-10),this.search_field.css({width:h+"px"})}},Chosen}(AbstractChosen)}.call(this); \ No newline at end of file
diff --git a/imprint/vendor/slimdown.README.md b/imprint/vendor/slimdown.README.md
deleted file mode 100644
index 557c948ff..000000000
--- a/imprint/vendor/slimdown.README.md
+++ /dev/null
@@ -1,104 +0,0 @@
-# Slimdown
-
-A very basic regex-based Markdown parser. Supports the
-following elements (and can be extended via `Slimdown::add_rule()`):
-
-* Headers
-* Links
-* Bold
-* Emphasis
-* Deletions
-* Quotes
-* Inline code
-* Blockquotes
-* Ordered/unordered lists
-
-## Usage
-
-Here is the general use case:
-
-```php
-<?php
-
-require_once ('Slimdown.php');
-
-echo Slimdown::render (
- "# Page title\n\nAnd **now** for something _completely_ different."
-);
-
-?>
-```
-
-### Adding rules
-
-A simple rule to convert `:)` to an image:
-
-```php
-<?php
-
-require_once ('Slimdown.php');
-
-Slimdown::add_rule ('/(\W)\:\)(\W)/', '\1<img src="smiley.png" />\2');
-
-echo Slimdown::render ('Know what I\'m sayin? :)');
-
-?>
-```
-
-In this example, we add GitHub-style internal linking
-(e.g., `[[Another Page]]`).
-
-```php
-<?php
-
-require_once ('Slimdown.php');
-
-function mywiki_internal_link ($title) {
- return sprintf (
- '<a href="%s">%s</a>',
- preg_replace ('/[^a-zA-Z0-9_-]+/', '-', $title),
- $title
- );
-}
-
-Slimdown::add_rule ('/\[\[(.*?)\]\]/e', 'mywiki_internal_link (\'\\1\')');
-
-echo Slimdown::render ('Check [[This Page]] out!');
-
-?>
-```
-
-### A longer example
-
-```php
-<?php
-
-require_once ('Slimdown.php');
-
-echo Slimdown::render ("# Title
-
-And *now* [a link](http://www.google.com) to **follow** and [another](http://yahoo.com/).
-
-* One
-* Two
-* Three
-
-## Subhead
-
-One **two** three **four** five.
-
-One __two__ three _four_ five __six__ seven _eight_.
-
-1. One
-2. Two
-3. Three
-
-More text with `inline($code)` sample.
-
-> A block quote
-> across two lines.
-
-More text...");
-
-?>
-``` \ No newline at end of file
diff --git a/imprint/vendor/slimdown.php b/imprint/vendor/slimdown.php
deleted file mode 100644
index 21d15f8e6..000000000
--- a/imprint/vendor/slimdown.php
+++ /dev/null
@@ -1,92 +0,0 @@
-<?php
-
-/**
- * Slimdown - A very basic regex-based Markdown parser. Supports the
- * following elements (and can be extended via Slimdown::add_rule()):
- *
- * - Headers
- * - Links
- * - Bold
- * - Emphasis
- * - Deletions
- * - Quotes
- * - Inline code
- * - Blockquotes
- * - Ordered/unordered lists
- * - Horizontal rules
- *
- * Author: Johnny Broadway <johnny@johnnybroadway.com>
- * Website: https://gist.github.com/jbroadway/2836900
- * License: MIT
- */
-class Slimdown {
- public static $rules = array (
- '/(#+)(.*)/' => 'self::header', // headers
- '/\[([^\[]+)\]\(([^\)]+)\)/' => '<a href=\'\2\'>\1</a>', // links
- '/(\*\*|__)(.*?)\1/' => '<strong>\2</strong>', // bold
- '/(\*|_)(.*?)\1/' => '<em>\2</em>', // emphasis
- '/\~\~(.*?)\~\~/' => '<del>\1</del>', // del
- '/\:\"(.*?)\"\:/' => '<q>\1</q>', // quote
- '/`(.*?)`/' => '<code>\1</code>', // inline code
- '/\n\*(.*)/' => 'self::ul_list', // ul lists
- '/\n[0-9]+\.(.*)/' => 'self::ol_list', // ol lists
- '/\n(&gt;|\>)(.*)/' => 'self::blockquote', // blockquotes
- '/\n-{5,}/' => "\n<hr />", // horizontal rule
- '/\n([^\n]+)\n/' => 'self::para', // add paragraphs
- '/<\/ul>\s?<ul>/' => '', // fix extra ul
- '/<\/ol>\s?<ol>/' => '', // fix extra ol
- '/<\/blockquote><blockquote>/' => "\n" // fix extra blockquote
- );
-
- private static function para ($regs) {
- $line = $regs[1];
- $trimmed = trim ($line);
- if (preg_match ('/^<\/?(ul|ol|li|h|p|bl)/', $trimmed)) {
- return "\n" . $line . "\n";
- }
- return sprintf ("\n<p>%s</p>\n", $trimmed);
- }
-
- private static function ul_list ($regs) {
- $item = $regs[1];
- return sprintf ("\n<ul>\n\t<li>%s</li>\n</ul>", trim ($item));
- }
-
- private static function ol_list ($regs) {
- $item = $regs[1];
- return sprintf ("\n<ol>\n\t<li>%s</li>\n</ol>", trim ($item));
- }
-
- private static function blockquote ($regs) {
- $item = $regs[2];
- return sprintf ("\n<blockquote>%s</blockquote>", trim ($item));
- }
-
- private static function header ($regs) {
- list ($tmp, $chars, $header) = $regs;
- $level = strlen ($chars);
- return sprintf ('<h%d>%s</h%d>', $level, trim ($header), $level);
- }
-
- /**
- * Add a rule.
- */
- public static function add_rule ($regex, $replacement) {
- self::$rules[$regex] = $replacement;
- }
-
- /**
- * Render some Markdown into HTML.
- */
- public static function render ($text) {
- $text = "\n" . $text . "\n";
- foreach (self::$rules as $regex => $replacement) {
- if (is_callable ( $replacement)) {
- $text = preg_replace_callback ($regex, $replacement, $text);
- } else {
- $text = preg_replace ($regex, $replacement, $text);
- }
- }
- return trim ($text);
- }
-}
diff --git a/ownpad_lite/ajax/search.php b/ownpad_lite/ajax/search.php
deleted file mode 100644
index 1b22071f4..000000000
--- a/ownpad_lite/ajax/search.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-
-/**
- * ownCloud - ownpad_lite plugin
- *
- * @author Victor Dubiniuk
- * @copyright 2013 Victor Dubiniuk victor.dubiniuk@gmail.com
- *
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- */
-
-namespace OCA\ownpad_lite;
-
-\OCP\JSON::checkLoggedIn();
-\OCP\JSON::callCheck();
-
-$search = UrlParam::post(UrlParam::SHARE_SEARCH);
-\OCP\JSON::success(array(
- 'data' => Contacts::search($search)
-));
-exit(); \ No newline at end of file
diff --git a/ownpad_lite/ajax/settings.php b/ownpad_lite/ajax/settings.php
deleted file mode 100644
index 87eb62986..000000000
--- a/ownpad_lite/ajax/settings.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-/**
- * ownCloud - ownpad_lite plugin
- *
- * @author Victor Dubiniuk
- * @copyright 2012 Victor Dubiniuk victor.dubiniuk@gmail.com
- *
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- */
-
-namespace OCA\ownpad_lite;
-
-\OCP\JSON::checkLoggedIn();
-\OCP\JSON::callCheck();
-
-$serviceUrl = UrlParam::post(UrlParam::CONFIG_URL);
-$username = UrlParam::post(UrlParam::CONFIG_USERNAME);
-
-$errors = array();
-
-$username = preg_replace('/[^0-9a-zA-Z\.\-_]*/i', '', $username);
-if ($username) {
- App::setUsername($username);
-} else {
- $errors[] = App::ERROR_USERNAME_INVALID;
-}
-
-if ($serviceUrl) {
- if (preg_match('|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(/.*)?$|i', $serviceUrl)) {
- App::setServiceUrl($serviceUrl);
- } else {
- $errors[] = App::ERROR_URL_INVALID;
- }
-}
-
-\OCP\JSON::success(array('data'=>$errors));
-exit(); \ No newline at end of file
diff --git a/ownpad_lite/ajax/share.php b/ownpad_lite/ajax/share.php
deleted file mode 100644
index 296d8b417..000000000
--- a/ownpad_lite/ajax/share.php
+++ /dev/null
@@ -1,67 +0,0 @@
-<?php
-
-/**
- * ownCloud - ownpad_lite plugin
- *
- * @author Victor Dubiniuk
- * @copyright 2013 Victor Dubiniuk victor.dubiniuk@gmail.com
- *
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- */
-
-namespace OCA\ownpad_lite;
-
-\OCP\JSON::checkLoggedIn();
-\OCP\JSON::callCheck();
-
-$status = true;
-$recipients = UrlParam::post(UrlParam::SHARE_WITH);
-$source = UrlParam::post(UrlParam::SHARE_WHAT);
-
-if ($source && $recipients) {
- $currentUser = \OCP\User::getUser();
- $nameFrom = \OCP\User::getDisplayName($currentUser);
-
- $subject = App::$l10n->t('Document was shared');
- $message = App::$l10n->t('User %s shared quick document %s with you.', array($nameFrom, $source));
-
- $pattern = '/(.*)\s+<(.*)>$/';
- $recipientList = array(
- 'name' => array(),
- 'email' => array(),
- );
- $sendTo = explode(',', $recipients);
- foreach($sendTo as $recipient) {
- if (preg_match_all($pattern, $recipient, $matches)) {
- // We have 'John Doe <email@example.org>'
- $recipientList['name'][] = $matches[1][0];
- $recipientList['email'][] = $matches[2][0];
- } else {
- // Name is unknown, we have email@example.org
- $recipientList['name'][] = '';
- $recipientList['email'][] = $recipient;
- }
- }
- //We only use the first recipient atm. (OC_Mail doesn't support multiple CC)
- $nameTo = array_shift($recipientList['name']);
- $emailTo = array_shift($recipientList['email']);
-
- try {
- $emailFrom = \OCP\Util::getDefaultEmailAddress('noreply');
- \OCP\Util::sendMail(
- $emailTo, $nameTo, $subject, $message, $emailFrom, $nameFrom
- );
- } catch (Exception $e) {
- $status = false;
- }
-} else {
- $status = false;
-}
-
-if ($status) {
- \OCP\JSON::success(array());
-} else {
- \OCP\JSON::error(array());
-}
-exit(); \ No newline at end of file
diff --git a/ownpad_lite/appinfo/app.php b/ownpad_lite/appinfo/app.php
deleted file mode 100644
index 406b33d34..000000000
--- a/ownpad_lite/appinfo/app.php
+++ /dev/null
@@ -1,102 +0,0 @@
-<?php
-
-/**
- * ownCloud - ownpad_lite plugin
- *
- * @author Victor Dubiniuk
- * @copyright 2012 Victor Dubiniuk victor.dubiniuk@gmail.com
- *
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- */
-
-namespace OCA\ownpad_lite;
-
-class App {
- // Application key
- const APP_ID = 'ownpad_lite';
-
- // config key to store Url of the hosted Etherpad service
- const CONFIG_ETHERPAD_URL = 'etherpad_url';
-
- // Default value for Url of the hosted Etherpad service
- const CONFIG_ETHERPAD_URL_DEFAULT = 'http://beta.etherpad.org/p/';
-
- // Url of the hosted Etherpad solution
- const CONFIG_USERNAME = 'etherpad_username';
-
- const ERROR_URL_INVALID = 'invalid URL';
-
- const ERROR_USERNAME_INVALID = 'invalid username';
-
- // Localization
- static public $l10n;
-
- static public function getServiceUrl() {
- return self::getValue(self::CONFIG_ETHERPAD_URL, self::CONFIG_ETHERPAD_URL_DEFAULT);
- }
-
- static public function setServiceUrl($url) {
- return \OCP\Config::setUserValue(\OCP\User::getUser(), self::APP_ID, self::CONFIG_ETHERPAD_URL, $url);
- }
-
- static public function getUsername() {
- $username = self::getValue(self::CONFIG_USERNAME, \OCP\User::getDisplayName());
- if (!$username) {
- $username = \OCP\User::getUser();
- }
- return $username;
- }
-
- static public function setUsername($username) {
- return \OCP\Config::setUserValue(\OCP\User::getUser(), self::APP_ID, self::CONFIG_USERNAME, $username);
- }
-
- static protected function getValue($key, $defaultValue) {
- return \OCP\Config::getUserValue(\OCP\User::getUser(), self::APP_ID, $key, $defaultValue);
- }
-}
-
-class UrlParam{
- const CONFIG_URL = 'url';
- const CONFIG_USERNAME = 'username';
- const SHARE_SEARCH = 'search';
- const SHARE_WITH = 'target';
- const SHARE_WHAT = 'document';
-
- static public function getParam($key){
- $param = self::post($key);
- if (!$param) {
- $param = self::get($key);
- }
- return $param;
- }
-
- static public function get($key){
- return self::getKey($_POST, $key);
- }
-
- static public function post($key){
-
- return self::getKey($_POST, $key);
- }
-
- static protected function getKey($array, $key){
- if (isset($array[$key])) {
- return $array[$key];
- }
- return false;
- }
-}
-
-App::$l10n = \OCP\Util::getL10N(App::APP_ID);
-
-\OCP\App::addNavigationEntry( array(
- 'id' => 'ownpad_lite_index',
- 'order' => 90,
- 'href' => \OCP\Util::linkTo( App::APP_ID, 'index.php' ),
- 'icon' => \OCP\Util::imagePath( 'settings', 'users.svg' ),
- 'name' => App::$l10n->t('My pad') )
-);
-
-\OC::$CLASSPATH['OCA\ownpad_lite\Contacts'] = App::APP_ID.'/lib/contacts.php'; \ No newline at end of file
diff --git a/ownpad_lite/appinfo/info.xml b/ownpad_lite/appinfo/info.xml
deleted file mode 100644
index 31dffac53..000000000
--- a/ownpad_lite/appinfo/info.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0"?>
-<info>
- <id>ownpad_lite</id>
- <name>ownPad Lite</name>
- <description>ownCloud Etherpad Lite plugin based on etherpad-lite-jquery-plugin by John McLear.</description>
- <licence>AGPL</licence>
- <author>Victor Dubiniuk</author>
- <requiremin>4</requiremin>
-</info>
diff --git a/ownpad_lite/appinfo/routes.php b/ownpad_lite/appinfo/routes.php
deleted file mode 100644
index c21a22687..000000000
--- a/ownpad_lite/appinfo/routes.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-/**
- * Copyright (c) 2013 Thomas Müller
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- * See the COPYING-README file.
- */
-
-// oC JS config
-$this->create('ownpad_lite', 'js/ownpad_lite.js')
- ->actionInclude('ownpad_lite/js/ownpad_lite.php');
-
diff --git a/ownpad_lite/appinfo/version b/ownpad_lite/appinfo/version
deleted file mode 100644
index 2f4536184..000000000
--- a/ownpad_lite/appinfo/version
+++ /dev/null
@@ -1 +0,0 @@
-0.2 \ No newline at end of file
diff --git a/ownpad_lite/css/style.css b/ownpad_lite/css/style.css
deleted file mode 100644
index e31ea1a17..000000000
--- a/ownpad_lite/css/style.css
+++ /dev/null
@@ -1,8 +0,0 @@
-#ownpad-location{padding:0 1em;}
-#ownpad-location #settingsbtn{padding-bottom: 0.2em;vertical-align: middle;}
-#ownpad-location #settingsbtn, #ownpad-open{margin-right:2em;}
-#ownpad-content{padding:0 25px 0 1em;}
-#epframeownpad-content{height:100% !important;}
-#ownpad-appsettings #appsettings_popup{left: 13em;right:auto;width:20em;}
-#ownpad-appsettings #appsettings_popup .arrow.up {right:auto;left:1em}
-#ownpad-appsettings input {width:18em} \ No newline at end of file
diff --git a/ownpad_lite/index.php b/ownpad_lite/index.php
deleted file mode 100644
index 754002ff0..000000000
--- a/ownpad_lite/index.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-
-/**
- * ownCloud - ownpad_lite plugin
- *
- * @author Victor Dubiniuk
- * @copyright 2012 Victor Dubiniuk victor.dubiniuk@gmail.com
- *
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- */
-
-namespace OCA\ownpad_lite;
-
-// Check if we are a user
-\OCP\User::checkLoggedIn();
-\OCP\App::checkAppEnabled(App::APP_ID);
-
-\OCP\Util::addStyle(App::APP_ID, 'style');
-\OCP\Util::addScript(App::APP_ID, 'etherpad');
-\OCP\App::setActiveNavigationEntry('ownpad_lite_index');
-
-
-
-$tmpl = new \OCP\Template(App::APP_ID, "index", "user" );
-
-$tmpl->assign(App::CONFIG_ETHERPAD_URL, App::getServiceUrl());
-$tmpl->assign(App::CONFIG_USERNAME, App::getUsername());
-
-$tmpl->printPage();
diff --git a/ownpad_lite/js/LICENSE.TXT b/ownpad_lite/js/LICENSE.TXT
deleted file mode 100644
index 76a64fc8d..000000000
--- a/ownpad_lite/js/LICENSE.TXT
+++ /dev/null
@@ -1,4 +0,0 @@
-https://github.com/johnyma22/etherpad-lite-jquery-plugin
-
-jQuery Etherpad plugin written by John McLear (c) Primary Technology 2011
-Feel free to re-use, distribute, butcher, edit and whatever else you want. It's under the Apache licence. \ No newline at end of file
diff --git a/ownpad_lite/js/etherpad.js b/ownpad_lite/js/etherpad.js
deleted file mode 100644
index f2479ae1e..000000000
--- a/ownpad_lite/js/etherpad.js
+++ /dev/null
@@ -1,97 +0,0 @@
-(function( $ ){
-
- $.fn.pad = function( options ) {
- var settings = {
- 'host' : 'http://beta.etherpad.org',
- 'baseUrl' : '/p/',
- 'showControls' : false,
- 'showChat' : false,
- 'showLineNumbers' : false,
- 'userName' : 'unnamed',
- 'useMonospaceFont' : false,
- 'noColors' : false,
- 'hideQRCode' : false,
- 'width' : 100,
- 'height' : 100,
- 'border' : 0,
- 'borderStyle' : 'solid',
- 'toggleTextOn' : 'Disable Rich-text',
- 'toggleTextOff' : 'Enable Rich-text'
- };
-
- var $self = this;
- if (!$self.length) return;
- if (!$self.attr('id')) throw new Error('No "id" attribute');
-
- var useValue = $self[0].tagName.toLowerCase() == 'textarea';
- var selfId = $self.attr('id');
- var epframeId = 'epframe'+ selfId;
- // This writes a new frame if required
- if ( !options.getContents ) {
- if ( options ) {
- $.extend( settings, options );
- }
-
- var iFrameLink = '<iframe id="'+epframeId;
- iFrameLink = iFrameLink +'" name="'+epframeId;
- iFrameLink = iFrameLink +'" src="'+settings.host+settings.baseUrl+settings.padId;
- iFrameLink = iFrameLink + '?showControls='+settings.showControls;
- iFrameLink = iFrameLink + '&showChat='+settings.showChat;
- iFrameLink = iFrameLink + '&showLineNumbers='+settings.showLineNumbers;
- iFrameLink = iFrameLink + '&useMonospaceFont='+settings.useMonospaceFont;
- iFrameLink = iFrameLink + '&userName=' + settings.userName;
- iFrameLink = iFrameLink + '&noColors=' + settings.noColors;
- iFrameLink = iFrameLink + '&hideQRCode=' + settings.hideQRCode;
- iFrameLink = iFrameLink +'" style="border:'+settings.border;
- iFrameLink = iFrameLink +'; border-style:'+settings.borderStyle;
-// iFrameLink = iFrameLink +'; width:'+settings.width;
-// iFrameLink = iFrameLink +'; height:'+settings.height;
- iFrameLink = iFrameLink +';" width="'+ '100%';//settings.width;
- iFrameLink = iFrameLink +'" height="'+ settings.height;
- iFrameLink = iFrameLink +'"></iframe>';
-
-
- var $iFrameLink = $(iFrameLink);
-
- if (useValue) {
- var $toggleLink = $('<a href="#'+ selfId +'">'+ settings.toggleTextOn +'</a>').click(function(){
- var $this = $(this);
- $this.toggleClass('active');
- if ($this.hasClass('active')) $this.text(settings.toggleTextOff);
- $self.pad({getContents: true});
- return false;
- });
- $self
- .hide()
- .after($toggleLink)
- .after($iFrameLink)
- ;
- }
- else {
- $self.html(iFrameLink);
- }
- }
-
- // This reads the etherpad contents if required
- else {
- var frameUrl = $('#'+ epframeId).attr('src').split('?')[0];
- var contentsUrl = frameUrl + "/export/html";
-
- // perform an ajax call on contentsUrl and write it to the parent
- $.get(contentsUrl, function(data) {
-
- if (useValue) {
- $self.val(data).show();
- }
- else {
- $self.html(data);
- }
-
- $('#'+ epframeId).remove();
- });
- }
-
-
- return $self;
- };
-})( jQuery ); \ No newline at end of file
diff --git a/ownpad_lite/js/ownpad_lite.php b/ownpad_lite/js/ownpad_lite.php
deleted file mode 100644
index e439877fd..000000000
--- a/ownpad_lite/js/ownpad_lite.php
+++ /dev/null
@@ -1,94 +0,0 @@
-<?php
-/**
- * Copyright (c) 2013 Thomas Müller
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- * See the COPYING-README file.
- */
-
-// Set the content type to Javascript
-header("Content-type: text/javascript");
-
-// Disallow caching
-header("Cache-Control: no-cache, must-revalidate");
-header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
-
-?>
-
-var ownPad = {
- username : '<?php echo OCA\ownpad_lite\App::getUsername() ?>',
- host : '<?php echo OCA\ownpad_lite\App::getServiceUrl() ?>',
- showPad : function() {
- $('#ownpad-content').pad({
- 'showControls' : true,
- 'showChat' : true,
- 'showLineNumbers' : true,
- 'border' : '1px',
- 'padId' : ownPad.getTitle(),
- 'userName' : ownPad.getUsername(),
- 'host' : ownPad.getHost(),
- 'baseUrl' : ''
- });
- },
- getTitle : function() {
- return $('#ownpad-title').val();
- },
- getUsername : function() {
- return ownPad.username;
- },
- setUsername : function(username) {
- ownPad.username = username;
- },
- getHost : function() {
- return ownPad.host;
- },
- setHost : function(host) {
- ownPad.host = host;
- },
- onSearch : function(request, response){
- if (request && request.term){
- $.post(
- OC.filePath('ownpad_lite', 'ajax', 'search.php'),
- {<?php echo OCA\ownpad_lite\UrlParam::SHARE_SEARCH ?>:request.term},
- function(data){
- if (data.status == 'success' && data.data){
- response( data.data );
- }
- }
- );
- }
- },
- onShare : function(){
- var source = ownPad.getHost() + ownPad.getTitle();
- var shareWith = $('#ownpad-share').val();
- if (shareWith.length<3) {
- return;
- }
- $.post(
- OC.filePath('ownpad_lite', 'ajax', 'share.php'),
- {
- <?php echo OCA\ownpad_lite\UrlParam::SHARE_WHAT ?> : source,
- <?php echo OCA\ownpad_lite\UrlParam::SHARE_WITH ?> : shareWith
- },
- ownPad.onShareComplete
- );
- },
- onShareComplete : function(data){
- var successMessage = t('<?php echo OCA\ownpad_lite\App::APP_ID ?>', 'Shared successfully');
- var errorMessage = t('<?php echo OCA\ownpad_lite\App::APP_ID ?>', 'Failed to send notification');
- var message = data && data.status && data.status=='success' ? successMessage : errorMessage ;
- OC.Notification.show(message);
- setTimeout(OC.Notification.hide, 6000);
- }
-};
-
-$('#ownpad-open').click(ownPad.showPad);
-$('#ownpad-share').autocomplete({ minLength: 3, source: ownPad.onSearch});
-$('#ownpad-share-button').click(ownPad.onShare);
-$('#settingsbtn').on('click keydown', function() {
- try {
- OC.appSettings({appid:'ownpad_lite', loadJS:true, cache:false});
- } catch(e) {
- console.log(e);
- }
-}); \ No newline at end of file
diff --git a/ownpad_lite/js/settings.js b/ownpad_lite/js/settings.js
deleted file mode 100644
index 345f5fb14..000000000
--- a/ownpad_lite/js/settings.js
+++ /dev/null
@@ -1,36 +0,0 @@
-$(document).ready(function(){
- $('#appsettings_popup').wrap('<div id="ownpad-appsettings"></div>');
-
- var ownPadSettings = {
- getHost : function(){
- var cleanUrl = $('#etherpad_url').val().match(/^http(s)?:\/\/[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(\/.*)?$/i);
- var url = cleanUrl && cleanUrl[0] ? cleanUrl[0] : '';
- return url;
- },
- getUsername : function(){
- return $('#etherpad_username').val().replace(/[^0-9a-zA-Z\.\-_]*/, '');
- },
- onChange : function(){
- if (ownPadSettings.getHost() && ownPadSettings.getUsername()) {
- $('#ownpad_settings_apply').show();
- } else {
- $('#ownpad_settings_apply').hide();
- }
- },
- save : function() {
- var data = {
- url : ownPadSettings.getHost(),
- username : ownPadSettings.getUsername()
- };
- $.post(OC.filePath('ownpad_lite', 'ajax', 'settings.php'), data, ownPadSettings.afterSave);
- },
- afterSave : function(){
- ownPad.setHost(ownPadSettings.getHost());
- ownPad.setUsername(ownPadSettings.getUsername());
- $('#settingsbtn img').trigger('click');
- }
- };
- $('#etherpad_url').keyup(ownPadSettings.onChange);
- $('#etherpad_username').keyup(ownPadSettings.onChange);
- $('#ownpad_settings_apply').click(ownPadSettings.save);
-}); \ No newline at end of file
diff --git a/ownpad_lite/l10n/.gitkeep b/ownpad_lite/l10n/.gitkeep
deleted file mode 100644
index e69de29bb..000000000
--- a/ownpad_lite/l10n/.gitkeep
+++ /dev/null
diff --git a/ownpad_lite/l10n/af_ZA.js b/ownpad_lite/l10n/af_ZA.js
deleted file mode 100644
index f499b6051..000000000
--- a/ownpad_lite/l10n/af_ZA.js
+++ /dev/null
@@ -1,8 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Settings" : "Instellings",
- "Share" : "Deel",
- "Username" : "Gebruikersnaam"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/af_ZA.json b/ownpad_lite/l10n/af_ZA.json
deleted file mode 100644
index 193d28c96..000000000
--- a/ownpad_lite/l10n/af_ZA.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{ "translations": {
- "Settings" : "Instellings",
- "Share" : "Deel",
- "Username" : "Gebruikersnaam"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/ar.js b/ownpad_lite/l10n/ar.js
deleted file mode 100644
index 75d26f027..000000000
--- a/ownpad_lite/l10n/ar.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "تم مشاركة الملف",
- "User %s shared quick document %s with you." : "المستخدم %s قام بمشاركتك الملف %s ",
- "My pad" : "دفتري",
- "Settings" : "إعدادات",
- "Pad Title" : "عنوان الدفتر",
- "Open" : "افتح",
- "Share with" : "شارك مع",
- "Share" : "شارك",
- "Etherpad service URL" : "وصلة خدمة تنسيق الدفتر",
- "Username" : "إسم المستخدم",
- "Save" : "حفظ"
-},
-"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;");
diff --git a/ownpad_lite/l10n/ar.json b/ownpad_lite/l10n/ar.json
deleted file mode 100644
index ce9f5ea19..000000000
--- a/ownpad_lite/l10n/ar.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "تم مشاركة الملف",
- "User %s shared quick document %s with you." : "المستخدم %s قام بمشاركتك الملف %s ",
- "My pad" : "دفتري",
- "Settings" : "إعدادات",
- "Pad Title" : "عنوان الدفتر",
- "Open" : "افتح",
- "Share with" : "شارك مع",
- "Share" : "شارك",
- "Etherpad service URL" : "وصلة خدمة تنسيق الدفتر",
- "Username" : "إسم المستخدم",
- "Save" : "حفظ"
-},"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/ast.js b/ownpad_lite/l10n/ast.js
deleted file mode 100644
index 5d9b5fa05..000000000
--- a/ownpad_lite/l10n/ast.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Compartióse'l documentu",
- "User %s shared quick document %s with you." : "L'usuariu %s compartió'l documentu %s contigo.",
- "My pad" : "El mio pad",
- "Settings" : "Axustes",
- "Pad Title" : "Títulu del pad",
- "Open" : "Abrir",
- "Share with" : "Compartir con",
- "Share" : "Compartir",
- "Etherpad service URL" : "URL del serviciu Etherpad",
- "Username" : "Nome d'usuariu",
- "Save" : "Guardar"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/ast.json b/ownpad_lite/l10n/ast.json
deleted file mode 100644
index 138be8dc5..000000000
--- a/ownpad_lite/l10n/ast.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Compartióse'l documentu",
- "User %s shared quick document %s with you." : "L'usuariu %s compartió'l documentu %s contigo.",
- "My pad" : "El mio pad",
- "Settings" : "Axustes",
- "Pad Title" : "Títulu del pad",
- "Open" : "Abrir",
- "Share with" : "Compartir con",
- "Share" : "Compartir",
- "Etherpad service URL" : "URL del serviciu Etherpad",
- "Username" : "Nome d'usuariu",
- "Save" : "Guardar"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/az.js b/ownpad_lite/l10n/az.js
deleted file mode 100644
index bfae41cbb..000000000
--- a/ownpad_lite/l10n/az.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Sənəd yayımlandı",
- "User %s shared quick document %s with you." : "İstifadəçi %s təcili sənədi yayımladı %s sizinlə.",
- "My pad" : "Mənim qeydiyyatım",
- "Settings" : "Quraşdırmalar",
- "Pad Title" : "Pad başlıq",
- "Open" : "Aç",
- "Share with" : "Bununla yaımla",
- "Share" : "Yayımla",
- "Etherpad service URL" : "Etherpad URL xidməti",
- "Username" : "İstifadəçi adı",
- "Save" : "Saxlamaq"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/az.json b/ownpad_lite/l10n/az.json
deleted file mode 100644
index d94ef4391..000000000
--- a/ownpad_lite/l10n/az.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Sənəd yayımlandı",
- "User %s shared quick document %s with you." : "İstifadəçi %s təcili sənədi yayımladı %s sizinlə.",
- "My pad" : "Mənim qeydiyyatım",
- "Settings" : "Quraşdırmalar",
- "Pad Title" : "Pad başlıq",
- "Open" : "Aç",
- "Share with" : "Bununla yaımla",
- "Share" : "Yayımla",
- "Etherpad service URL" : "Etherpad URL xidməti",
- "Username" : "İstifadəçi adı",
- "Save" : "Saxlamaq"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/be.js b/ownpad_lite/l10n/be.js
deleted file mode 100644
index 1a11ea430..000000000
--- a/ownpad_lite/l10n/be.js
+++ /dev/null
@@ -1,6 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Settings" : "Налады"
-},
-"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);");
diff --git a/ownpad_lite/l10n/be.json b/ownpad_lite/l10n/be.json
deleted file mode 100644
index 3f70a0783..000000000
--- a/ownpad_lite/l10n/be.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{ "translations": {
- "Settings" : "Налады"
-},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/bg_BG.js b/ownpad_lite/l10n/bg_BG.js
deleted file mode 100644
index d41076104..000000000
--- a/ownpad_lite/l10n/bg_BG.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Документът беше споделен",
- "User %s shared quick document %s with you." : "Потребителят %s сподели документа %s с теб.",
- "My pad" : "Моят тефтер",
- "Settings" : "Настройки",
- "Pad Title" : "Заглавие",
- "Open" : "Отвори",
- "Share with" : "Сподели с",
- "Share" : "Сподели",
- "Etherpad service URL" : "Сервизен интернет адрес за Etherpad",
- "Username" : "Потребителско Име",
- "Save" : "Запиши"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/bg_BG.json b/ownpad_lite/l10n/bg_BG.json
deleted file mode 100644
index 75d0a6e8d..000000000
--- a/ownpad_lite/l10n/bg_BG.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Документът беше споделен",
- "User %s shared quick document %s with you." : "Потребителят %s сподели документа %s с теб.",
- "My pad" : "Моят тефтер",
- "Settings" : "Настройки",
- "Pad Title" : "Заглавие",
- "Open" : "Отвори",
- "Share with" : "Сподели с",
- "Share" : "Сподели",
- "Etherpad service URL" : "Сервизен интернет адрес за Etherpad",
- "Username" : "Потребителско Име",
- "Save" : "Запиши"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/bn_BD.js b/ownpad_lite/l10n/bn_BD.js
deleted file mode 100644
index 8c23b5c91..000000000
--- a/ownpad_lite/l10n/bn_BD.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "ডকুমেন্ট ভাগাভাগি করা হয়েছে",
- "User %s shared quick document %s with you." : "%s ব্যাবহারকারী %s কুইক ডকুমেন্টটি আপনার সাথে ভাগাভাগি করেছে।",
- "My pad" : "আমার প্যাড",
- "Settings" : "নিয়ামকসমূহ",
- "Pad Title" : "প্যাড শিরোনাম",
- "Open" : "খোল",
- "Share with" : "যাদের সাথে ভাগাভাগি করা হয়েছে",
- "Share" : "ভাগাভাগি কর",
- "Etherpad service URL" : "Etherpad সেবার URL",
- "Username" : "ব্যবহারকারি",
- "Save" : "সংরক্ষণ কর"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/bn_BD.json b/ownpad_lite/l10n/bn_BD.json
deleted file mode 100644
index 13c9f9be5..000000000
--- a/ownpad_lite/l10n/bn_BD.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "ডকুমেন্ট ভাগাভাগি করা হয়েছে",
- "User %s shared quick document %s with you." : "%s ব্যাবহারকারী %s কুইক ডকুমেন্টটি আপনার সাথে ভাগাভাগি করেছে।",
- "My pad" : "আমার প্যাড",
- "Settings" : "নিয়ামকসমূহ",
- "Pad Title" : "প্যাড শিরোনাম",
- "Open" : "খোল",
- "Share with" : "যাদের সাথে ভাগাভাগি করা হয়েছে",
- "Share" : "ভাগাভাগি কর",
- "Etherpad service URL" : "Etherpad সেবার URL",
- "Username" : "ব্যবহারকারি",
- "Save" : "সংরক্ষণ কর"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/bn_IN.js b/ownpad_lite/l10n/bn_IN.js
deleted file mode 100644
index f3b64ffb1..000000000
--- a/ownpad_lite/l10n/bn_IN.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "ডকুমেন্ট শেয়ার করা হয়েছিল",
- "User %s shared quick document %s with you." : "ব্যবহারকারী %s আপনার সাথে দ্রুত দস্তাবেজ %s গুলি ভাগ করেছে.",
- "My pad" : "আমার প্যাড",
- "Settings" : "সেটিংস",
- "Pad Title" : "প্যাডের পদবী",
- "Open" : "খোলা",
- "Share with" : "সাথে ভাগ করুন",
- "Share" : "শেয়ার",
- "Etherpad service URL" : "Etherpad পরিসেবার URL টি",
- "Username" : "ইউজারনেম",
- "Save" : "সেভ"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/bn_IN.json b/ownpad_lite/l10n/bn_IN.json
deleted file mode 100644
index 3882f0227..000000000
--- a/ownpad_lite/l10n/bn_IN.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "ডকুমেন্ট শেয়ার করা হয়েছিল",
- "User %s shared quick document %s with you." : "ব্যবহারকারী %s আপনার সাথে দ্রুত দস্তাবেজ %s গুলি ভাগ করেছে.",
- "My pad" : "আমার প্যাড",
- "Settings" : "সেটিংস",
- "Pad Title" : "প্যাডের পদবী",
- "Open" : "খোলা",
- "Share with" : "সাথে ভাগ করুন",
- "Share" : "শেয়ার",
- "Etherpad service URL" : "Etherpad পরিসেবার URL টি",
- "Username" : "ইউজারনেম",
- "Save" : "সেভ"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/bs.js b/ownpad_lite/l10n/bs.js
deleted file mode 100644
index 054dc4504..000000000
--- a/ownpad_lite/l10n/bs.js
+++ /dev/null
@@ -1,10 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Settings" : "Postavke",
- "Open" : "Otvori",
- "Share" : "Podijeli",
- "Username" : "Korisničko ime",
- "Save" : "Spasi"
-},
-"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/ownpad_lite/l10n/bs.json b/ownpad_lite/l10n/bs.json
deleted file mode 100644
index df42414b9..000000000
--- a/ownpad_lite/l10n/bs.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{ "translations": {
- "Settings" : "Postavke",
- "Open" : "Otvori",
- "Share" : "Podijeli",
- "Username" : "Korisničko ime",
- "Save" : "Spasi"
-},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/ca.js b/ownpad_lite/l10n/ca.js
deleted file mode 100644
index 219c52ed8..000000000
--- a/ownpad_lite/l10n/ca.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "S'ha compartit el document",
- "User %s shared quick document %s with you." : "L'usuari %s ha compartit el document %s amb vós.",
- "My pad" : "El meu pad",
- "Settings" : "Configuració",
- "Pad Title" : "Títol del pad",
- "Open" : "Obre",
- "Share with" : "Comparteix amb",
- "Share" : "Comparteix",
- "Etherpad service URL" : "URL del servei Etherpad",
- "Username" : "Nom d'usuari",
- "Save" : "Desar"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/ca.json b/ownpad_lite/l10n/ca.json
deleted file mode 100644
index f87dc7a9c..000000000
--- a/ownpad_lite/l10n/ca.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "S'ha compartit el document",
- "User %s shared quick document %s with you." : "L'usuari %s ha compartit el document %s amb vós.",
- "My pad" : "El meu pad",
- "Settings" : "Configuració",
- "Pad Title" : "Títol del pad",
- "Open" : "Obre",
- "Share with" : "Comparteix amb",
- "Share" : "Comparteix",
- "Etherpad service URL" : "URL del servei Etherpad",
- "Username" : "Nom d'usuari",
- "Save" : "Desar"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/cs_CZ.js b/ownpad_lite/l10n/cs_CZ.js
deleted file mode 100644
index 5d3e7bb81..000000000
--- a/ownpad_lite/l10n/cs_CZ.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Dokument byl sdílen",
- "User %s shared quick document %s with you." : "Uživatel %s s vámi sdílí dokument %s.",
- "My pad" : "Můj blok",
- "Settings" : "Nastavení",
- "Pad Title" : "Název bloku",
- "Open" : "Otevřít",
- "Share with" : "Sdílet s",
- "Share" : "Sdílet",
- "Etherpad service URL" : "URL služby Etherpad",
- "Username" : "Uživatelské jméno",
- "Save" : "Uložit"
-},
-"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;");
diff --git a/ownpad_lite/l10n/cs_CZ.json b/ownpad_lite/l10n/cs_CZ.json
deleted file mode 100644
index 3c8af987e..000000000
--- a/ownpad_lite/l10n/cs_CZ.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Dokument byl sdílen",
- "User %s shared quick document %s with you." : "Uživatel %s s vámi sdílí dokument %s.",
- "My pad" : "Můj blok",
- "Settings" : "Nastavení",
- "Pad Title" : "Název bloku",
- "Open" : "Otevřít",
- "Share with" : "Sdílet s",
- "Share" : "Sdílet",
- "Etherpad service URL" : "URL služby Etherpad",
- "Username" : "Uživatelské jméno",
- "Save" : "Uložit"
-},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/cy_GB.js b/ownpad_lite/l10n/cy_GB.js
deleted file mode 100644
index 5f6af0927..000000000
--- a/ownpad_lite/l10n/cy_GB.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Rhannwyd y ddogfen",
- "User %s shared quick document %s with you." : "Rhannodd defnyddiwr %s ddogfen gyflym %s â chi.",
- "My pad" : "Fy mhad",
- "Settings" : "Gosodiadau",
- "Pad Title" : "Teitl y Pad",
- "Open" : "Agor",
- "Share with" : "Rhannu gyda",
- "Share" : "Rhannu",
- "Etherpad service URL" : "URL gwasanaeth Etherpad",
- "Username" : "Enw defnyddiwr",
- "Save" : "Cadw"
-},
-"nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;");
diff --git a/ownpad_lite/l10n/cy_GB.json b/ownpad_lite/l10n/cy_GB.json
deleted file mode 100644
index 908d42e0d..000000000
--- a/ownpad_lite/l10n/cy_GB.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Rhannwyd y ddogfen",
- "User %s shared quick document %s with you." : "Rhannodd defnyddiwr %s ddogfen gyflym %s â chi.",
- "My pad" : "Fy mhad",
- "Settings" : "Gosodiadau",
- "Pad Title" : "Teitl y Pad",
- "Open" : "Agor",
- "Share with" : "Rhannu gyda",
- "Share" : "Rhannu",
- "Etherpad service URL" : "URL gwasanaeth Etherpad",
- "Username" : "Enw defnyddiwr",
- "Save" : "Cadw"
-},"pluralForm" :"nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/da.js b/ownpad_lite/l10n/da.js
deleted file mode 100644
index 190d7ba8c..000000000
--- a/ownpad_lite/l10n/da.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Dokumentet blev delt",
- "User %s shared quick document %s with you." : "Brugeren %s delte dokumentet %s med dig.",
- "My pad" : "Min blok",
- "Settings" : "Indstillinger",
- "Pad Title" : "Titel på blok",
- "Open" : "Åbn",
- "Share with" : "Del med",
- "Share" : "Del",
- "Etherpad service URL" : "URL for Etherpad-tjeneste",
- "Username" : "Brugernavn",
- "Save" : "Gem"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/da.json b/ownpad_lite/l10n/da.json
deleted file mode 100644
index cab167c37..000000000
--- a/ownpad_lite/l10n/da.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Dokumentet blev delt",
- "User %s shared quick document %s with you." : "Brugeren %s delte dokumentet %s med dig.",
- "My pad" : "Min blok",
- "Settings" : "Indstillinger",
- "Pad Title" : "Titel på blok",
- "Open" : "Åbn",
- "Share with" : "Del med",
- "Share" : "Del",
- "Etherpad service URL" : "URL for Etherpad-tjeneste",
- "Username" : "Brugernavn",
- "Save" : "Gem"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/de.js b/ownpad_lite/l10n/de.js
deleted file mode 100644
index 34cc1d762..000000000
--- a/ownpad_lite/l10n/de.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Dokument wurde geteilt",
- "User %s shared quick document %s with you." : "Benutzer %s teilte das Dokument %s mit Ihnen.",
- "My pad" : "Mein Pad",
- "Settings" : "Einstellungen",
- "Pad Title" : "Titel des Pads",
- "Open" : "Öffnen",
- "Share with" : "Teilen mit",
- "Share" : "Teilen",
- "Etherpad service URL" : "URL des Etherpad-Service",
- "Username" : "Benutzername",
- "Save" : "Speichern"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/de.json b/ownpad_lite/l10n/de.json
deleted file mode 100644
index a9c300073..000000000
--- a/ownpad_lite/l10n/de.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Dokument wurde geteilt",
- "User %s shared quick document %s with you." : "Benutzer %s teilte das Dokument %s mit Ihnen.",
- "My pad" : "Mein Pad",
- "Settings" : "Einstellungen",
- "Pad Title" : "Titel des Pads",
- "Open" : "Öffnen",
- "Share with" : "Teilen mit",
- "Share" : "Teilen",
- "Etherpad service URL" : "URL des Etherpad-Service",
- "Username" : "Benutzername",
- "Save" : "Speichern"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/de_AT.js b/ownpad_lite/l10n/de_AT.js
deleted file mode 100644
index 76b927b06..000000000
--- a/ownpad_lite/l10n/de_AT.js
+++ /dev/null
@@ -1,9 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Settings" : "Einstellungen",
- "Share" : "Freigeben",
- "Username" : "Benutzername",
- "Save" : "Speichern"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/de_AT.json b/ownpad_lite/l10n/de_AT.json
deleted file mode 100644
index b1a363188..000000000
--- a/ownpad_lite/l10n/de_AT.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{ "translations": {
- "Settings" : "Einstellungen",
- "Share" : "Freigeben",
- "Username" : "Benutzername",
- "Save" : "Speichern"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/de_DE.js b/ownpad_lite/l10n/de_DE.js
deleted file mode 100644
index aefab2ff3..000000000
--- a/ownpad_lite/l10n/de_DE.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Das Dokument wurde geteilt",
- "User %s shared quick document %s with you." : "Der Benutzer %s teilte das Dokument %s mit Ihnen.",
- "My pad" : "Mein Pad",
- "Settings" : "Einstellungen",
- "Pad Title" : "Titel des Pads",
- "Open" : "Öffnen",
- "Share with" : "Teilen mit",
- "Share" : "Teilen",
- "Etherpad service URL" : "URL des Etherpad-Service",
- "Username" : "Benutzername",
- "Save" : "Speichern"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/de_DE.json b/ownpad_lite/l10n/de_DE.json
deleted file mode 100644
index d87aba482..000000000
--- a/ownpad_lite/l10n/de_DE.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Das Dokument wurde geteilt",
- "User %s shared quick document %s with you." : "Der Benutzer %s teilte das Dokument %s mit Ihnen.",
- "My pad" : "Mein Pad",
- "Settings" : "Einstellungen",
- "Pad Title" : "Titel des Pads",
- "Open" : "Öffnen",
- "Share with" : "Teilen mit",
- "Share" : "Teilen",
- "Etherpad service URL" : "URL des Etherpad-Service",
- "Username" : "Benutzername",
- "Save" : "Speichern"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/el.js b/ownpad_lite/l10n/el.js
deleted file mode 100644
index bed1bc085..000000000
--- a/ownpad_lite/l10n/el.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Το έγγραφο διαμοιράστηκε",
- "User %s shared quick document %s with you." : "Ο χρήστης %s διαμοίρασε το γρήγορο έγγραφο %s με σας.",
- "My pad" : "Το pad μου",
- "Settings" : "Ρυθμίσεις",
- "Pad Title" : "Τίτλος Pad",
- "Open" : "Άνοιγμα",
- "Share with" : "Διαμοιρασμός με",
- "Share" : "Διαμοιρασμός",
- "Etherpad service URL" : "URL υπηρεσίας Etherpad",
- "Username" : "Όνομα χρήστη",
- "Save" : "Αποθήκευση"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/el.json b/ownpad_lite/l10n/el.json
deleted file mode 100644
index fba604eda..000000000
--- a/ownpad_lite/l10n/el.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Το έγγραφο διαμοιράστηκε",
- "User %s shared quick document %s with you." : "Ο χρήστης %s διαμοίρασε το γρήγορο έγγραφο %s με σας.",
- "My pad" : "Το pad μου",
- "Settings" : "Ρυθμίσεις",
- "Pad Title" : "Τίτλος Pad",
- "Open" : "Άνοιγμα",
- "Share with" : "Διαμοιρασμός με",
- "Share" : "Διαμοιρασμός",
- "Etherpad service URL" : "URL υπηρεσίας Etherpad",
- "Username" : "Όνομα χρήστη",
- "Save" : "Αποθήκευση"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/en_GB.js b/ownpad_lite/l10n/en_GB.js
deleted file mode 100644
index 8bfd00d3d..000000000
--- a/ownpad_lite/l10n/en_GB.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Document was shared",
- "User %s shared quick document %s with you." : "User %s shared quick document %s with you.",
- "My pad" : "My pad",
- "Settings" : "Settings",
- "Pad Title" : "Pad Title",
- "Open" : "Open",
- "Share with" : "Share with",
- "Share" : "Share",
- "Etherpad service URL" : "Etherpad service URL",
- "Username" : "Username",
- "Save" : "Save"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/en_GB.json b/ownpad_lite/l10n/en_GB.json
deleted file mode 100644
index 18e9a87f1..000000000
--- a/ownpad_lite/l10n/en_GB.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Document was shared",
- "User %s shared quick document %s with you." : "User %s shared quick document %s with you.",
- "My pad" : "My pad",
- "Settings" : "Settings",
- "Pad Title" : "Pad Title",
- "Open" : "Open",
- "Share with" : "Share with",
- "Share" : "Share",
- "Etherpad service URL" : "Etherpad service URL",
- "Username" : "Username",
- "Save" : "Save"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/eo.js b/ownpad_lite/l10n/eo.js
deleted file mode 100644
index 7f0689273..000000000
--- a/ownpad_lite/l10n/eo.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Dokumento kunhaviĝis",
- "User %s shared quick document %s with you." : "Uzanto %s kunhavigis rapidan dokumenton %s kun vi.",
- "My pad" : "Miaj skribaĵoj",
- "Settings" : "Agordo",
- "Pad Title" : "Titolo de la skribaĵo",
- "Open" : "Malfermi",
- "Share with" : "Kunhavigi kun",
- "Share" : "Kunhavigi",
- "Etherpad service URL" : "URL de Etherpad-servo",
- "Username" : "Uzantonomo",
- "Save" : "Konservi"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/eo.json b/ownpad_lite/l10n/eo.json
deleted file mode 100644
index 79acba9b5..000000000
--- a/ownpad_lite/l10n/eo.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Dokumento kunhaviĝis",
- "User %s shared quick document %s with you." : "Uzanto %s kunhavigis rapidan dokumenton %s kun vi.",
- "My pad" : "Miaj skribaĵoj",
- "Settings" : "Agordo",
- "Pad Title" : "Titolo de la skribaĵo",
- "Open" : "Malfermi",
- "Share with" : "Kunhavigi kun",
- "Share" : "Kunhavigi",
- "Etherpad service URL" : "URL de Etherpad-servo",
- "Username" : "Uzantonomo",
- "Save" : "Konservi"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/es.js b/ownpad_lite/l10n/es.js
deleted file mode 100644
index 9ef9c71b3..000000000
--- a/ownpad_lite/l10n/es.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "El documento ha sido compartido",
- "User %s shared quick document %s with you." : "El usuario %s ha compartido el documento %s contigo",
- "My pad" : "Mi pad",
- "Settings" : "Ajustes",
- "Pad Title" : "Título del pad",
- "Open" : "Abrir",
- "Share with" : "Compartir con",
- "Share" : "Compartir",
- "Etherpad service URL" : "URL del servicio Etherpad",
- "Username" : "Nombre de usuario",
- "Save" : "Guardar"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/es.json b/ownpad_lite/l10n/es.json
deleted file mode 100644
index fd033ee5c..000000000
--- a/ownpad_lite/l10n/es.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "El documento ha sido compartido",
- "User %s shared quick document %s with you." : "El usuario %s ha compartido el documento %s contigo",
- "My pad" : "Mi pad",
- "Settings" : "Ajustes",
- "Pad Title" : "Título del pad",
- "Open" : "Abrir",
- "Share with" : "Compartir con",
- "Share" : "Compartir",
- "Etherpad service URL" : "URL del servicio Etherpad",
- "Username" : "Nombre de usuario",
- "Save" : "Guardar"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/es_AR.js b/ownpad_lite/l10n/es_AR.js
deleted file mode 100644
index 267b9875f..000000000
--- a/ownpad_lite/l10n/es_AR.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "El documento fue compartido",
- "User %s shared quick document %s with you." : "El usuario %s compartió el documento %s con vos",
- "My pad" : "Mi pad",
- "Settings" : "Ajustes",
- "Pad Title" : "Título del pad",
- "Open" : "Abrir",
- "Share with" : "Compartir con",
- "Share" : "Compartir",
- "Etherpad service URL" : "URL del servicio Etherpad",
- "Username" : "Nombre del usuario",
- "Save" : "Guardar"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/es_AR.json b/ownpad_lite/l10n/es_AR.json
deleted file mode 100644
index 29d72b351..000000000
--- a/ownpad_lite/l10n/es_AR.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "El documento fue compartido",
- "User %s shared quick document %s with you." : "El usuario %s compartió el documento %s con vos",
- "My pad" : "Mi pad",
- "Settings" : "Ajustes",
- "Pad Title" : "Título del pad",
- "Open" : "Abrir",
- "Share with" : "Compartir con",
- "Share" : "Compartir",
- "Etherpad service URL" : "URL del servicio Etherpad",
- "Username" : "Nombre del usuario",
- "Save" : "Guardar"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/es_CL.js b/ownpad_lite/l10n/es_CL.js
deleted file mode 100644
index 7e02c7ca5..000000000
--- a/ownpad_lite/l10n/es_CL.js
+++ /dev/null
@@ -1,8 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Settings" : "Configuración",
- "Share" : "Compartir",
- "Username" : "Usuario"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/es_CL.json b/ownpad_lite/l10n/es_CL.json
deleted file mode 100644
index e015b0077..000000000
--- a/ownpad_lite/l10n/es_CL.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{ "translations": {
- "Settings" : "Configuración",
- "Share" : "Compartir",
- "Username" : "Usuario"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/es_MX.js b/ownpad_lite/l10n/es_MX.js
deleted file mode 100644
index 9ef9c71b3..000000000
--- a/ownpad_lite/l10n/es_MX.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "El documento ha sido compartido",
- "User %s shared quick document %s with you." : "El usuario %s ha compartido el documento %s contigo",
- "My pad" : "Mi pad",
- "Settings" : "Ajustes",
- "Pad Title" : "Título del pad",
- "Open" : "Abrir",
- "Share with" : "Compartir con",
- "Share" : "Compartir",
- "Etherpad service URL" : "URL del servicio Etherpad",
- "Username" : "Nombre de usuario",
- "Save" : "Guardar"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/es_MX.json b/ownpad_lite/l10n/es_MX.json
deleted file mode 100644
index fd033ee5c..000000000
--- a/ownpad_lite/l10n/es_MX.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "El documento ha sido compartido",
- "User %s shared quick document %s with you." : "El usuario %s ha compartido el documento %s contigo",
- "My pad" : "Mi pad",
- "Settings" : "Ajustes",
- "Pad Title" : "Título del pad",
- "Open" : "Abrir",
- "Share with" : "Compartir con",
- "Share" : "Compartir",
- "Etherpad service URL" : "URL del servicio Etherpad",
- "Username" : "Nombre de usuario",
- "Save" : "Guardar"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/et_EE.js b/ownpad_lite/l10n/et_EE.js
deleted file mode 100644
index c57a4b2a0..000000000
--- a/ownpad_lite/l10n/et_EE.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Dokument jagati",
- "User %s shared quick document %s with you." : "Kasutaja %s jagas sinuga kiirdokumendi %s. ",
- "My pad" : "Minu märkmik",
- "Settings" : "Seaded",
- "Pad Title" : "Märkmiku pealkiri",
- "Open" : "Ava",
- "Share with" : "Jaga",
- "Share" : "Jaga",
- "Etherpad service URL" : "Etherpad teenuse URL",
- "Username" : "Kasutajanimi",
- "Save" : "Salvesta"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/et_EE.json b/ownpad_lite/l10n/et_EE.json
deleted file mode 100644
index 9c37290ca..000000000
--- a/ownpad_lite/l10n/et_EE.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Dokument jagati",
- "User %s shared quick document %s with you." : "Kasutaja %s jagas sinuga kiirdokumendi %s. ",
- "My pad" : "Minu märkmik",
- "Settings" : "Seaded",
- "Pad Title" : "Märkmiku pealkiri",
- "Open" : "Ava",
- "Share with" : "Jaga",
- "Share" : "Jaga",
- "Etherpad service URL" : "Etherpad teenuse URL",
- "Username" : "Kasutajanimi",
- "Save" : "Salvesta"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/eu.js b/ownpad_lite/l10n/eu.js
deleted file mode 100644
index e7b3a0296..000000000
--- a/ownpad_lite/l10n/eu.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Dokumentua elkarbanatu da",
- "User %s shared quick document %s with you." : "%s erabiltzaileak zurekin %s dokumentua elkarbanatu du.",
- "My pad" : "Nire Pad-a",
- "Settings" : "Ezarpenak",
- "Pad Title" : "Pad-aren izenburua",
- "Open" : "Ireki",
- "Share with" : "Elkarbanatu honekin",
- "Share" : "Elkarbanatu",
- "Etherpad service URL" : "Etherpad zerbitzuaren URLa",
- "Username" : "Erabiltzaile izena",
- "Save" : "Gorde"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/eu.json b/ownpad_lite/l10n/eu.json
deleted file mode 100644
index d9ca77629..000000000
--- a/ownpad_lite/l10n/eu.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Dokumentua elkarbanatu da",
- "User %s shared quick document %s with you." : "%s erabiltzaileak zurekin %s dokumentua elkarbanatu du.",
- "My pad" : "Nire Pad-a",
- "Settings" : "Ezarpenak",
- "Pad Title" : "Pad-aren izenburua",
- "Open" : "Ireki",
- "Share with" : "Elkarbanatu honekin",
- "Share" : "Elkarbanatu",
- "Etherpad service URL" : "Etherpad zerbitzuaren URLa",
- "Username" : "Erabiltzaile izena",
- "Save" : "Gorde"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/eu_ES.js b/ownpad_lite/l10n/eu_ES.js
deleted file mode 100644
index 464fb84d1..000000000
--- a/ownpad_lite/l10n/eu_ES.js
+++ /dev/null
@@ -1,6 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Save" : "Gorde"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/eu_ES.json b/ownpad_lite/l10n/eu_ES.json
deleted file mode 100644
index 7a78f4bec..000000000
--- a/ownpad_lite/l10n/eu_ES.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{ "translations": {
- "Save" : "Gorde"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/fa.js b/ownpad_lite/l10n/fa.js
deleted file mode 100644
index 1f64ab305..000000000
--- a/ownpad_lite/l10n/fa.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "مستند به اشتراک گذاشته شد",
- "User %s shared quick document %s with you." : "کاربر %s مستند %s را سریع به اشتراک گذاشت.",
- "My pad" : "دفتر یادداشت من",
- "Settings" : "تنظیمات",
- "Pad Title" : "عنوان دفتر یادداشت",
- "Open" : "باز کردن",
- "Share with" : "به اشتراک گذاشتن با",
- "Share" : "اشتراک‌گذاری",
- "Etherpad service URL" : " آدرس سرویس Etherpad",
- "Username" : "نام کاربری",
- "Save" : "ذخیره"
-},
-"nplurals=1; plural=0;");
diff --git a/ownpad_lite/l10n/fa.json b/ownpad_lite/l10n/fa.json
deleted file mode 100644
index 04e3703af..000000000
--- a/ownpad_lite/l10n/fa.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "مستند به اشتراک گذاشته شد",
- "User %s shared quick document %s with you." : "کاربر %s مستند %s را سریع به اشتراک گذاشت.",
- "My pad" : "دفتر یادداشت من",
- "Settings" : "تنظیمات",
- "Pad Title" : "عنوان دفتر یادداشت",
- "Open" : "باز کردن",
- "Share with" : "به اشتراک گذاشتن با",
- "Share" : "اشتراک‌گذاری",
- "Etherpad service URL" : " آدرس سرویس Etherpad",
- "Username" : "نام کاربری",
- "Save" : "ذخیره"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/fi.js b/ownpad_lite/l10n/fi.js
deleted file mode 100644
index f70be984c..000000000
--- a/ownpad_lite/l10n/fi.js
+++ /dev/null
@@ -1,8 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Settings" : "Asetukset",
- "Username" : "Käyttäjätunnus",
- "Save" : "Tallenna"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/fi.json b/ownpad_lite/l10n/fi.json
deleted file mode 100644
index 41b23343f..000000000
--- a/ownpad_lite/l10n/fi.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{ "translations": {
- "Settings" : "Asetukset",
- "Username" : "Käyttäjätunnus",
- "Save" : "Tallenna"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/fi_FI.js b/ownpad_lite/l10n/fi_FI.js
deleted file mode 100644
index b606cfc22..000000000
--- a/ownpad_lite/l10n/fi_FI.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Asiakirja jaettiin",
- "User %s shared quick document %s with you." : "Käyttäjä %s jakoi asiakirjan %s kanssasi.",
- "My pad" : "Oma muistio",
- "Settings" : "Asetukset",
- "Pad Title" : "Muistion nimi",
- "Open" : "Avaa",
- "Share with" : "Jaa",
- "Share" : "Jaa",
- "Etherpad service URL" : "Etherpad-palvelun osoite",
- "Username" : "Käyttäjätunnus",
- "Save" : "Tallenna"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/fi_FI.json b/ownpad_lite/l10n/fi_FI.json
deleted file mode 100644
index d3dbe2740..000000000
--- a/ownpad_lite/l10n/fi_FI.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Asiakirja jaettiin",
- "User %s shared quick document %s with you." : "Käyttäjä %s jakoi asiakirjan %s kanssasi.",
- "My pad" : "Oma muistio",
- "Settings" : "Asetukset",
- "Pad Title" : "Muistion nimi",
- "Open" : "Avaa",
- "Share with" : "Jaa",
- "Share" : "Jaa",
- "Etherpad service URL" : "Etherpad-palvelun osoite",
- "Username" : "Käyttäjätunnus",
- "Save" : "Tallenna"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/fil.js b/ownpad_lite/l10n/fil.js
deleted file mode 100644
index 2a234ee66..000000000
--- a/ownpad_lite/l10n/fil.js
+++ /dev/null
@@ -1,8 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Open" : "Buksan",
- "Share" : "I-share",
- "Username" : "Username"
-},
-"nplurals=2; plural=(n > 1);");
diff --git a/ownpad_lite/l10n/fil.json b/ownpad_lite/l10n/fil.json
deleted file mode 100644
index d9ea442d3..000000000
--- a/ownpad_lite/l10n/fil.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{ "translations": {
- "Open" : "Buksan",
- "Share" : "I-share",
- "Username" : "Username"
-},"pluralForm" :"nplurals=2; plural=(n > 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/fr.js b/ownpad_lite/l10n/fr.js
deleted file mode 100644
index 51f9a8567..000000000
--- a/ownpad_lite/l10n/fr.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Le document a été partagé",
- "User %s shared quick document %s with you." : "L'utilisateur %s a partagé le document rapide %s avec vous.",
- "My pad" : "Mon Pad",
- "Settings" : "Paramètres",
- "Pad Title" : "Nom du Pad",
- "Open" : "Ouvrir",
- "Share with" : "Partager avec",
- "Share" : "Partager",
- "Etherpad service URL" : "URL du service Etherpad",
- "Username" : "Nom d'utilisateur",
- "Save" : "Sauvegarder"
-},
-"nplurals=2; plural=(n > 1);");
diff --git a/ownpad_lite/l10n/fr.json b/ownpad_lite/l10n/fr.json
deleted file mode 100644
index 1de7afdf2..000000000
--- a/ownpad_lite/l10n/fr.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Le document a été partagé",
- "User %s shared quick document %s with you." : "L'utilisateur %s a partagé le document rapide %s avec vous.",
- "My pad" : "Mon Pad",
- "Settings" : "Paramètres",
- "Pad Title" : "Nom du Pad",
- "Open" : "Ouvrir",
- "Share with" : "Partager avec",
- "Share" : "Partager",
- "Etherpad service URL" : "URL du service Etherpad",
- "Username" : "Nom d'utilisateur",
- "Save" : "Sauvegarder"
-},"pluralForm" :"nplurals=2; plural=(n > 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/gl.js b/ownpad_lite/l10n/gl.js
deleted file mode 100644
index 86b7a7a6c..000000000
--- a/ownpad_lite/l10n/gl.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "O documento foi compartido",
- "User %s shared quick document %s with you." : "O usuario %s fixo unha compartición rápida con vostede do documento %s.",
- "My pad" : "O meu pad",
- "Settings" : "Axustes",
- "Pad Title" : "Título do pad",
- "Open" : "Abrir",
- "Share with" : "Compartir con",
- "Share" : "Compartir",
- "Etherpad service URL" : "URL do servizo Etherpad",
- "Username" : "Nome de usuario",
- "Save" : "Gardar"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/gl.json b/ownpad_lite/l10n/gl.json
deleted file mode 100644
index ed069eb3a..000000000
--- a/ownpad_lite/l10n/gl.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "O documento foi compartido",
- "User %s shared quick document %s with you." : "O usuario %s fixo unha compartición rápida con vostede do documento %s.",
- "My pad" : "O meu pad",
- "Settings" : "Axustes",
- "Pad Title" : "Título do pad",
- "Open" : "Abrir",
- "Share with" : "Compartir con",
- "Share" : "Compartir",
- "Etherpad service URL" : "URL do servizo Etherpad",
- "Username" : "Nome de usuario",
- "Save" : "Gardar"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/he.js b/ownpad_lite/l10n/he.js
deleted file mode 100644
index 50787d367..000000000
--- a/ownpad_lite/l10n/he.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "המסמך שותף",
- "User %s shared quick document %s with you." : "המשתמש %s שיתף אתך מסמך זריז %s.",
- "My pad" : "הלוח שלי",
- "Settings" : "הגדרות",
- "Pad Title" : "כותרת הלוח",
- "Open" : "פתיחה",
- "Share with" : "שיתוף עם",
- "Share" : "שתף",
- "Etherpad service URL" : "כתובת שירות ה־Etherpad",
- "Username" : "שם משתמש",
- "Save" : "שמירה"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/he.json b/ownpad_lite/l10n/he.json
deleted file mode 100644
index d63fb76db..000000000
--- a/ownpad_lite/l10n/he.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "המסמך שותף",
- "User %s shared quick document %s with you." : "המשתמש %s שיתף אתך מסמך זריז %s.",
- "My pad" : "הלוח שלי",
- "Settings" : "הגדרות",
- "Pad Title" : "כותרת הלוח",
- "Open" : "פתיחה",
- "Share with" : "שיתוף עם",
- "Share" : "שתף",
- "Etherpad service URL" : "כתובת שירות ה־Etherpad",
- "Username" : "שם משתמש",
- "Save" : "שמירה"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/hi.js b/ownpad_lite/l10n/hi.js
deleted file mode 100644
index b57e41ec8..000000000
--- a/ownpad_lite/l10n/hi.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "दस्तावेज़ साझा किया गया था",
- "User %s shared quick document %s with you." : "आप के साथ उपयोक्ता%s त्वरित दस्तावेज़%s साझा ",
- "My pad" : "मेरा पैड",
- "Settings" : "सेटिंग्स",
- "Pad Title" : "पैड शीर्षक",
- "Open" : "खोलें",
- "Share with" : "के साथ साझा",
- "Share" : "साझा करें",
- "Etherpad service URL" : "Etherpad सेवा यूआरएल",
- "Username" : "प्रयोक्ता का नाम",
- "Save" : "सहेजें"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/hi.json b/ownpad_lite/l10n/hi.json
deleted file mode 100644
index 1e8d94d27..000000000
--- a/ownpad_lite/l10n/hi.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "दस्तावेज़ साझा किया गया था",
- "User %s shared quick document %s with you." : "आप के साथ उपयोक्ता%s त्वरित दस्तावेज़%s साझा ",
- "My pad" : "मेरा पैड",
- "Settings" : "सेटिंग्स",
- "Pad Title" : "पैड शीर्षक",
- "Open" : "खोलें",
- "Share with" : "के साथ साझा",
- "Share" : "साझा करें",
- "Etherpad service URL" : "Etherpad सेवा यूआरएल",
- "Username" : "प्रयोक्ता का नाम",
- "Save" : "सहेजें"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/hr.js b/ownpad_lite/l10n/hr.js
deleted file mode 100644
index 9793cfaf2..000000000
--- a/ownpad_lite/l10n/hr.js
+++ /dev/null
@@ -1,12 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Dokument je bio dijeljen",
- "Settings" : "Postavke",
- "Open" : "Otvorite",
- "Share with" : "Djeli sa",
- "Share" : "Podijeli",
- "Username" : "Korisničko ime",
- "Save" : "Snimi"
-},
-"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;");
diff --git a/ownpad_lite/l10n/hr.json b/ownpad_lite/l10n/hr.json
deleted file mode 100644
index f6d17b9f3..000000000
--- a/ownpad_lite/l10n/hr.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{ "translations": {
- "Document was shared" : "Dokument je bio dijeljen",
- "Settings" : "Postavke",
- "Open" : "Otvorite",
- "Share with" : "Djeli sa",
- "Share" : "Podijeli",
- "Username" : "Korisničko ime",
- "Save" : "Snimi"
-},"pluralForm" :"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/hu_HU.js b/ownpad_lite/l10n/hu_HU.js
deleted file mode 100644
index bf392fc2f..000000000
--- a/ownpad_lite/l10n/hu_HU.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Megosztott dokumentum",
- "User %s shared quick document %s with you." : "%s felhasználó megosztotta Önnel ezt a dokumentumot: %s",
- "My pad" : "Saját Pad",
- "Settings" : "Beállítások",
- "Pad Title" : "Pad címe",
- "Open" : "Megnyitás",
- "Share with" : "Kivel osztom meg",
- "Share" : "Megosztás",
- "Etherpad service URL" : "Etherpad szolgáltatás URL",
- "Username" : "Felhasználónév",
- "Save" : "Mentés"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/hu_HU.json b/ownpad_lite/l10n/hu_HU.json
deleted file mode 100644
index 9e74aedee..000000000
--- a/ownpad_lite/l10n/hu_HU.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Megosztott dokumentum",
- "User %s shared quick document %s with you." : "%s felhasználó megosztotta Önnel ezt a dokumentumot: %s",
- "My pad" : "Saját Pad",
- "Settings" : "Beállítások",
- "Pad Title" : "Pad címe",
- "Open" : "Megnyitás",
- "Share with" : "Kivel osztom meg",
- "Share" : "Megosztás",
- "Etherpad service URL" : "Etherpad szolgáltatás URL",
- "Username" : "Felhasználónév",
- "Save" : "Mentés"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/hy.js b/ownpad_lite/l10n/hy.js
deleted file mode 100644
index 00fa49a3d..000000000
--- a/ownpad_lite/l10n/hy.js
+++ /dev/null
@@ -1,10 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Settings" : "Կարգավորումներ",
- "Open" : "Բացել",
- "Share" : "Կիսվել",
- "Username" : "Օգտանուն",
- "Save" : "Պահպանել"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/hy.json b/ownpad_lite/l10n/hy.json
deleted file mode 100644
index 2399c0de3..000000000
--- a/ownpad_lite/l10n/hy.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{ "translations": {
- "Settings" : "Կարգավորումներ",
- "Open" : "Բացել",
- "Share" : "Կիսվել",
- "Username" : "Օգտանուն",
- "Save" : "Պահպանել"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/ia.js b/ownpad_lite/l10n/ia.js
deleted file mode 100644
index 58f85697d..000000000
--- a/ownpad_lite/l10n/ia.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Documento esseva compartite",
- "User %s shared quick document %s with you." : "Usator %s compartiva documento rapide %s con te.",
- "My pad" : "Mi Bloco",
- "Settings" : "Configurationes",
- "Pad Title" : "Titulo de Bloco",
- "Open" : "Aperi",
- "Share with" : "Comparte con",
- "Share" : "Compartir",
- "Etherpad service URL" : "URL de servicio Etherpad",
- "Username" : "Nomine de usator",
- "Save" : "Salveguardar"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/ia.json b/ownpad_lite/l10n/ia.json
deleted file mode 100644
index 49ce07176..000000000
--- a/ownpad_lite/l10n/ia.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Documento esseva compartite",
- "User %s shared quick document %s with you." : "Usator %s compartiva documento rapide %s con te.",
- "My pad" : "Mi Bloco",
- "Settings" : "Configurationes",
- "Pad Title" : "Titulo de Bloco",
- "Open" : "Aperi",
- "Share with" : "Comparte con",
- "Share" : "Compartir",
- "Etherpad service URL" : "URL de servicio Etherpad",
- "Username" : "Nomine de usator",
- "Save" : "Salveguardar"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/id.js b/ownpad_lite/l10n/id.js
deleted file mode 100644
index 3941f972d..000000000
--- a/ownpad_lite/l10n/id.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Dokumen dibagikan",
- "User %s shared quick document %s with you." : "Pengguna %s berbagi dokumen cepat %s dengan Anda.",
- "My pad" : "Pad saya",
- "Settings" : "Setelan",
- "Pad Title" : "Judul Pad",
- "Open" : "Buka",
- "Share with" : "Bagikan dengan",
- "Share" : "Bagikan",
- "Etherpad service URL" : "URL layanan etherpad",
- "Username" : "Nama pengguna",
- "Save" : "Simpan"
-},
-"nplurals=1; plural=0;");
diff --git a/ownpad_lite/l10n/id.json b/ownpad_lite/l10n/id.json
deleted file mode 100644
index d2d424f44..000000000
--- a/ownpad_lite/l10n/id.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Dokumen dibagikan",
- "User %s shared quick document %s with you." : "Pengguna %s berbagi dokumen cepat %s dengan Anda.",
- "My pad" : "Pad saya",
- "Settings" : "Setelan",
- "Pad Title" : "Judul Pad",
- "Open" : "Buka",
- "Share with" : "Bagikan dengan",
- "Share" : "Bagikan",
- "Etherpad service URL" : "URL layanan etherpad",
- "Username" : "Nama pengguna",
- "Save" : "Simpan"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/is.js b/ownpad_lite/l10n/is.js
deleted file mode 100644
index 96bc0c270..000000000
--- a/ownpad_lite/l10n/is.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Skjalinu var deilt",
- "User %s shared quick document %s with you." : "Notandi %s deildi flýtiskjali %s með þér.",
- "My pad" : "Skrifblokkin mín",
- "Settings" : "Stillingar",
- "Pad Title" : "Heiti á skrifblokk",
- "Open" : "Opna",
- "Share with" : "Deila með",
- "Share" : "Deila",
- "Etherpad service URL" : "Slóð á Etherpad-þjónustu",
- "Username" : "Notandanafn",
- "Save" : "Vista"
-},
-"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);");
diff --git a/ownpad_lite/l10n/is.json b/ownpad_lite/l10n/is.json
deleted file mode 100644
index 37d899d3b..000000000
--- a/ownpad_lite/l10n/is.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Skjalinu var deilt",
- "User %s shared quick document %s with you." : "Notandi %s deildi flýtiskjali %s með þér.",
- "My pad" : "Skrifblokkin mín",
- "Settings" : "Stillingar",
- "Pad Title" : "Heiti á skrifblokk",
- "Open" : "Opna",
- "Share with" : "Deila með",
- "Share" : "Deila",
- "Etherpad service URL" : "Slóð á Etherpad-þjónustu",
- "Username" : "Notandanafn",
- "Save" : "Vista"
-},"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/it.js b/ownpad_lite/l10n/it.js
deleted file mode 100644
index 8db81fb28..000000000
--- a/ownpad_lite/l10n/it.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Il documento è stato condiviso",
- "User %s shared quick document %s with you." : "L'utente %s ha condiviso il documento %s con te.",
- "My pad" : "Il mio taccuino",
- "Settings" : "Impostazioni",
- "Pad Title" : "Titolo taccuino",
- "Open" : "Apri",
- "Share with" : "Condividi con",
- "Share" : "Condividi",
- "Etherpad service URL" : "URL del servizio Etherpad",
- "Username" : "Nome utente",
- "Save" : "Salva"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/it.json b/ownpad_lite/l10n/it.json
deleted file mode 100644
index 7db6dd872..000000000
--- a/ownpad_lite/l10n/it.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Il documento è stato condiviso",
- "User %s shared quick document %s with you." : "L'utente %s ha condiviso il documento %s con te.",
- "My pad" : "Il mio taccuino",
- "Settings" : "Impostazioni",
- "Pad Title" : "Titolo taccuino",
- "Open" : "Apri",
- "Share with" : "Condividi con",
- "Share" : "Condividi",
- "Etherpad service URL" : "URL del servizio Etherpad",
- "Username" : "Nome utente",
- "Save" : "Salva"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/ja.js b/ownpad_lite/l10n/ja.js
deleted file mode 100644
index 11ae6681e..000000000
--- a/ownpad_lite/l10n/ja.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "ドキュメントは共有されました",
- "User %s shared quick document %s with you." : "ユーザー %s はあなたとクイックドキュメント %s を共有しました。",
- "My pad" : "マイパッド",
- "Settings" : "設定",
- "Pad Title" : "パッドタイトル",
- "Open" : "開く",
- "Share with" : "共有者",
- "Share" : "共有",
- "Etherpad service URL" : "Etherpad サービス URL",
- "Username" : "ユーザー名",
- "Save" : "保存"
-},
-"nplurals=1; plural=0;");
diff --git a/ownpad_lite/l10n/ja.json b/ownpad_lite/l10n/ja.json
deleted file mode 100644
index 9ec248b33..000000000
--- a/ownpad_lite/l10n/ja.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "ドキュメントは共有されました",
- "User %s shared quick document %s with you." : "ユーザー %s はあなたとクイックドキュメント %s を共有しました。",
- "My pad" : "マイパッド",
- "Settings" : "設定",
- "Pad Title" : "パッドタイトル",
- "Open" : "開く",
- "Share with" : "共有者",
- "Share" : "共有",
- "Etherpad service URL" : "Etherpad サービス URL",
- "Username" : "ユーザー名",
- "Save" : "保存"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/ka_GE.js b/ownpad_lite/l10n/ka_GE.js
deleted file mode 100644
index bd63d0673..000000000
--- a/ownpad_lite/l10n/ka_GE.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "დოკუმენტი გაზიარდა",
- "User %s shared quick document %s with you." : "მომხმარებელმა %s გაგიზიარათ ფაილი %s",
- "My pad" : "ჩემი ფედი",
- "Settings" : "პარამეტრები",
- "Pad Title" : "ფედის სახელი",
- "Open" : "გახსნა",
- "Share with" : "გააზიარე შემდეგით:",
- "Share" : "გაზიარება",
- "Etherpad service URL" : "Etherpad URL სერვისი",
- "Username" : "მომხმარებლის სახელი",
- "Save" : "შენახვა"
-},
-"nplurals=1; plural=0;");
diff --git a/ownpad_lite/l10n/ka_GE.json b/ownpad_lite/l10n/ka_GE.json
deleted file mode 100644
index ee42da3fa..000000000
--- a/ownpad_lite/l10n/ka_GE.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "დოკუმენტი გაზიარდა",
- "User %s shared quick document %s with you." : "მომხმარებელმა %s გაგიზიარათ ფაილი %s",
- "My pad" : "ჩემი ფედი",
- "Settings" : "პარამეტრები",
- "Pad Title" : "ფედის სახელი",
- "Open" : "გახსნა",
- "Share with" : "გააზიარე შემდეგით:",
- "Share" : "გაზიარება",
- "Etherpad service URL" : "Etherpad URL სერვისი",
- "Username" : "მომხმარებლის სახელი",
- "Save" : "შენახვა"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/km.js b/ownpad_lite/l10n/km.js
deleted file mode 100644
index 78558fe72..000000000
--- a/ownpad_lite/l10n/km.js
+++ /dev/null
@@ -1,13 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "My pad" : "ផេត​របស់​ខ្ញុំ",
- "Settings" : "ការកំណត់",
- "Pad Title" : "ឈ្មោះ​ផេត",
- "Open" : "បើក",
- "Share with" : "ចែក​រំលែក​ជាមួយ",
- "Share" : "ចែក​រំលែក",
- "Username" : "ឈ្មោះ​អ្នកប្រើ",
- "Save" : "រក្សាទុក"
-},
-"nplurals=1; plural=0;");
diff --git a/ownpad_lite/l10n/km.json b/ownpad_lite/l10n/km.json
deleted file mode 100644
index 22c14c73c..000000000
--- a/ownpad_lite/l10n/km.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{ "translations": {
- "My pad" : "ផេត​របស់​ខ្ញុំ",
- "Settings" : "ការកំណត់",
- "Pad Title" : "ឈ្មោះ​ផេត",
- "Open" : "បើក",
- "Share with" : "ចែក​រំលែក​ជាមួយ",
- "Share" : "ចែក​រំលែក",
- "Username" : "ឈ្មោះ​អ្នកប្រើ",
- "Save" : "រក្សាទុក"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/kn.js b/ownpad_lite/l10n/kn.js
deleted file mode 100644
index d96a4a533..000000000
--- a/ownpad_lite/l10n/kn.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "ದಾಖಲೆಯನ್ನು ಹಂಚಲಾಗಿದೆ",
- "User %s shared quick document %s with you." : " ಬಳಕೆದಾರ %s ನಿಮ್ಮೊಂದಿಗೆ ತ್ವರಿತವಾಗಿ %s ದಾಖಲೆಯಾನ್ನು ಹಂಚಿಕೊಂಡಿದ್ದಾರೆ",
- "My pad" : "ನನ್ನ ವೇದಿಕೆ",
- "Settings" : "ಆಯ್ಕೆ",
- "Pad Title" : "ವೇದಿಕೆಯ ಶೀರ್ಷಿಕೆ",
- "Open" : "ತೆರೆ",
- "Share with" : "ಜೊತೆ ಹಂಚಿಕೊಳ್ಳಿ",
- "Share" : "ಹಂಚಿಕೊಳ್ಳಿ",
- "Etherpad service URL" : "ಈಥರ್ಪ್ಯಾಡ್ ಸೇವೆ ಜಾಲ ಕೊಂಡಿ",
- "Username" : "ಬಳಕೆಯ ಹೆಸರು",
- "Save" : "ಉಳಿಸಿ"
-},
-"nplurals=1; plural=0;");
diff --git a/ownpad_lite/l10n/kn.json b/ownpad_lite/l10n/kn.json
deleted file mode 100644
index 4a3c5c510..000000000
--- a/ownpad_lite/l10n/kn.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "ದಾಖಲೆಯನ್ನು ಹಂಚಲಾಗಿದೆ",
- "User %s shared quick document %s with you." : " ಬಳಕೆದಾರ %s ನಿಮ್ಮೊಂದಿಗೆ ತ್ವರಿತವಾಗಿ %s ದಾಖಲೆಯಾನ್ನು ಹಂಚಿಕೊಂಡಿದ್ದಾರೆ",
- "My pad" : "ನನ್ನ ವೇದಿಕೆ",
- "Settings" : "ಆಯ್ಕೆ",
- "Pad Title" : "ವೇದಿಕೆಯ ಶೀರ್ಷಿಕೆ",
- "Open" : "ತೆರೆ",
- "Share with" : "ಜೊತೆ ಹಂಚಿಕೊಳ್ಳಿ",
- "Share" : "ಹಂಚಿಕೊಳ್ಳಿ",
- "Etherpad service URL" : "ಈಥರ್ಪ್ಯಾಡ್ ಸೇವೆ ಜಾಲ ಕೊಂಡಿ",
- "Username" : "ಬಳಕೆಯ ಹೆಸರು",
- "Save" : "ಉಳಿಸಿ"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/ko.js b/ownpad_lite/l10n/ko.js
deleted file mode 100644
index a52dfcc31..000000000
--- a/ownpad_lite/l10n/ko.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "문서 공유됨",
- "User %s shared quick document %s with you." : "%s 님이 빠른 문서 %s을(를) 공유했습니다.",
- "My pad" : "내 패드",
- "Settings" : "설정",
- "Pad Title" : "패드 제목",
- "Open" : "열기",
- "Share with" : "다음으로 공유",
- "Share" : "공유",
- "Etherpad service URL" : "Etherpad 서비스 URL",
- "Username" : "사용자 이름",
- "Save" : "저장"
-},
-"nplurals=1; plural=0;");
diff --git a/ownpad_lite/l10n/ko.json b/ownpad_lite/l10n/ko.json
deleted file mode 100644
index 29c2a27c4..000000000
--- a/ownpad_lite/l10n/ko.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "문서 공유됨",
- "User %s shared quick document %s with you." : "%s 님이 빠른 문서 %s을(를) 공유했습니다.",
- "My pad" : "내 패드",
- "Settings" : "설정",
- "Pad Title" : "패드 제목",
- "Open" : "열기",
- "Share with" : "다음으로 공유",
- "Share" : "공유",
- "Etherpad service URL" : "Etherpad 서비스 URL",
- "Username" : "사용자 이름",
- "Save" : "저장"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/ku_IQ.js b/ownpad_lite/l10n/ku_IQ.js
deleted file mode 100644
index 1c45b31aa..000000000
--- a/ownpad_lite/l10n/ku_IQ.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "دۆکومێنتەکە هاوبەشکرا",
- "User %s shared quick document %s with you." : "ئەم بەکارهێنەرە %s دۆکومێنتەکی خێرایی %s لەگەڵت بەشکردووە.",
- "My pad" : "پاده‌که‌م",
- "Settings" : "ڕێکخستنه‌کان",
- "Pad Title" : "ناونیشانی پاد",
- "Open" : "بیکەوە",
- "Share with" : "هاوبەشکردن لەگەڵ",
- "Share" : "هاوبەشی کردن",
- "Etherpad service URL" : "ناونیشانی به‌سته‌ری ڕاژه‌ی ئێذه‌رپاد",
- "Username" : "ناوی به‌کارهێنه‌ر",
- "Save" : "پاشکه‌وتکردن"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/ku_IQ.json b/ownpad_lite/l10n/ku_IQ.json
deleted file mode 100644
index 5cf29dec2..000000000
--- a/ownpad_lite/l10n/ku_IQ.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "دۆکومێنتەکە هاوبەشکرا",
- "User %s shared quick document %s with you." : "ئەم بەکارهێنەرە %s دۆکومێنتەکی خێرایی %s لەگەڵت بەشکردووە.",
- "My pad" : "پاده‌که‌م",
- "Settings" : "ڕێکخستنه‌کان",
- "Pad Title" : "ناونیشانی پاد",
- "Open" : "بیکەوە",
- "Share with" : "هاوبەشکردن لەگەڵ",
- "Share" : "هاوبەشی کردن",
- "Etherpad service URL" : "ناونیشانی به‌سته‌ری ڕاژه‌ی ئێذه‌رپاد",
- "Username" : "ناوی به‌کارهێنه‌ر",
- "Save" : "پاشکه‌وتکردن"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/lb.js b/ownpad_lite/l10n/lb.js
deleted file mode 100644
index 7f2bb66f5..000000000
--- a/ownpad_lite/l10n/lb.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "D'Dokument ass gedeelt ginn",
- "User %s shared quick document %s with you." : "De Benotzer %s huet dat séiert Dokument %s mat dir gedeelt",
- "My pad" : "Mäi Pad",
- "Settings" : "Astellungen",
- "Pad Title" : "Pad-Titel",
- "Open" : "Opmaachen",
- "Share with" : "Deele mat",
- "Share" : "Deelen",
- "Etherpad service URL" : "Adress vum Etherpad-Service",
- "Username" : "Benotzernumm",
- "Save" : "Späicheren"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/lb.json b/ownpad_lite/l10n/lb.json
deleted file mode 100644
index b53414da6..000000000
--- a/ownpad_lite/l10n/lb.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "D'Dokument ass gedeelt ginn",
- "User %s shared quick document %s with you." : "De Benotzer %s huet dat séiert Dokument %s mat dir gedeelt",
- "My pad" : "Mäi Pad",
- "Settings" : "Astellungen",
- "Pad Title" : "Pad-Titel",
- "Open" : "Opmaachen",
- "Share with" : "Deele mat",
- "Share" : "Deelen",
- "Etherpad service URL" : "Adress vum Etherpad-Service",
- "Username" : "Benotzernumm",
- "Save" : "Späicheren"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/lt_LT.js b/ownpad_lite/l10n/lt_LT.js
deleted file mode 100644
index 1decd3136..000000000
--- a/ownpad_lite/l10n/lt_LT.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Pasidalinta dokumentu",
- "User %s shared quick document %s with you." : "Naudotojas %s su jumis pasidalino dokumentu %s.",
- "My pad" : "Mano planšetė",
- "Settings" : "Nustatymai",
- "Pad Title" : "Planšetės pavadinimas",
- "Open" : "Atverti",
- "Share with" : "Dalintis su",
- "Share" : "Dalintis",
- "Etherpad service URL" : "Etherpad paslaugos URL",
- "Username" : "Prisijungimo vardas",
- "Save" : "Išsaugoti"
-},
-"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/ownpad_lite/l10n/lt_LT.json b/ownpad_lite/l10n/lt_LT.json
deleted file mode 100644
index 07facd66c..000000000
--- a/ownpad_lite/l10n/lt_LT.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Pasidalinta dokumentu",
- "User %s shared quick document %s with you." : "Naudotojas %s su jumis pasidalino dokumentu %s.",
- "My pad" : "Mano planšetė",
- "Settings" : "Nustatymai",
- "Pad Title" : "Planšetės pavadinimas",
- "Open" : "Atverti",
- "Share with" : "Dalintis su",
- "Share" : "Dalintis",
- "Etherpad service URL" : "Etherpad paslaugos URL",
- "Username" : "Prisijungimo vardas",
- "Save" : "Išsaugoti"
-},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/lv.js b/ownpad_lite/l10n/lv.js
deleted file mode 100644
index c1dac5bd6..000000000
--- a/ownpad_lite/l10n/lv.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Dokuments tika koplietots",
- "User %s shared quick document %s with you." : "Lietotājs %s ar jums dalījās ar ātro dokumentu %s.",
- "My pad" : "Mans paliktnis",
- "Settings" : "Iestatījumi",
- "Pad Title" : "Paliktņa virsraksts",
- "Open" : "Atvērt",
- "Share with" : "Dalīties ar",
- "Share" : "Dalīties",
- "Etherpad service URL" : "Etherpad servisa URL",
- "Username" : "Lietotājvārds",
- "Save" : "Saglabāt"
-},
-"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);");
diff --git a/ownpad_lite/l10n/lv.json b/ownpad_lite/l10n/lv.json
deleted file mode 100644
index c6099302c..000000000
--- a/ownpad_lite/l10n/lv.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Dokuments tika koplietots",
- "User %s shared quick document %s with you." : "Lietotājs %s ar jums dalījās ar ātro dokumentu %s.",
- "My pad" : "Mans paliktnis",
- "Settings" : "Iestatījumi",
- "Pad Title" : "Paliktņa virsraksts",
- "Open" : "Atvērt",
- "Share with" : "Dalīties ar",
- "Share" : "Dalīties",
- "Etherpad service URL" : "Etherpad servisa URL",
- "Username" : "Lietotājvārds",
- "Save" : "Saglabāt"
-},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/mk.js b/ownpad_lite/l10n/mk.js
deleted file mode 100644
index 7fdfc10ab..000000000
--- a/ownpad_lite/l10n/mk.js
+++ /dev/null
@@ -1,15 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Споделен документ",
- "My pad" : "Мој нотес",
- "Settings" : "Подесувања",
- "Pad Title" : "Наслов на нотес",
- "Open" : "Отвори",
- "Share with" : "Сподели со",
- "Share" : "Сподели",
- "Etherpad service URL" : "Сервисна адреса на Etherpad",
- "Username" : "Корисничко име",
- "Save" : "Сними"
-},
-"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;");
diff --git a/ownpad_lite/l10n/mk.json b/ownpad_lite/l10n/mk.json
deleted file mode 100644
index dee61fdcf..000000000
--- a/ownpad_lite/l10n/mk.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{ "translations": {
- "Document was shared" : "Споделен документ",
- "My pad" : "Мој нотес",
- "Settings" : "Подесувања",
- "Pad Title" : "Наслов на нотес",
- "Open" : "Отвори",
- "Share with" : "Сподели со",
- "Share" : "Сподели",
- "Etherpad service URL" : "Сервисна адреса на Etherpad",
- "Username" : "Корисничко име",
- "Save" : "Сними"
-},"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/mn.js b/ownpad_lite/l10n/mn.js
deleted file mode 100644
index 60c9148c4..000000000
--- a/ownpad_lite/l10n/mn.js
+++ /dev/null
@@ -1,10 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Бичиг баримт түгээгдсэн",
- "Settings" : "Тохиргоо",
- "Share" : "Түгээх",
- "Username" : "Хэрэглэгчийн нэр",
- "Save" : "Хадгалах"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/mn.json b/ownpad_lite/l10n/mn.json
deleted file mode 100644
index 0754cf409..000000000
--- a/ownpad_lite/l10n/mn.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{ "translations": {
- "Document was shared" : "Бичиг баримт түгээгдсэн",
- "Settings" : "Тохиргоо",
- "Share" : "Түгээх",
- "Username" : "Хэрэглэгчийн нэр",
- "Save" : "Хадгалах"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/ms_MY.js b/ownpad_lite/l10n/ms_MY.js
deleted file mode 100644
index 672a7ec77..000000000
--- a/ownpad_lite/l10n/ms_MY.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Dokumen telah dikongsikan ",
- "User %s shared quick document %s with you." : "Pengguna %s berkongsi dokumen segera %s dengan anda.",
- "My pad" : "Pad saya",
- "Settings" : "Tetapan",
- "Pad Title" : "Tajuk Pad",
- "Open" : "Buka",
- "Share with" : "Kongsi dengan",
- "Share" : "Kongsi",
- "Etherpad service URL" : "URL servis Etherpad",
- "Username" : "Nama pengguna",
- "Save" : "Simpan"
-},
-"nplurals=1; plural=0;");
diff --git a/ownpad_lite/l10n/ms_MY.json b/ownpad_lite/l10n/ms_MY.json
deleted file mode 100644
index 3573bd2cc..000000000
--- a/ownpad_lite/l10n/ms_MY.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Dokumen telah dikongsikan ",
- "User %s shared quick document %s with you." : "Pengguna %s berkongsi dokumen segera %s dengan anda.",
- "My pad" : "Pad saya",
- "Settings" : "Tetapan",
- "Pad Title" : "Tajuk Pad",
- "Open" : "Buka",
- "Share with" : "Kongsi dengan",
- "Share" : "Kongsi",
- "Etherpad service URL" : "URL servis Etherpad",
- "Username" : "Nama pengguna",
- "Save" : "Simpan"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/my_MM.js b/ownpad_lite/l10n/my_MM.js
deleted file mode 100644
index 0b4919f28..000000000
--- a/ownpad_lite/l10n/my_MM.js
+++ /dev/null
@@ -1,6 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Username" : "သုံးစွဲသူအမည်"
-},
-"nplurals=1; plural=0;");
diff --git a/ownpad_lite/l10n/my_MM.json b/ownpad_lite/l10n/my_MM.json
deleted file mode 100644
index 6ab4f2d51..000000000
--- a/ownpad_lite/l10n/my_MM.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{ "translations": {
- "Username" : "သုံးစွဲသူအမည်"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/nb_NO.js b/ownpad_lite/l10n/nb_NO.js
deleted file mode 100644
index e268c0f88..000000000
--- a/ownpad_lite/l10n/nb_NO.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Dokumentet ble delt",
- "User %s shared quick document %s with you." : "Bruker %s delte hurtigdokument %s med deg.",
- "My pad" : "Min blokk",
- "Settings" : "Innstillinger",
- "Pad Title" : "Tittel på blokken",
- "Open" : "Åpne",
- "Share with" : "Del med",
- "Share" : "Del",
- "Etherpad service URL" : "Etherpad tjeneste URL",
- "Username" : "Brukernavn",
- "Save" : "Lagre"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/nb_NO.json b/ownpad_lite/l10n/nb_NO.json
deleted file mode 100644
index 84de586c6..000000000
--- a/ownpad_lite/l10n/nb_NO.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Dokumentet ble delt",
- "User %s shared quick document %s with you." : "Bruker %s delte hurtigdokument %s med deg.",
- "My pad" : "Min blokk",
- "Settings" : "Innstillinger",
- "Pad Title" : "Tittel på blokken",
- "Open" : "Åpne",
- "Share with" : "Del med",
- "Share" : "Del",
- "Etherpad service URL" : "Etherpad tjeneste URL",
- "Username" : "Brukernavn",
- "Save" : "Lagre"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/nds.js b/ownpad_lite/l10n/nds.js
deleted file mode 100644
index eacfd5732..000000000
--- a/ownpad_lite/l10n/nds.js
+++ /dev/null
@@ -1,8 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Settings" : "Einstellungen",
- "Share" : "Teilen",
- "Username" : "Benutzername"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/nds.json b/ownpad_lite/l10n/nds.json
deleted file mode 100644
index 3092454ed..000000000
--- a/ownpad_lite/l10n/nds.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{ "translations": {
- "Settings" : "Einstellungen",
- "Share" : "Teilen",
- "Username" : "Benutzername"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/nl.js b/ownpad_lite/l10n/nl.js
deleted file mode 100644
index ebbbd6052..000000000
--- a/ownpad_lite/l10n/nl.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Document was gedeeld",
- "User %s shared quick document %s with you." : "Gebruiker %s deelde document %s met u.",
- "My pad" : "Mijn pad",
- "Settings" : "Instellingen",
- "Pad Title" : "Pad titel",
- "Open" : "Open",
- "Share with" : "Deel met",
- "Share" : "Delen",
- "Etherpad service URL" : "Etherpad dienst URL",
- "Username" : "Gebruikersnaam",
- "Save" : "Opslaan"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/nl.json b/ownpad_lite/l10n/nl.json
deleted file mode 100644
index 1cc19d5dc..000000000
--- a/ownpad_lite/l10n/nl.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Document was gedeeld",
- "User %s shared quick document %s with you." : "Gebruiker %s deelde document %s met u.",
- "My pad" : "Mijn pad",
- "Settings" : "Instellingen",
- "Pad Title" : "Pad titel",
- "Open" : "Open",
- "Share with" : "Deel met",
- "Share" : "Delen",
- "Etherpad service URL" : "Etherpad dienst URL",
- "Username" : "Gebruikersnaam",
- "Save" : "Opslaan"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/nn_NO.js b/ownpad_lite/l10n/nn_NO.js
deleted file mode 100644
index 56b793797..000000000
--- a/ownpad_lite/l10n/nn_NO.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Dokumentet er delt",
- "User %s shared quick document %s with you." : "Brukaren %s delte dokumentet %s med deg.",
- "My pad" : "Blokka mi",
- "Settings" : "Innstillingar",
- "Pad Title" : "Tittel på blokka",
- "Open" : "Opna",
- "Share with" : "Del med",
- "Share" : "Del",
- "Etherpad service URL" : "URL til Etherpad-tenesta",
- "Username" : "Brukarnamn",
- "Save" : "Lagre"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/nn_NO.json b/ownpad_lite/l10n/nn_NO.json
deleted file mode 100644
index 85310bf84..000000000
--- a/ownpad_lite/l10n/nn_NO.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Dokumentet er delt",
- "User %s shared quick document %s with you." : "Brukaren %s delte dokumentet %s med deg.",
- "My pad" : "Blokka mi",
- "Settings" : "Innstillingar",
- "Pad Title" : "Tittel på blokka",
- "Open" : "Opna",
- "Share with" : "Del med",
- "Share" : "Del",
- "Etherpad service URL" : "URL til Etherpad-tenesta",
- "Username" : "Brukarnamn",
- "Save" : "Lagre"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/oc.js b/ownpad_lite/l10n/oc.js
deleted file mode 100644
index 554a51d77..000000000
--- a/ownpad_lite/l10n/oc.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Lo document es estat partejat",
- "User %s shared quick document %s with you." : "L'utilizaire %s a partejat lo document rapid %s amb vos.",
- "My pad" : "Mon Pad",
- "Settings" : "Paramètres",
- "Pad Title" : "Nom del Pad",
- "Open" : "Dobrir",
- "Share with" : "Partejar amb",
- "Share" : "Partejar",
- "Etherpad service URL" : "URL del servici Etherpad",
- "Username" : "Nom d'utilizaire",
- "Save" : "Salvar"
-},
-"nplurals=2; plural=(n > 1);");
diff --git a/ownpad_lite/l10n/oc.json b/ownpad_lite/l10n/oc.json
deleted file mode 100644
index 182789133..000000000
--- a/ownpad_lite/l10n/oc.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Lo document es estat partejat",
- "User %s shared quick document %s with you." : "L'utilizaire %s a partejat lo document rapid %s amb vos.",
- "My pad" : "Mon Pad",
- "Settings" : "Paramètres",
- "Pad Title" : "Nom del Pad",
- "Open" : "Dobrir",
- "Share with" : "Partejar amb",
- "Share" : "Partejar",
- "Etherpad service URL" : "URL del servici Etherpad",
- "Username" : "Nom d'utilizaire",
- "Save" : "Salvar"
-},"pluralForm" :"nplurals=2; plural=(n > 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/pa.js b/ownpad_lite/l10n/pa.js
deleted file mode 100644
index 3f5206762..000000000
--- a/ownpad_lite/l10n/pa.js
+++ /dev/null
@@ -1,8 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Settings" : "ਸੈਟਿੰਗ",
- "Share" : "ਸਾਂਝਾ ਕਰੋ",
- "Username" : "ਯੂਜ਼ਰ-ਨਾਂ"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/pa.json b/ownpad_lite/l10n/pa.json
deleted file mode 100644
index 06a75281d..000000000
--- a/ownpad_lite/l10n/pa.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{ "translations": {
- "Settings" : "ਸੈਟਿੰਗ",
- "Share" : "ਸਾਂਝਾ ਕਰੋ",
- "Username" : "ਯੂਜ਼ਰ-ਨਾਂ"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/pl.js b/ownpad_lite/l10n/pl.js
deleted file mode 100644
index 2c8fcef05..000000000
--- a/ownpad_lite/l10n/pl.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Dokument został udostępniony",
- "User %s shared quick document %s with you." : "Użytkownik %s współdzieli szybki dokument %s z Tobą.",
- "My pad" : "Moja konsola",
- "Settings" : "Ustawienia",
- "Pad Title" : "Nazwa konsoli",
- "Open" : "Otwórz",
- "Share with" : "Współdziel z",
- "Share" : "Udostępnij",
- "Etherpad service URL" : "Adres URL usługi Etherpad",
- "Username" : "Nazwa użytkownika",
- "Save" : "Zapisz"
-},
-"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/ownpad_lite/l10n/pl.json b/ownpad_lite/l10n/pl.json
deleted file mode 100644
index 7577a2bad..000000000
--- a/ownpad_lite/l10n/pl.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Dokument został udostępniony",
- "User %s shared quick document %s with you." : "Użytkownik %s współdzieli szybki dokument %s z Tobą.",
- "My pad" : "Moja konsola",
- "Settings" : "Ustawienia",
- "Pad Title" : "Nazwa konsoli",
- "Open" : "Otwórz",
- "Share with" : "Współdziel z",
- "Share" : "Udostępnij",
- "Etherpad service URL" : "Adres URL usługi Etherpad",
- "Username" : "Nazwa użytkownika",
- "Save" : "Zapisz"
-},"pluralForm" :"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/pt_BR.js b/ownpad_lite/l10n/pt_BR.js
deleted file mode 100644
index 0af86bdd8..000000000
--- a/ownpad_lite/l10n/pt_BR.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Documento foi compartilhado",
- "User %s shared quick document %s with you." : "Usuário %s compartilhou o documento %s com você.",
- "My pad" : "Meu bloco",
- "Settings" : "Configurações",
- "Pad Title" : "Título do bloco",
- "Open" : "Abrir",
- "Share with" : "Compartilhar com",
- "Share" : "Compartilhar",
- "Etherpad service URL" : "URL de serviço Etherpad",
- "Username" : "Nome de usuário",
- "Save" : "Salvar"
-},
-"nplurals=2; plural=(n > 1);");
diff --git a/ownpad_lite/l10n/pt_BR.json b/ownpad_lite/l10n/pt_BR.json
deleted file mode 100644
index ecfde130a..000000000
--- a/ownpad_lite/l10n/pt_BR.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Documento foi compartilhado",
- "User %s shared quick document %s with you." : "Usuário %s compartilhou o documento %s com você.",
- "My pad" : "Meu bloco",
- "Settings" : "Configurações",
- "Pad Title" : "Título do bloco",
- "Open" : "Abrir",
- "Share with" : "Compartilhar com",
- "Share" : "Compartilhar",
- "Etherpad service URL" : "URL de serviço Etherpad",
- "Username" : "Nome de usuário",
- "Save" : "Salvar"
-},"pluralForm" :"nplurals=2; plural=(n > 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/pt_PT.js b/ownpad_lite/l10n/pt_PT.js
deleted file mode 100644
index 80fa437d4..000000000
--- a/ownpad_lite/l10n/pt_PT.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "O documento foi partilhado",
- "User %s shared quick document %s with you." : "O Utilizador %s partilhou um documento rápido %s consigo.",
- "My pad" : "O meu pad",
- "Settings" : "Definições",
- "Pad Title" : "Título do Pad",
- "Open" : "Abrir",
- "Share with" : "Partilhar com",
- "Share" : "Partilhar",
- "Etherpad service URL" : "URL do serviço etherpad",
- "Username" : "Nome de utilizador",
- "Save" : "Guardar"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/pt_PT.json b/ownpad_lite/l10n/pt_PT.json
deleted file mode 100644
index 4648aca69..000000000
--- a/ownpad_lite/l10n/pt_PT.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "O documento foi partilhado",
- "User %s shared quick document %s with you." : "O Utilizador %s partilhou um documento rápido %s consigo.",
- "My pad" : "O meu pad",
- "Settings" : "Definições",
- "Pad Title" : "Título do Pad",
- "Open" : "Abrir",
- "Share with" : "Partilhar com",
- "Share" : "Partilhar",
- "Etherpad service URL" : "URL do serviço etherpad",
- "Username" : "Nome de utilizador",
- "Save" : "Guardar"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/ro.js b/ownpad_lite/l10n/ro.js
deleted file mode 100644
index cf58af841..000000000
--- a/ownpad_lite/l10n/ro.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Documentul a fost impartasit",
- "User %s shared quick document %s with you." : "Utilizatorul %s a partajat un documentul %s cu tine",
- "My pad" : "Tableta mea",
- "Settings" : "Setări",
- "Pad Title" : "Titlu tabletă",
- "Open" : "Deschide",
- "Share with" : "Partajat cu",
- "Share" : "Partajează",
- "Etherpad service URL" : "URL serviciu etherpad",
- "Username" : "Nume utilizator",
- "Save" : "Salvare"
-},
-"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));");
diff --git a/ownpad_lite/l10n/ro.json b/ownpad_lite/l10n/ro.json
deleted file mode 100644
index 42eef895b..000000000
--- a/ownpad_lite/l10n/ro.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Documentul a fost impartasit",
- "User %s shared quick document %s with you." : "Utilizatorul %s a partajat un documentul %s cu tine",
- "My pad" : "Tableta mea",
- "Settings" : "Setări",
- "Pad Title" : "Titlu tabletă",
- "Open" : "Deschide",
- "Share with" : "Partajat cu",
- "Share" : "Partajează",
- "Etherpad service URL" : "URL serviciu etherpad",
- "Username" : "Nume utilizator",
- "Save" : "Salvare"
-},"pluralForm" :"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/ru.js b/ownpad_lite/l10n/ru.js
deleted file mode 100644
index f90fa8765..000000000
--- a/ownpad_lite/l10n/ru.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Документ был размещен в общем доступе",
- "User %s shared quick document %s with you." : "Пользователь %s поделился с вами документом %s.",
- "My pad" : "Мой блокнот",
- "Settings" : "Конфигурация",
- "Pad Title" : "Заголовок документа",
- "Open" : "Открыть",
- "Share with" : "Поделиться с",
- "Share" : "Открыть доступ",
- "Etherpad service URL" : "URL сервера Etherpad",
- "Username" : "Имя пользователя",
- "Save" : "Сохранить"
-},
-"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);");
diff --git a/ownpad_lite/l10n/ru.json b/ownpad_lite/l10n/ru.json
deleted file mode 100644
index ad2c96b80..000000000
--- a/ownpad_lite/l10n/ru.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Документ был размещен в общем доступе",
- "User %s shared quick document %s with you." : "Пользователь %s поделился с вами документом %s.",
- "My pad" : "Мой блокнот",
- "Settings" : "Конфигурация",
- "Pad Title" : "Заголовок документа",
- "Open" : "Открыть",
- "Share with" : "Поделиться с",
- "Share" : "Открыть доступ",
- "Etherpad service URL" : "URL сервера Etherpad",
- "Username" : "Имя пользователя",
- "Save" : "Сохранить"
-},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/si_LK.js b/ownpad_lite/l10n/si_LK.js
deleted file mode 100644
index 45a00c39a..000000000
--- a/ownpad_lite/l10n/si_LK.js
+++ /dev/null
@@ -1,14 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "My pad" : "මගේ padය",
- "Settings" : "සිටුවම",
- "Pad Title" : "Pad මාතෘකාව",
- "Open" : "විවෘත කරන්න",
- "Share with" : "බෙදාගන්න",
- "Share" : "බෙදා හදා ගන්න",
- "Etherpad service URL" : "Etherpad සේවා යොමුව",
- "Username" : "පරිශීලක නම",
- "Save" : "සුරකින්න"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/si_LK.json b/ownpad_lite/l10n/si_LK.json
deleted file mode 100644
index 16fb15245..000000000
--- a/ownpad_lite/l10n/si_LK.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{ "translations": {
- "My pad" : "මගේ padය",
- "Settings" : "සිටුවම",
- "Pad Title" : "Pad මාතෘකාව",
- "Open" : "විවෘත කරන්න",
- "Share with" : "බෙදාගන්න",
- "Share" : "බෙදා හදා ගන්න",
- "Etherpad service URL" : "Etherpad සේවා යොමුව",
- "Username" : "පරිශීලක නම",
- "Save" : "සුරකින්න"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/sk_SK.js b/ownpad_lite/l10n/sk_SK.js
deleted file mode 100644
index 3f9a5bf47..000000000
--- a/ownpad_lite/l10n/sk_SK.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Dokument bol zdieľaný",
- "User %s shared quick document %s with you." : "Používateľ %s s vami zdieľa dokument %s.",
- "My pad" : "Môj blok",
- "Settings" : "Nastavenia",
- "Pad Title" : "Názov bloku",
- "Open" : "Otvoriť",
- "Share with" : "Zdieľať s",
- "Share" : "Zdieľať",
- "Etherpad service URL" : "URL služby Etherpad",
- "Username" : "Používateľské meno",
- "Save" : "Uložiť"
-},
-"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;");
diff --git a/ownpad_lite/l10n/sk_SK.json b/ownpad_lite/l10n/sk_SK.json
deleted file mode 100644
index 36a589ce0..000000000
--- a/ownpad_lite/l10n/sk_SK.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Dokument bol zdieľaný",
- "User %s shared quick document %s with you." : "Používateľ %s s vami zdieľa dokument %s.",
- "My pad" : "Môj blok",
- "Settings" : "Nastavenia",
- "Pad Title" : "Názov bloku",
- "Open" : "Otvoriť",
- "Share with" : "Zdieľať s",
- "Share" : "Zdieľať",
- "Etherpad service URL" : "URL služby Etherpad",
- "Username" : "Používateľské meno",
- "Save" : "Uložiť"
-},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/sl.js b/ownpad_lite/l10n/sl.js
deleted file mode 100644
index 3e30f597f..000000000
--- a/ownpad_lite/l10n/sl.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Dokument je bil v souporabi",
- "User %s shared quick document %s with you." : "User %s je odobril hitro souporabo dokumenta %s.",
- "My pad" : "Moja beležka",
- "Settings" : "Nastavitve",
- "Pad Title" : "Naslov beležke",
- "Open" : "Odpri",
- "Share with" : "Omogoči souporabo z",
- "Share" : "Souporaba",
- "Etherpad service URL" : "Naslov URL storitve Etherpad",
- "Username" : "Uporabniško ime",
- "Save" : "Shrani"
-},
-"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);");
diff --git a/ownpad_lite/l10n/sl.json b/ownpad_lite/l10n/sl.json
deleted file mode 100644
index 87f3ddb88..000000000
--- a/ownpad_lite/l10n/sl.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Dokument je bil v souporabi",
- "User %s shared quick document %s with you." : "User %s je odobril hitro souporabo dokumenta %s.",
- "My pad" : "Moja beležka",
- "Settings" : "Nastavitve",
- "Pad Title" : "Naslov beležke",
- "Open" : "Odpri",
- "Share with" : "Omogoči souporabo z",
- "Share" : "Souporaba",
- "Etherpad service URL" : "Naslov URL storitve Etherpad",
- "Username" : "Uporabniško ime",
- "Save" : "Shrani"
-},"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/sq.js b/ownpad_lite/l10n/sq.js
deleted file mode 100644
index 0efacda5d..000000000
--- a/ownpad_lite/l10n/sq.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Dokumenti u nda",
- "User %s shared quick document %s with you." : "Përdoruesi %s ndau me ju dokumentin e shpejtë %s.",
- "My pad" : "Blloku im",
- "Settings" : "Rregullime",
- "Pad Title" : "Titull Blloku",
- "Open" : "Hape",
- "Share with" : "Ndajeni me",
- "Share" : "Ndaje",
- "Etherpad service URL" : "URL shërbimi Etherpad",
- "Username" : "Emër përdoruesi",
- "Save" : "Ruaje"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/sq.json b/ownpad_lite/l10n/sq.json
deleted file mode 100644
index 885eb4201..000000000
--- a/ownpad_lite/l10n/sq.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Dokumenti u nda",
- "User %s shared quick document %s with you." : "Përdoruesi %s ndau me ju dokumentin e shpejtë %s.",
- "My pad" : "Blloku im",
- "Settings" : "Rregullime",
- "Pad Title" : "Titull Blloku",
- "Open" : "Hape",
- "Share with" : "Ndajeni me",
- "Share" : "Ndaje",
- "Etherpad service URL" : "URL shërbimi Etherpad",
- "Username" : "Emër përdoruesi",
- "Save" : "Ruaje"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/sr.js b/ownpad_lite/l10n/sr.js
deleted file mode 100644
index fc22eb99c..000000000
--- a/ownpad_lite/l10n/sr.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Документ је подељен",
- "User %s shared quick document %s with you." : "Корисник %s дели са вама брзи документ %s.",
- "My pad" : "Моја табла",
- "Settings" : "Поставке",
- "Pad Title" : "Наслов табле",
- "Open" : "Отвори",
- "Share with" : "Подели са",
- "Share" : "Дели",
- "Etherpad service URL" : "УРЛ Etherpad сервиса",
- "Username" : "Корисничко име",
- "Save" : "Сачувај"
-},
-"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/ownpad_lite/l10n/sr.json b/ownpad_lite/l10n/sr.json
deleted file mode 100644
index 9d063443b..000000000
--- a/ownpad_lite/l10n/sr.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Документ је подељен",
- "User %s shared quick document %s with you." : "Корисник %s дели са вама брзи документ %s.",
- "My pad" : "Моја табла",
- "Settings" : "Поставке",
- "Pad Title" : "Наслов табле",
- "Open" : "Отвори",
- "Share with" : "Подели са",
- "Share" : "Дели",
- "Etherpad service URL" : "УРЛ Etherpad сервиса",
- "Username" : "Корисничко име",
- "Save" : "Сачувај"
-},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/sr@latin.js b/ownpad_lite/l10n/sr@latin.js
deleted file mode 100644
index 076e1e51f..000000000
--- a/ownpad_lite/l10n/sr@latin.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Dokument je deljen",
- "User %s shared quick document %s with you." : "Korisnik %s je podelio brzi dokument %s sa Vama.",
- "My pad" : "Moje blokče",
- "Settings" : "Podešavanja",
- "Pad Title" : "Naslov Blokčeta",
- "Open" : "Otvori",
- "Share with" : "Podeli sa",
- "Share" : "Podeli",
- "Etherpad service URL" : "Etherpad servisni URL",
- "Username" : "Korisničko ime",
- "Save" : "Snimi"
-},
-"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/ownpad_lite/l10n/sr@latin.json b/ownpad_lite/l10n/sr@latin.json
deleted file mode 100644
index 6b1009452..000000000
--- a/ownpad_lite/l10n/sr@latin.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Dokument je deljen",
- "User %s shared quick document %s with you." : "Korisnik %s je podelio brzi dokument %s sa Vama.",
- "My pad" : "Moje blokče",
- "Settings" : "Podešavanja",
- "Pad Title" : "Naslov Blokčeta",
- "Open" : "Otvori",
- "Share with" : "Podeli sa",
- "Share" : "Podeli",
- "Etherpad service URL" : "Etherpad servisni URL",
- "Username" : "Korisničko ime",
- "Save" : "Snimi"
-},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/sv.js b/ownpad_lite/l10n/sv.js
deleted file mode 100644
index 2d2d1403f..000000000
--- a/ownpad_lite/l10n/sv.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Dokumentet delades",
- "User %s shared quick document %s with you." : "Användare %s delade dokument %s med dig.",
- "My pad" : "Min pad",
- "Settings" : "Inställningar",
- "Pad Title" : "Pad titel",
- "Open" : "Öppna",
- "Share with" : "Delad med",
- "Share" : "Dela",
- "Etherpad service URL" : "Etherpad service URL",
- "Username" : "Användarnamn",
- "Save" : "Spara"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/sv.json b/ownpad_lite/l10n/sv.json
deleted file mode 100644
index 0817187f0..000000000
--- a/ownpad_lite/l10n/sv.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Dokumentet delades",
- "User %s shared quick document %s with you." : "Användare %s delade dokument %s med dig.",
- "My pad" : "Min pad",
- "Settings" : "Inställningar",
- "Pad Title" : "Pad titel",
- "Open" : "Öppna",
- "Share with" : "Delad med",
- "Share" : "Dela",
- "Etherpad service URL" : "Etherpad service URL",
- "Username" : "Användarnamn",
- "Save" : "Spara"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/ta_IN.js b/ownpad_lite/l10n/ta_IN.js
deleted file mode 100644
index ac2d6b7ca..000000000
--- a/ownpad_lite/l10n/ta_IN.js
+++ /dev/null
@@ -1,6 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Settings" : "அமைப்புகள்"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/ta_IN.json b/ownpad_lite/l10n/ta_IN.json
deleted file mode 100644
index 29e053222..000000000
--- a/ownpad_lite/l10n/ta_IN.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{ "translations": {
- "Settings" : "அமைப்புகள்"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/ta_LK.js b/ownpad_lite/l10n/ta_LK.js
deleted file mode 100644
index a85fae8b5..000000000
--- a/ownpad_lite/l10n/ta_LK.js
+++ /dev/null
@@ -1,14 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "My pad" : "என்னுடைய pad",
- "Settings" : "அமைப்புகள்",
- "Pad Title" : "pad தலைப்பு",
- "Open" : "திறக்க",
- "Share with" : "பகிர்தல்",
- "Share" : "பகிர்வு",
- "Etherpad service URL" : "Etherpad சேவை URL",
- "Username" : "பயனாளர் பெயர்",
- "Save" : "சேமிக்க"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/ta_LK.json b/ownpad_lite/l10n/ta_LK.json
deleted file mode 100644
index 2cfb96f33..000000000
--- a/ownpad_lite/l10n/ta_LK.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{ "translations": {
- "My pad" : "என்னுடைய pad",
- "Settings" : "அமைப்புகள்",
- "Pad Title" : "pad தலைப்பு",
- "Open" : "திறக்க",
- "Share with" : "பகிர்தல்",
- "Share" : "பகிர்வு",
- "Etherpad service URL" : "Etherpad சேவை URL",
- "Username" : "பயனாளர் பெயர்",
- "Save" : "சேமிக்க"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/te.js b/ownpad_lite/l10n/te.js
deleted file mode 100644
index 505482e22..000000000
--- a/ownpad_lite/l10n/te.js
+++ /dev/null
@@ -1,8 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Settings" : "అమరికలు",
- "Username" : "వాడుకరి పేరు",
- "Save" : "భద్రపరచు"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/te.json b/ownpad_lite/l10n/te.json
deleted file mode 100644
index 1acae4260..000000000
--- a/ownpad_lite/l10n/te.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{ "translations": {
- "Settings" : "అమరికలు",
- "Username" : "వాడుకరి పేరు",
- "Save" : "భద్రపరచు"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/th_TH.js b/ownpad_lite/l10n/th_TH.js
deleted file mode 100644
index dc6d512b6..000000000
--- a/ownpad_lite/l10n/th_TH.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "เอกสารถูกแชร์",
- "User %s shared quick document %s with you." : "ผู้ใช้ %s ได้แชร์เอกสาร %s อย่างรวดเร็วกับคุณ",
- "My pad" : "แพ็ดของฉัน",
- "Settings" : "ตั้งค่า",
- "Pad Title" : "ชื่อของ Pad",
- "Open" : "เปิด",
- "Share with" : "แชร์ให้กับ",
- "Share" : "แชร์",
- "Etherpad service URL" : "URL ของบริการจาก Etherpad",
- "Username" : "ชื่อผู้ใช้งาน",
- "Save" : "บันทึก"
-},
-"nplurals=1; plural=0;");
diff --git a/ownpad_lite/l10n/th_TH.json b/ownpad_lite/l10n/th_TH.json
deleted file mode 100644
index f0bab498e..000000000
--- a/ownpad_lite/l10n/th_TH.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "เอกสารถูกแชร์",
- "User %s shared quick document %s with you." : "ผู้ใช้ %s ได้แชร์เอกสาร %s อย่างรวดเร็วกับคุณ",
- "My pad" : "แพ็ดของฉัน",
- "Settings" : "ตั้งค่า",
- "Pad Title" : "ชื่อของ Pad",
- "Open" : "เปิด",
- "Share with" : "แชร์ให้กับ",
- "Share" : "แชร์",
- "Etherpad service URL" : "URL ของบริการจาก Etherpad",
- "Username" : "ชื่อผู้ใช้งาน",
- "Save" : "บันทึก"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/tr.js b/ownpad_lite/l10n/tr.js
deleted file mode 100644
index 2b106316a..000000000
--- a/ownpad_lite/l10n/tr.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Belge paylaşıldı",
- "User %s shared quick document %s with you." : "%s kullanıcısı sizinle %s hızlı belgesini paylaştı.",
- "My pad" : "Bloknotum",
- "Settings" : "Ayarlar",
- "Pad Title" : "Not Başlığı",
- "Open" : "Aç",
- "Share with" : "Şununla paylaş",
- "Share" : "Paylaş",
- "Etherpad service URL" : "Etherpad hizmet URL'si",
- "Username" : "Kullanıcı Adı",
- "Save" : "Kaydet"
-},
-"nplurals=2; plural=(n > 1);");
diff --git a/ownpad_lite/l10n/tr.json b/ownpad_lite/l10n/tr.json
deleted file mode 100644
index e3120b621..000000000
--- a/ownpad_lite/l10n/tr.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Belge paylaşıldı",
- "User %s shared quick document %s with you." : "%s kullanıcısı sizinle %s hızlı belgesini paylaştı.",
- "My pad" : "Bloknotum",
- "Settings" : "Ayarlar",
- "Pad Title" : "Not Başlığı",
- "Open" : "Aç",
- "Share with" : "Şununla paylaş",
- "Share" : "Paylaş",
- "Etherpad service URL" : "Etherpad hizmet URL'si",
- "Username" : "Kullanıcı Adı",
- "Save" : "Kaydet"
-},"pluralForm" :"nplurals=2; plural=(n > 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/ug.js b/ownpad_lite/l10n/ug.js
deleted file mode 100644
index abcdc8b9c..000000000
--- a/ownpad_lite/l10n/ug.js
+++ /dev/null
@@ -1,11 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Settings" : "تەڭشەكلەر",
- "Open" : "ئاچ",
- "Share with" : "ھەمبەھىر",
- "Share" : "ھەمبەھىر",
- "Username" : "ئىشلەتكۈچى ئاتى",
- "Save" : "ساقلا"
-},
-"nplurals=1; plural=0;");
diff --git a/ownpad_lite/l10n/ug.json b/ownpad_lite/l10n/ug.json
deleted file mode 100644
index f56dab97c..000000000
--- a/ownpad_lite/l10n/ug.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{ "translations": {
- "Settings" : "تەڭشەكلەر",
- "Open" : "ئاچ",
- "Share with" : "ھەمبەھىر",
- "Share" : "ھەمبەھىر",
- "Username" : "ئىشلەتكۈچى ئاتى",
- "Save" : "ساقلا"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/uk.js b/ownpad_lite/l10n/uk.js
deleted file mode 100644
index 6827cfdb7..000000000
--- a/ownpad_lite/l10n/uk.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Документ був опублікований",
- "User %s shared quick document %s with you." : "Користувач %s поділився документом %s з вами.",
- "My pad" : "Мій блокнот",
- "Settings" : "Налаштування",
- "Pad Title" : "Назва блокноту",
- "Open" : "Відкрити",
- "Share with" : "Опублікувати для",
- "Share" : "Поділитися",
- "Etherpad service URL" : "URL Etherpad служби",
- "Username" : "Ім'я користувача",
- "Save" : "Зберегти"
-},
-"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/ownpad_lite/l10n/uk.json b/ownpad_lite/l10n/uk.json
deleted file mode 100644
index 561c5e1f5..000000000
--- a/ownpad_lite/l10n/uk.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Документ був опублікований",
- "User %s shared quick document %s with you." : "Користувач %s поділився документом %s з вами.",
- "My pad" : "Мій блокнот",
- "Settings" : "Налаштування",
- "Pad Title" : "Назва блокноту",
- "Open" : "Відкрити",
- "Share with" : "Опублікувати для",
- "Share" : "Поділитися",
- "Etherpad service URL" : "URL Etherpad служби",
- "Username" : "Ім'я користувача",
- "Save" : "Зберегти"
-},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/ur_PK.js b/ownpad_lite/l10n/ur_PK.js
deleted file mode 100644
index 7a71e9764..000000000
--- a/ownpad_lite/l10n/ur_PK.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "دستاویز اشتراک کر دی گئی",
- "User %s shared quick document %s with you." : "صارف %s فوری دستاویز مشترک کی %s آپ سے",
- "My pad" : "میرا پیڈ",
- "Settings" : "سیٹینگز",
- "Pad Title" : "پیڈ کی سرخی",
- "Open" : "کھولیں",
- "Share with" : "سے اشتراک کریں",
- "Share" : "اشتراک",
- "Etherpad service URL" : "ایدرپیڈ سروس یو آر ایل",
- "Username" : "اسم صارف",
- "Save" : "حفظ"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/ownpad_lite/l10n/ur_PK.json b/ownpad_lite/l10n/ur_PK.json
deleted file mode 100644
index 62143a4b6..000000000
--- a/ownpad_lite/l10n/ur_PK.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "دستاویز اشتراک کر دی گئی",
- "User %s shared quick document %s with you." : "صارف %s فوری دستاویز مشترک کی %s آپ سے",
- "My pad" : "میرا پیڈ",
- "Settings" : "سیٹینگز",
- "Pad Title" : "پیڈ کی سرخی",
- "Open" : "کھولیں",
- "Share with" : "سے اشتراک کریں",
- "Share" : "اشتراک",
- "Etherpad service URL" : "ایدرپیڈ سروس یو آر ایل",
- "Username" : "اسم صارف",
- "Save" : "حفظ"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/vi.js b/ownpad_lite/l10n/vi.js
deleted file mode 100644
index 019360b80..000000000
--- a/ownpad_lite/l10n/vi.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "Tài liệu được chia sẻ",
- "User %s shared quick document %s with you." : "Người dùng %s chia sẻ tài liệu %s với bạn.",
- "My pad" : "Pad của tôi",
- "Settings" : "Cài đặt",
- "Pad Title" : "Tiêu đề pad",
- "Open" : "Mở",
- "Share with" : "Chia sẻ với",
- "Share" : "Chia sẻ",
- "Etherpad service URL" : "Dịch vụ URL Etherpad ",
- "Username" : "Tên đăng nhập",
- "Save" : "Lưu"
-},
-"nplurals=1; plural=0;");
diff --git a/ownpad_lite/l10n/vi.json b/ownpad_lite/l10n/vi.json
deleted file mode 100644
index 94c76859c..000000000
--- a/ownpad_lite/l10n/vi.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "Tài liệu được chia sẻ",
- "User %s shared quick document %s with you." : "Người dùng %s chia sẻ tài liệu %s với bạn.",
- "My pad" : "Pad của tôi",
- "Settings" : "Cài đặt",
- "Pad Title" : "Tiêu đề pad",
- "Open" : "Mở",
- "Share with" : "Chia sẻ với",
- "Share" : "Chia sẻ",
- "Etherpad service URL" : "Dịch vụ URL Etherpad ",
- "Username" : "Tên đăng nhập",
- "Save" : "Lưu"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/zh_CN.js b/ownpad_lite/l10n/zh_CN.js
deleted file mode 100644
index 72535f71b..000000000
--- a/ownpad_lite/l10n/zh_CN.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "文档已分享",
- "User %s shared quick document %s with you." : "用户 %s 与您分享了便捷文档 %s。",
- "My pad" : "我的 Pad",
- "Settings" : "设置",
- "Pad Title" : "Pad 名称",
- "Open" : "打开",
- "Share with" : "分享之",
- "Share" : "分享",
- "Etherpad service URL" : "Etherpad 服务 URL",
- "Username" : "用户名",
- "Save" : "保存"
-},
-"nplurals=1; plural=0;");
diff --git a/ownpad_lite/l10n/zh_CN.json b/ownpad_lite/l10n/zh_CN.json
deleted file mode 100644
index 370687bb0..000000000
--- a/ownpad_lite/l10n/zh_CN.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "文档已分享",
- "User %s shared quick document %s with you." : "用户 %s 与您分享了便捷文档 %s。",
- "My pad" : "我的 Pad",
- "Settings" : "设置",
- "Pad Title" : "Pad 名称",
- "Open" : "打开",
- "Share with" : "分享之",
- "Share" : "分享",
- "Etherpad service URL" : "Etherpad 服务 URL",
- "Username" : "用户名",
- "Save" : "保存"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/zh_HK.js b/ownpad_lite/l10n/zh_HK.js
deleted file mode 100644
index 09b115185..000000000
--- a/ownpad_lite/l10n/zh_HK.js
+++ /dev/null
@@ -1,11 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Settings" : "設定",
- "Open" : "開啟",
- "Share with" : "分享",
- "Share" : "分享",
- "Username" : "用戶名稱",
- "Save" : "儲存"
-},
-"nplurals=1; plural=0;");
diff --git a/ownpad_lite/l10n/zh_HK.json b/ownpad_lite/l10n/zh_HK.json
deleted file mode 100644
index bfc3bc239..000000000
--- a/ownpad_lite/l10n/zh_HK.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{ "translations": {
- "Settings" : "設定",
- "Open" : "開啟",
- "Share with" : "分享",
- "Share" : "分享",
- "Username" : "用戶名稱",
- "Save" : "儲存"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/ownpad_lite/l10n/zh_TW.js b/ownpad_lite/l10n/zh_TW.js
deleted file mode 100644
index d3407ee91..000000000
--- a/ownpad_lite/l10n/zh_TW.js
+++ /dev/null
@@ -1,16 +0,0 @@
-OC.L10N.register(
- "ownpad_lite",
- {
- "Document was shared" : "已分享文件",
- "User %s shared quick document %s with you." : "用戶 %s 與您分享了一個文件 %s 。",
- "My pad" : "我的記事本",
- "Settings" : "設定",
- "Pad Title" : "記事本標題",
- "Open" : "開啟",
- "Share with" : "與...分享",
- "Share" : "分享",
- "Etherpad service URL" : "Etherpad 服務網址",
- "Username" : "使用者名稱",
- "Save" : "儲存"
-},
-"nplurals=1; plural=0;");
diff --git a/ownpad_lite/l10n/zh_TW.json b/ownpad_lite/l10n/zh_TW.json
deleted file mode 100644
index 5b1ccec53..000000000
--- a/ownpad_lite/l10n/zh_TW.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "translations": {
- "Document was shared" : "已分享文件",
- "User %s shared quick document %s with you." : "用戶 %s 與您分享了一個文件 %s 。",
- "My pad" : "我的記事本",
- "Settings" : "設定",
- "Pad Title" : "記事本標題",
- "Open" : "開啟",
- "Share with" : "與...分享",
- "Share" : "分享",
- "Etherpad service URL" : "Etherpad 服務網址",
- "Username" : "使用者名稱",
- "Save" : "儲存"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/ownpad_lite/lib/contacts.php b/ownpad_lite/lib/contacts.php
deleted file mode 100644
index b0f27a8ef..000000000
--- a/ownpad_lite/lib/contacts.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-/**
- * ownCloud - ownpad_lite plugin
- *
- * @author Victor Dubiniuk
- * @copyright 2013 Victor Dubiniuk victor.dubiniuk@gmail.com
- *
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- */
-
-namespace OCA\ownpad_lite;
-
-class Contacts{
- public static function search($str){
- // The API is not active -> nothing to do
- if (!\OCP\Contacts::isEnabled() || strlen($str)<3) {
- return array();
- }
-
- $result = \OCP\Contacts::search($str, array('FN', 'EMAIL'));
- $receivers = array();
- foreach ($result as $r) {
- $id = $r['id'];
- $fn = $r['FN'];
- $email = $r['EMAIL'];
- if (!is_array($email)) {
- $email = array($email);
- }
-
- // loop through all email addresses of this contact
- foreach ($email as $e) {
- $displayName = $fn . " <$e>";
- $receivers[] = array(
- 'id' => $id,
- 'label' => $displayName,
- 'value' => $displayName);
- }
- }
- return $receivers;
- }
-}
diff --git a/ownpad_lite/settings.php b/ownpad_lite/settings.php
deleted file mode 100644
index c4af88fc8..000000000
--- a/ownpad_lite/settings.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-
-/**
- * ownCloud - ownpad_lite plugin
- *
- * @author Victor Dubiniuk
- * @copyright 2012 Victor Dubiniuk victor.dubiniuk@gmail.com
- *
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- */
-
-namespace OCA\ownpad_lite;
-
-$tmpl = new \OCP\Template(App::APP_ID, 'settings');
-
-$tmpl->assign(App::CONFIG_ETHERPAD_URL, App::getServiceUrl());
-$tmpl->assign(App::CONFIG_USERNAME, App::getUsername());
-
-$tmpl->printPage();
diff --git a/ownpad_lite/templates/index.php b/ownpad_lite/templates/index.php
deleted file mode 100644
index d734ab581..000000000
--- a/ownpad_lite/templates/index.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-
-/**
- * ownCloud - ownpad_lite plugin
- *
- * @author Victor Dubiniuk
- * @copyright 2012 Victor Dubiniuk victor.dubiniuk@gmail.com
- *
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- */
- ?>
-<?php $src = OCP\Util::imagePath('core', 'actions/settings.png'); ?>
-<div id="ownpad-location">
- <button id="settingsbtn" title="<?php p($l->t('Settings')); ?>">
- <img class="svg" src="<?php print_unescaped($src); ?>" alt="<?php p($l->t('Settings')); ?>" />
- </button>
- <label for="ownpad-title"><?php p($l->t('Pad Title')) ?></label><input id="ownpad-title" value="eetest" />
- <button id="ownpad-open"><?php p($l->t('Open')) ?></button>
- <label for="ownpad-share"><?php p($l->t('Share with')) ?></label><input id="ownpad-share" value="" />
- <button id="ownpad-share-button"><?php p($l->t('Share')) ?></button>
-</div>
-<div id="ownpad-content"></div>
-<div id="ownpad-appsettings"><div id="appsettings" class="popup hidden topright"></div></div>
-
-<script type="text/javascript" src="<?php print_unescaped(OCP\Util::linkToRoute('ownpad_lite'));?>"></script> \ No newline at end of file
diff --git a/ownpad_lite/templates/settings.php b/ownpad_lite/templates/settings.php
deleted file mode 100644
index 6621f1525..000000000
--- a/ownpad_lite/templates/settings.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-
-/**
- * ownCloud - ownpad_lite plugin
- *
- * @author Victor Dubiniuk
- * @copyright 2012 Victor Dubiniuk victor.dubiniuk@gmail.com
- *
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- */
- ?>
-<?php $urlKey = OCA\ownpad_lite\App::CONFIG_ETHERPAD_URL; ?>
-<?php $usernameKey = OCA\ownpad_lite\App::CONFIG_USERNAME; ?>
-<dl>
- <dt><?php p($l->t('Etherpad service URL')); ?></dt>
- <dd>
- <input id="<?php p($urlKey); ?>" value="<?php p($_[$urlKey]); ?>" />
- </dd>
- <dt>
- <?php p($l->t('Username')); ?>
- </dt>
- <dd>
- <input id="<?php p($usernameKey); ?>" value="<?php p($_[$usernameKey]); ?>" />
- </dd>
- <dt>&nbsp;</dt>
- <dd>
- <button id="ownpad_settings_apply" class="hidden"><?php p($l->t('Save')); ?>
- </dd>
-</dl> \ No newline at end of file
diff --git a/pushnotifications/TODO b/pushnotifications/TODO
deleted file mode 100755
index 6dedbc09a..000000000
--- a/pushnotifications/TODO
+++ /dev/null
@@ -1,5 +0,0 @@
-
-- Make the application key configurable on the admin page
-- Integrate into Activity app. It´s tricky to do the correnct event translations otherwise.
-- Support other push services beside pushover
-
diff --git a/pushnotifications/ajax/changepushid.php b/pushnotifications/ajax/changepushid.php
deleted file mode 100755
index e7c8900b2..000000000
--- a/pushnotifications/ajax/changepushid.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-
-/**
- * ownCloud - push notifications app
- *
- * @author Frank Karlitschek
- * @copyright 2014 Frank Karlitschek frank@owncloud.org
- *
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- */
-
-
-// Check permissions
-OCP\JSON::callCheck();
-OC_JSON::checkLoggedIn();
-
-// load L10N
-$l = \OC::$server->getL10N('pushnotifications');
-
-$username = OC_User::getUser();
-$pushnotificationid = $_POST["pushnotificationid"];
-
-// store the new ID
-if( \OCP\Config::setUserValue($username, 'pushnotifications', 'pushid', $pushnotificationid) ) {
- OC_JSON::success(array("data" => array( "message" => $l->t('Your id has been changed.'), "username" => $username, 'pushnotificationid' => $pushnotificationid )));
-} else {
- OC_JSON::error(array("data" => array( "message" => $l->t("Unable to change the id"), 'pushnotificationid' => \OCP\Config::getUserValue(\OCP\User::getUser(), 'pushnotifications', 'pushid', '') )));
-}
diff --git a/pushnotifications/appinfo/app.php b/pushnotifications/appinfo/app.php
deleted file mode 100755
index 6c1cda249..000000000
--- a/pushnotifications/appinfo/app.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-/**
- * ownCloud - push notifications app
- *
- * @author Frank Karlitschek
- * @copyright 2014 Frank Karlitschek frank@owncloud.org
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
- *
- * You should have received a copy of the GNU Affero General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-use OCA\PushNotifications\Push;
-
-// register the settings
-OCP\App::registerpersonal('pushnotifications', 'personal');
-
-// register the hooks for activities
-OCA\pushnotifications\push::registerHooks();
-
diff --git a/pushnotifications/appinfo/info.xml b/pushnotifications/appinfo/info.xml
deleted file mode 100755
index a42832150..000000000
--- a/pushnotifications/appinfo/info.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0"?>
-<info>
- <id>pushnotifications</id>
- <name>Push Notifications</name>
- <description>This app can send push notifications to iOS, Android and Mac devices. Notifications are send for new events in the activity feed. This is using the pushover.net service. The coresponding pushover apps for mobile and desktop need to be installed additionally.</description>
- <licence>AGPL</licence>
- <author>Frank Karlitschek</author>
- <require>7.0</require>
- <types>
- <filesystem/>
- </types>
-</info>
diff --git a/pushnotifications/appinfo/routes.php b/pushnotifications/appinfo/routes.php
deleted file mode 100755
index 761d9c21e..000000000
--- a/pushnotifications/appinfo/routes.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-/**
- * ownCloud - push notifications app
- *
- * @author Frank Karlitschek
- * @copyright 2014 Frank Karlitschek frank@owncloud.org
- *
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- */
-
-
-$this->create('pushnotifications_ajax_changepushid', 'ajax/changepushid.php')
- ->actionInclude('pushnotifications/ajax/changepushid.php');
-
diff --git a/pushnotifications/appinfo/version b/pushnotifications/appinfo/version
deleted file mode 100755
index d3827e75a..000000000
--- a/pushnotifications/appinfo/version
+++ /dev/null
@@ -1 +0,0 @@
-1.0
diff --git a/pushnotifications/css/personal.css b/pushnotifications/css/personal.css
deleted file mode 100755
index 27d506c69..000000000
--- a/pushnotifications/css/personal.css
+++ /dev/null
@@ -1,11 +0,0 @@
-.msg.success {
- color: #fff;
- background-color: #47a447;
- padding: 3px;
-}
-.msg.error {
- color: #fff;
- background-color: #d2322d;
- padding: 3px;
-}
-
diff --git a/pushnotifications/js/personal.js b/pushnotifications/js/personal.js
deleted file mode 100755
index 6f4242892..000000000
--- a/pushnotifications/js/personal.js
+++ /dev/null
@@ -1,18 +0,0 @@
-/**
- * Post the push notification id to the server.
- */
-function changePushId () {
- if ($('#pushnotificationid').val() !== '') {
- OC.msg.startSaving('#pushnotificationform .msg');
- // Serialize the data
- var post = $("#pushnotificationform").serialize();
- $.post( OC.filePath( 'pushnotifications', 'ajax', 'changepushid.php' ), post, function (data) {
- OC.msg.finishedSaving('#pushnotificationform .msg', data);
- });
- }
-}
-
-$(document).ready(function () {
- $('#pushnotificationid').keyUpDelayedOrEnter(changePushId);
-});
-
diff --git a/pushnotifications/l10n/.gitkeep b/pushnotifications/l10n/.gitkeep
deleted file mode 100755
index e69de29bb..000000000
--- a/pushnotifications/l10n/.gitkeep
+++ /dev/null
diff --git a/pushnotifications/lib/Pushover.php b/pushnotifications/lib/Pushover.php
deleted file mode 100755
index 0d65db2ad..000000000
--- a/pushnotifications/lib/Pushover.php
+++ /dev/null
@@ -1,494 +0,0 @@
-<?php
-/**
- * php-pushover
- *
- * PHP service wrapper for the pushover.net API: https://pushover.net/api
- *
- * @author Chris Schalenborgh <chris.s@kryap.com>
- * @version 0.2
- * @package php-pushover
- * @example test.php
- * @link https://pushover.net/api
- * @license BSD License
- */
-
-class Pushover
-{
- // api url
- const API_URL = 'https://api.pushover.net/1/messages.xml';
- //validation url
- const VALIDATION_URL = 'https://api.pushover.net/1/users/validate.json';
- //sounds URL
- const SOUNDS_URL = 'https://api.pushover.net/1/sounds.json?token=%s';
-
- /**
- * Application API token
- *
- * @var string
- */
- private $_token;
-
- /**
- * User API token
- *
- * @var string
- */
- private $_user;
-
- /**
- * Turn on/off debug mode
- *
- * @var bool
- */
- private $_debug = false;
-
- /**
- * Title of the message
- *
- * @var string
- */
- private $_title;
-
- /**
- * The message itself (up to 512 characters)
- *
- * @var string
- */
- private $_message;
-
- /**
- * Timestamp in Unix timestamp format
- *
- * @var int
- */
- private $_timestamp;
-
- /**
- * User's device (user specific)
- *
- * @var string
- */
- private $_device;
-
- /**
- * Priority of the message. Can be 0, 1 or 2. High-priority messages (1) override a user's "quiet hours" setting and will always be delivered any time they are received. High priority messages are highlighted in red in the Android and iOS clients. Emergency Priority (2) messages work similar to High-Priority messages, but they are repeated until the message is acknowledged by the user.
- *
- * @var string
- */
- private $_priority = 0;
-
- /**
- * Include a Supplementary URL (up to 200 characters)
- *
- * @var string
- */
- private $_url;
-
- /**
- * Title of the included URL (up to 50 characters)
- *
- * @var string
- */
- private $_url_title;
-
- /**
- * The Retry parameter is only used when the Priority is set to 2 (or emergency-priority), and specifies how often (in seconds) the Pushover servers will send the same notification to the user. In a situation where your user might be in a noisy environment or sleeping, retrying the notification (with sound and vibration) will help get his or her attention. This parameter must have a value of at least 30 seconds between retries.
- *
- * @var int
- */
- private $_retry;
-
- /**
- * The expire parameter is only used when the Priority is set to 2 (or emergency-priority), and specifies how many seconds your notification will continue to be retried for. If the notification has not been acknowledged in expire seconds, it will be marked as expired and will stop being sent to the user. This parameter must have a maximum value of at most 86400 seconds (24 hours).
- *
- * @var int
- */
- private $_expire;
-
- /**
- * The optional callback parameter may be supplied with a publicly-accessible URL that our servers will send a request to when the user has acknowledged your notification.
- *
- * @var string
- */
- private $_callback;
-
- /**
- * The sound parameter. Get an up-to-date sound list from https://api.pushover.net/1/sounds.json?token=
- *
- * @var int
- */
- private $_sound;
-
- /**
- * Default constructor
- */
- public function __construct () {
- }
-
- /**
- * Set API token
- *
- * @param string $token Your app API key.
- *
- * @return void
- */
- public function setToken ($token) {
- $this->_token = (string)$token;
- }
-
- /**
- * Get API token
- *
- * @return string
- */
- public function getToken () {
- return $this->_token;
- }
-
- /**
- * Set API user
- *
- * @param string $user The user's API key.
- *
- * @return void
- */
- public function setUser ($user) {
- $this->_user = (string)$user;
- }
-
- /**
- * Validate the user using Pushover API
- *
- * @return bool
- */
- public function validateUser() {
- if(!Empty($this->_token)&&!Empty($this->_user)){
- $c = curl_init();
- curl_setopt($c,CURLOPT_URL,self::VALIDATION_URL);
- curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($c, CURLOPT_POSTFIELDS,array(
- "token" => $this->_token,
- "user" => $this->_user
- ));
- $response = curl_exec($c);
- $json = json_decode($response);
- return $json->status == 1;
- } else {
- return null;
- }
- }
-
- /**
- * Get API user
- *
- * @return string
- */
- public function getUser () {
- return $this->_user;
- }
-
- /**
- * Set message title
- *
- * @param string $title Title of push notification.
- *
- * @return void
- */
- public function setTitle ($title) {
- $this->_title = (string)$title;
- }
-
- /**
- * Get message title
- *
- * @return string
- */
- public function getTitle () {
- return $this->_title;
- }
-
- /**
- * Set Retry Time
- *
- * @param int $retry The retry time (in seconds). Must have a value of at least 30 seconds.
- */
- public function setRetry ($retry) {
- $this->_retry = (int)$retry;
- }
-
- /**
- * Get Retry Time
- *
- * @return int
- */
- public function getRetry() {
- return $this->_retry;
- }
-
- /**
- * Set Expire Time
- *
- * @param int $expire The expiry time (in seconds). Must have a maximum value of at most, 86400 seconds.
- */
- public function setExpire ($expire) {
- $this->_expire = (int)$expire;
- }
-
- /**
- * Get Expire Time
- *
- * @return string
- */
- public function getExpire () {
- return $this->_expire;
- }
-
- /**
- * Set Callback URL
- *
- * @param string $callback a publically-accessible URL that Pushover sends a request to when the user has acknowledged your notification.
- */
- public function setCallback ($callback) {
- $this->_callback = $callback;
- }
-
- /**
- * Get Callback URL
- *
- * @return int
- */
- public function getCallback() {
- return $this->_callback;
- }
-
- /**
- * Set message
- *
- * @param string $msg Message of push notification.
- *
- * @return void
- */
- public function setMessage ($msg) {
- $this->_message = (string)$msg;
- }
-
- /**
- * Get message
- *
- * @return string
- */
- public function getMessage () {
- return $this->_message;
- }
-
- /**
- * Set device
- *
- * @param string $device Leave this empty if you want to send to all user's devices. This can be user specific!
- *
- * @return void
- */
- public function setDevice ($device) {
- $this->_device = (string)$device;
- }
-
- /**
- * Get device
- *
- * @return string
- */
- public function getDevice () {
- return $this->_device;
- }
-
- /**
- * Set timestamp
- *
- * Messages are stored on the Pushover servers with a timestamp of when they were initially received through the API. This timestamp is sent to and shown on client devices, and messages are listed in order of these timestamps. In most cases, this default timestamp is acceptable. This is not for scheduling!
- *
- * @param int $time dispaly time on device
- *
- * @return void
- */
- public function setTimestamp ($time) {
- $this->_timestamp = (int)$time;
- }
-
- /**
- * Get timestamp
- *
- * @return int
- */
- public function getTimestamp () {
- return $this->_timestamp;
- }
-
- /**
- * Set priority (-1, 0 or 1)
- *
- * -1 Low priority notifications.
- * 0 Default.
- * 1 triggers a high-priority alert that always generates sound and vibration.
- * 2 triggers the same high-priority alert that #1 does; but is repeated until the notification is acknowledged by the user.
- *
- * @param int $priority priority level.
- *
- * @return void
- */
- public function setPriority ($priority) {
- $this->_priority = (int)$priority;
- }
-
- /**
- * Get priority
- *
- * @return int
- */
- public function getPriority () {
- return $this->_priority;
- }
-
- /**
- * Set url
- *
- * @param string $url Add an url to your notification.
- *
- * @return void
- */
- public function setUrl ($url) {
- $this->_url = (string)$url;
- }
-
- /**
- * Get url
- *
- * @return string
- */
- public function getUrl () {
- return $this->_url;
- }
-
- /**
- * Set url title
- *
- * @param string $url_title A title if you want to show a text instead of the actual url.
- *
- * @return void
- */
- public function setUrlTitle ($url_title) {
- $this->_url_title = (string)$url_title;
- }
-
- /**
- * Get url title
- *
- * @return string
- */
- public function getUrlTitle () {
- return $this->_url_title;
- }
-
- /**
- * Set debug mode
- *
- * @param bool $debug Enable this to receive detailed input and output info.
- *
- * @return void
- */
- public function setDebug ($debug) {
- $this->_debug = (boolean)$debug;
- }
-
- /**
- * Get debug mode
- *
- * @return bool
- */
- public function getDebug () {
- return $this->_debug;
- }
-
- /**
- * Set sound
- *
- * @param string $sound If no sound parameter is specified, the user's default tone will play. If the user has not chosen a custom sound, the standard Pushover sound will play.
- *
- * @return void
- */
- public function setSound ($sound) {
- $this->_sound = (string)$sound;
- }
-
- /**
- * Get sound
- *
- * @return string
- */
- public function getSound () {
- return $this->_sound;
- }
-
- /**
- * Gets an array of notification sounds that can be used with Pushover.
- *
- * @return array
- */
- public function getSoundsList() {
- if(!empty($this->_token)){
- $c = curl_init();
- curl_setopt($c, CURLOPT_URL, sprintf(self::SOUNDS_URL,$this->_token));
- curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
- $response = curl_exec($c);
- $decoded = json_decode($response,true);
- return $decoded['sounds'];
- }
- return null;
- }
-
- /**
- * Send message to Pushover API
- *
- * @return bool
- */
- public function send() {
- if(!Empty($this->_token) && !Empty($this->_user) && !Empty($this->_message)) {
- if(!isset($this->_timestamp)) $this->setTimestamp(time());
-
- $c = curl_init();
- curl_setopt($c, CURLOPT_URL, self::API_URL);
- curl_setopt($c, CURLOPT_HEADER, false);
- /*
- if possible, set CURLOPT_SSL_VERIFYPEER to true..
- - http://www.tehuber.com/phps/cabundlegen.phps
- */
- curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($c, CURLOPT_POSTFIELDS, array(
- 'token' => $this->getToken(),
- 'user' => $this->getUser(),
- 'title' => $this->getTitle(),
- 'message' => $this->getMessage(),
- 'device' => $this->getDevice(),
- 'priority' => $this->getPriority(),
- 'timestamp' => $this->getTimestamp(),
- 'expire' => $this->getExpire(),
- 'retry' => $this->getRetry(),
- 'callback' => $this->getCallback(),
- 'url' => $this->getUrl(),
- 'sound' => $this->getSound(),
- 'url_title' => $this->getUrlTitle()
- ));
- $response = curl_exec($c);
- $xml = simplexml_load_string($response);
-
- if($this->getDebug()) {
- return array('output' => $xml, 'input' => $this);
- }
- else {
- return ($xml->status == 1) ? true : false;
- }
- }
- }
-}
-?>
diff --git a/pushnotifications/lib/push.php b/pushnotifications/lib/push.php
deleted file mode 100755
index 484fad333..000000000
--- a/pushnotifications/lib/push.php
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-
-/**
- * ownCloud - push notifications app
- *
- * @author Frank Karlitschek
- * @copyright 2014 Frank Karlitschek frank@owncloud.org
- *
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- */
-
-
-namespace OCA\pushnotifications;
-
-// load external lib
-require('Pushover.php');
-
-
-/**
- * Class to send push notifications
- * @package OCA\pushnotifications
- */
-class Push {
-
- /**
- * registerthe hooks. Only one for now.
- *
- */
- public static function registerHooks() {
-
- // listen to the activity events
- \OCP\Util::connectHook('OC_Activity', 'post_event', 'OCA\pushnotifications\Push', 'event');
- }
-
-
- /**
- * handle incoming events
- *
- */
- public static function event($params) {
-
- // send a push notification
- Push::send($params['subject'].' '.$params['message'].' '.$params['file'],$params['link']);
- }
-
-
- /**
- * send push notifications. Currently only pushover.net is supported
- *
- */
- public static function send($subject,$url) {
-
- $app_key = \OCP\Config::getSystemValue('pushnotifications_pushover_app','');
- $pushid = trim(\OCP\Config::getUserValue(\OCP\User::getUser(), 'pushnotifications', 'pushid', ''));
-
- if(!empty($pushid)) {
- $push = new \Pushover();
- $push->setToken($app_key);
- $push->setUser($pushid);
- $push->setMessage($subject);
- $push->setUrl($url);
- $push->setUrlTitle('ownCloud');
- $push->setCallback($url);
- $push->setTimestamp(time());
- $push->setDebug(true);
- $go = $push->send();
- unset($push);
- }
- }
-
-}
-
diff --git a/pushnotifications/personal.php b/pushnotifications/personal.php
deleted file mode 100755
index 33687cc00..000000000
--- a/pushnotifications/personal.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-
-/**
- * ownCloud - push notifications app
- *
- * @author Frank Karlitschek
- * @copyright 2014 Frank Karlitschek frank@owncloud.org
- *
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- */
-
-namespace OCA\pushnotifications;
-
-// load js and css
-\OCP\Util::addScript('pushnotifications', 'personal');
-\OCP\Util::addStyle('pushnotifications', 'personal');
-
-// show template
-$tmpl = new \OCP\Template('pushnotifications', 'personal');
-$pushId = \OCP\Config::getUserValue(\OCP\User::getUser(), 'pushnotifications', 'pushid', '');
-$appId = \OCP\Config::getSystemValue('pushnotifications_pushover_app', '');
-$tmpl->assign('pushId', $pushId);
-$tmpl->assign('appId', $appId);
-
-return $tmpl->fetchPage();
diff --git a/pushnotifications/templates/personal.php b/pushnotifications/templates/personal.php
deleted file mode 100755
index e4d795d1a..000000000
--- a/pushnotifications/templates/personal.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<form id="pushnotificationform" class="section">
- <h2>
- <label for="pushnotificationid"><?php echo $l->t('Push Notification');?></label>
- </h2>
- <input type="text" id="pushnotificationid" name="pushnotificationid" size="50"
- value="<?php p($_['pushId'])?>"
- placeholder="Your Pushover.net id"
- autocomplete="on" autocapitalize="off" autocorrect="off" />
- <span class="msg"></span>
- <?php echo '<br />'.$l->t('Please install the <a href="https://pushover.net">pushover.net</a> app on your iOS or Android device or Mac. Then get the Pushover user key from the settings and enter it here. You will now get push notification for your activities.<br />') ;?>
- <?php if(empty($_['appId'])) echo '<br />'.$l->t('Please register and app on Pushover.net and set the app ID in the ownCloud config.php file. The config variable is called: "pushnotifications_pushover_app"'); ?>
-</form>
diff --git a/reader/ajax/canvas_saver.php b/reader/ajax/canvas_saver.php
deleted file mode 100755
index 6c8f9e217..000000000
--- a/reader/ajax/canvas_saver.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
- // Get the data
- $imageData=$_POST['canv_data'];
- $title = rtrim($_POST['title'],'pdf');
- $location = urldecode(dirname($_POST['location']));
-
- if($location != '/')
- $location = $location.'/';
- $filteredData=substr($imageData, strpos($imageData, ",")+1);
- $owner = OCP\USER::getUser();
- $save_dir = OCP\Config::getSystemValue("datadirectory").'/'. $owner .'/reader';
- $save_dir .= $location;
- $thumb_file = $save_dir . $title;
- if (!is_dir($save_dir)) {
- mkdir($save_dir, 0777, true);
- }
- $image = new OC_Image($filteredData);
- if ($image->valid()) {
- $image->centerCrop(100);
- $image->fixOrientation();
- $image->save($thumb_file.'png');
- }
-?>
diff --git a/reader/ajax/remove_tags.php b/reader/ajax/remove_tags.php
deleted file mode 100644
index 2cde7c865..000000000
--- a/reader/ajax/remove_tags.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
- include ('reader/lib/tag_utils.php');
- $filepath = $_POST['filepath'];
- $tag_toBeRemv = $_POST['tag'];
- $tags = find_tags_for_ebook($filepath);
-
- $arr = explode(',',$tags);
- $arr2 = array();
- foreach($arr as $a) {
- if (strcmp($a,$tag_toBeRemv) != 0)
- $arr2[] = $a;
- }
- $new_tags = implode(",",$arr2);
- update_tag_for_ebook($new_tags,$filepath);
-
-?>
diff --git a/reader/ajax/tags.php b/reader/ajax/tags.php
deleted file mode 100755
index cf9b9180e..000000000
--- a/reader/ajax/tags.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-include('reader/lib/tag_utils.php');
- $new_tag = $_POST['tag'];
- $path_of_ebook = $_POST['path'];
- $tags = find_tags_for_ebook($path_of_ebook);
- if ($tags != NULL) {
- echo $new_tag;
- $new_tag = $tags.','.$new_tag;
- update_tag_for_ebook($new_tag,$path_of_ebook);
- }
- else {
- insert_new_tag($new_tag,$path_of_ebook);
- echo $new_tag;
- }
-?>
diff --git a/reader/ajax/thumbnail.php b/reader/ajax/thumbnail.php
deleted file mode 100755
index 38859ea1e..000000000
--- a/reader/ajax/thumbnail.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-
- OCP\JSON::checkLoggedIn();
- OCP\JSON::checkAppEnabled('reader');
-
- require_once('reader/lib/thumbnail.php');
- $img = $_GET['filepath'];
- $image = thumb($img);
- if ($image) {
- OCP\Response::enableCaching(3600 * 24); // 24 hour
- $image->show();
- }
-
-?>
diff --git a/reader/appinfo/app.php b/reader/appinfo/app.php
deleted file mode 100755
index 06fbece48..000000000
--- a/reader/appinfo/app.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-OC::$CLASSPATH['OC_ReaderSearchProvider'] = 'reader/lib/search.php';
-
-OCP\App::register(array(
- 'order' => 20,
- 'id' => 'reader',
- 'name' => 'reader'));
-
-OCP\App::addNavigationEntry( array(
- 'id' => 'reader_index',
- 'order' => 20,
- 'href' => OCP\Util::linkTo('reader', 'index.php'),
- 'icon' => OCP\Util::imagePath( 'reader', 'reader.png' ),
- 'name'=>'Reader'));
-
-OC_Search::registerProvider('OC_ReaderSearchProvider');
-
-
-?>
diff --git a/reader/appinfo/database.xml b/reader/appinfo/database.xml
deleted file mode 100755
index 43bd79f22..000000000
--- a/reader/appinfo/database.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<database>
-
- <name>*dbname*</name>
- <create>true</create>
- <overwrite>false</overwrite>
-
- <charset>utf8</charset>
-
- <table>
-
- <name>*dbprefix*eBook_library</name>
-
- <declaration>
-
- <field>
- <name>filepath</name>
- <type>text</type>
- <default></default>
- <notnull>true</notnull>
- <length>200</length>
- </field>
-
- <field>
- <name>tags</name>
- <type>text</type>
- <default></default>
- <notnull>false</notnull>
- <length>100</length>
- </field>
-
- </declaration>
-
- </table>
-
-
-</database>
diff --git a/reader/appinfo/info.xml b/reader/appinfo/info.xml
deleted file mode 100755
index 026254609..000000000
--- a/reader/appinfo/info.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0"?>
-<info>
-
- <id>reader</id>
-
- <name>Reader</name>
-
- <description>An eBook reader app</description>
-
- <version>1.0</version>
-
- <licence>AGPL</licence>
-
- <author>Priyanka</author>
-
- <requiremin>4</requiremin>
-
-</info>
diff --git a/reader/css/reader.css b/reader/css/reader.css
deleted file mode 100755
index ec0bfecac..000000000
--- a/reader/css/reader.css
+++ /dev/null
@@ -1,33 +0,0 @@
-div#controls{z-index:65;}
-div.crumb { float:left; display:block; background:no-repeat right 0; padding:.75em 1.5em 0 1em; height:2.9em;}
-div.crumb:first-child { padding-left:1em; }
-div.crumb.last { font-weight:bold; }
-
-table#readerContent { white-space:normal; position:absolute; top:37px;font-family:Arial;}
-tbody#fileList tr { background:white; height:150px;font-size:12px;}
-tbody tr:hover, tbody tr:active, tbody tr.selected { background-color: white }
-
-.thumbnail:not([data-loaded]) { background-color: white; }
-td#thumbnail_container { border:1px solid #EEE; background-color: #f8f8f8;}
-td#thumbnail_container img {border:1px solid #EEE; -webkit-box-shadow: 4px 4px 4px 0px grey; box-shadow: 4px 4px 4px 0px grey; position:relative; left:25px; top: 3px;}
-
-td.filename.svg { background:no-repeat; height:150px; white-space:normal; color:#888; text-shadow:#fff 0 1px 0; vertical-align:top;}
-td.filename a.name { position:relative;}
-
-a.name span.nametext { position:relative; top: 4px; left:-25px; }
-span.nametext { padding-left:1px; font-family:Arial; font-size:16px; font-weight:normal; white-space:nowrap;}
-a.dirs span.nametext {margin-left:10px;}
-div#thumbs { position:relative;}
-div#thumbs img { border:1px solid #EEE; -webkit-box-shadow: 4px 4px 4px 0px grey; box-shadow: 4px 4px 4px 0px grey; /*position:absolute; left:25px; top: 20px;*/}
-
-#contentbox{ display:none; border:1px solid #DDD; width:150px; height:20px; margin-left:12px; margin-top:5px; -webkit-box-shadow: 2px 2px 2px 0px grey; box-shadow: 2px 2px 2px 0px grey; }
-#displaybox { margin-top:8px; margin-left:12px; font-size:14px; color:grey; width:200px; height:30px; }
-#displaybox a { color:grey; }
-input.start { margin-left:12px;}
-
-div#result { position:absolute; left:2px; top:35px;}
-.each_result { background-color: #EEE; display:inline-block; margin:5px; height:25px; border-radius:5px; }
-.each_result:hover { background-color: #DDD;}
-#each_tag,#close { padding: 5px; font-size:14px;}
-#each_tag { color:grey;}
-form#TagForm { position:absolute; top:100px; left:10px;}
diff --git a/reader/fetch_tags.php b/reader/fetch_tags.php
deleted file mode 100755
index a78bb784e..000000000
--- a/reader/fetch_tags.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-
-OCP\User::checkLoggedIn();
-OCP\App::checkAppEnabled('reader');
-OCP\App::setActiveNavigationEntry( 'reader_index' );
-
-OCP\Util::addscript( 'reader', 'integrate' );
-OCP\Util::addscript( 'reader', 'pdf' );
-OCP\Util::addStyle('reader','reader');
-OCP\Util::addStyle('files','files');
-
-$tag = $_GET['tag'];
-$tmpl = new OCP\Template( 'reader', 'tagged', 'user' );
-$tmpl->assign('tag', $tag);
-$tmpl->printPage();
-
-?>
diff --git a/reader/img/directory.jpg b/reader/img/directory.jpg
deleted file mode 100755
index 93bbc2e30..000000000
--- a/reader/img/directory.jpg
+++ /dev/null
Binary files differ
diff --git a/reader/img/download.jpg b/reader/img/download.jpg
deleted file mode 100755
index 93bbc2e30..000000000
--- a/reader/img/download.jpg
+++ /dev/null
Binary files differ
diff --git a/reader/img/images.jpg b/reader/img/images.jpg
deleted file mode 100755
index 09a196d88..000000000
--- a/reader/img/images.jpg
+++ /dev/null
Binary files differ
diff --git a/reader/img/reader.png b/reader/img/reader.png
deleted file mode 100644
index 73c37f22a..000000000
--- a/reader/img/reader.png
+++ /dev/null
Binary files differ
diff --git a/reader/index.php b/reader/index.php
deleted file mode 100755
index 865338732..000000000
--- a/reader/index.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-
-/**
-* ownCloud - eBook reader application
-*
-* @author Priyanka Menghani
-*
-*/
-
-OCP\User::checkLoggedIn();
-OCP\App::checkAppEnabled('reader');
-OCP\App::setActiveNavigationEntry( 'reader_index' );
-
-OCP\Util::addscript( 'reader', 'integrate' );
-OCP\Util::addscript( 'reader', 'pdf' );
-OCP\Util::addStyle('reader','reader');
-OCP\Util::addStyle('files','files');
-
-// Get the current directory from window url.
-$dir = empty($_GET['dir'])?'/':$_GET['dir'];
-
-$tmpl = new OCP\Template( 'reader', 'index', 'user' );
-$tmpl->assign('dir', $dir);
-$tmpl->printPage();
-
-?>
diff --git a/reader/js/.goutputstream-7F73MW b/reader/js/.goutputstream-7F73MW
deleted file mode 100755
index 65672461e..000000000
--- a/reader/js/.goutputstream-7F73MW
+++ /dev/null
@@ -1,218 +0,0 @@
-$(document).ready(function() {
- $('#fileList tr').each(function(){
- // data-file attribute to contain unescaped filenames.
- $(this).attr('data-file',decodeURIComponent($(this).attr('data-file')));
- });
-
- $('#file_action_panel').attr('activeAction', false);
- /*$('table').ready(function(){
- $('a.name').each(function(){
- */
- /*});
- });*/
-});
-
-
-
-
-
-$(function() {
- // See if url conatins the index 'reader'
- if(location.href.indexOf("reader")!=-1) {
- 'use strict';
- // create thumbnails for pdfs inside current directory.
- create_thumbnails();
-
- // Render pdf view on every click of a thumbnail, now and in future.
- $('td.filename a').live('click',function(event) {
- event.preventDefault();
- var filename=$(this).parent().parent().attr('data-file');
- var tr=$('tr').filterAttr('data-file',filename);
- var mime=$(this).parent().parent().data('mime');
- var type=$(this).parent().parent().data('type');
- // Check if clicked link is a pdf file or a directory, perform suitable function.
- var action=getAction(mime,type);
- if(action){
- action(filename);
- }
- });
- // Generate thumbnails for folders.
- create_folder_thumbnails();
-
- // On close of the pdf viewer, reload the page.
- $('#close').live('click',function(event) {
- location.reload();
- });
- // On hover over pdf thumbnails, their title should show.
- $('a.name').hover(function(){
- if($(this).children().hasClass('title'))
- $(this).children().addClass('visible');
- });
- $('a.name').mouseleave(function(){
- if($(this).children().hasClass('title'))
- $(this).children().removeClass('visible');
- });
-
- /*$('#thumbnail').live('hover',function(event){
- var canvas1 = document.getElementById("thumbnail");
- if (canvas1.getContext) {
- var ctx = canvas1.getContext("2d"); // Get the context for the canvas.
- var myImage = canvas1.toDataURL("image/png"); // Get the data as an image.
- }
- var imageElement = document.getElementById("theimage"); // Get the img object.
- imageElement.src = myImage; // Set the src to data from the canvas.
-
- });*/
- }
-});
-
-/* Function that returns suitable function definition to be executed on
- * click of the file whose mime and type are passed. */
-function getAction(mime,type) {
- var name;
- if(mime == 'application/pdf') {
- name = function (filename){
- showPDFviewer($('#dir').val(),filename);
- }
- }
- else {
- name = function (filename){
- window.location=OC.linkTo('reader', 'index.php') + '&dir='+
- encodeURIComponent($('#dir').val()).replace(/%2F/g, '/')+'/'+
- encodeURIComponent(filename) + '/';
- }
- }
- return name;
-}
-
-function create_thumbnails() {
- PDFJS.disableWorker = true;
- $('td.filename a').each(function() {
- // Get url and title of each pdf file from anchor tags.
- var url = $(this).attr('href');
- var title = $(this).parent().parent().attr('data-file');
- if (url.indexOf('pdf') != -1) {
- PDFJS.getDocument(url).then(function(pdf) {
- // Using promise to fetch the page
- pdf.getPage(1).then(function(page) {
- var scale = 0.2;
- var viewport = page.getViewport(scale);
-
- /*var div = document.createElement('div');
- div.id = 'thumbnailContainer';
- div.className = 'thumbnail';
- var anchor = document.getElementById(url);*/
- // Create canvas elements for each pdf's first page.
- var canvas = document.createElement("canvas");
- canvas.id = 'thumbnail';
-
- // Canvas elements should be of proper size, not too big, not too small.
- if (viewport.height > 170 || viewport.width > 130) {
- scale = 0.1;
- }
- else if (viewport.height < 129 || viewport.width < 86) {
- scale = 0.3;
- }
-
- viewport = page.getViewport(scale);
- canvas.height = viewport.height;
- canvas.width = viewport.width;
-
- /*div.style.height = canvas.height + 'px';
- div.style.width = canvas.width + 'px';
- div.appendChild(canvas);
- anchor.appendChild(div);
-
- var title_div = document.createElement('div');
- title_div.className = 'title';
- title_div.innerHTML = title;
- anchor.appendChild(title_div);*/
-
- var ctx = canvas.getContext('2d');
- ctx.save();
- ctx.fillStyle = 'rgb(255, 255, 255)';
- ctx.fillRect(0, 0, canvas.width, canvas.height);
- ctx.restore();
-
- var view = page.view;
- var scaleX = (canvas.width / page.width);
- var scaleY = (canvas.height / page.height);
- ctx.translate(-view.x * scaleX, -view.y * scaleY);
-
- // Render PDF page into canvas context
- var renderContext = {
- canvasContext: ctx,
- viewport: viewport
- };
- page.render(renderContext);
- alert('yoto');
- });
- });
- }
- });
-}
-
-// Function to create thumbnails for folders.
-function create_folder_thumbnails() {
- $('a.dirs input').each(function() {
- // fetch margin, url and and directory name values for each pdf, stored in input tags.
- var margin = $(this).attr('name');
- var pdf_dir = $(this).attr('value');
- var url = $(this).attr('id');
-
- PDFJS.getDocument(url).then(function(pdf) {
- // Using promise to fetch the page
- pdf.getPage(1).then(function(page) {
- var scale = 0.3;
- var viewport = page.getViewport(scale);
-
- // Prepare canvas using PDF page dimensions
- var anchor = document.getElementById(pdf_dir);
-
- var canvas = document.createElement("canvas");
- canvas.id = "dirsCanvas";
- // Each thumbnail in the 3-thumbnail set should be of same dimensions.
- canvas.height = '168';
- canvas.width = '120';
- // Canvases should be on top of each other
- $(canvas).css('z-index',100 - margin);
- $(canvas).css('margin-left', margin + 'px');
- $(canvas).css('-webkit-backface-visibility', 'visible');
- $(canvas).css('-webkit-transform-origin', '0% 51%');
- $(canvas).css('-webkit-transform',' perspective(' + margin*35 + 'px) rotateY(23deg)');
-
- anchor.appendChild(canvas);
-
- var ctx = canvas.getContext('2d');
- ctx.save();
- ctx.fillStyle = 'rgb(255, 255, 255)';
- ctx.fillRect(0, 0, canvas.width, canvas.height);
- ctx.restore();
-
- var view = page.view;
- var scaleX = (canvas.width / page.width);
- var scaleY = (canvas.height / page.height);
- ctx.translate(-view.x * scaleX, -view.y * scaleY);
-
- // Render PDF page into canvas context
-
- var renderContext = {
- canvasContext: ctx,
- viewport: viewport
- };
- page.render(renderContext);
- });
- });
- });
-}
-
-window.onload = function(){
- var canvas = document.getElementById("thumbnail");
- //alert(canvas);
- if (canvas.getContext) {
- var ctx = canvas.getContext("2d");
- var myImage = canvas.toDataURL("image/png"); // Get the data as an image.
- }
- var imageElement = document.getElementById("theimage"); // Get the img object.
- imageElement.src = myImage;
-}
diff --git a/reader/js/.goutputstream-CZ9VOW b/reader/js/.goutputstream-CZ9VOW
deleted file mode 100755
index eb1c7d2dd..000000000
--- a/reader/js/.goutputstream-CZ9VOW
+++ /dev/null
@@ -1,157 +0,0 @@
-$(document).ready(function() {
- $('#fileList tr').each(function(){
- // data-file attribute to contain unescaped filenames.
- $(this).attr('data-file',decodeURIComponent($(this).attr('data-file')));
- });
-
- $('#file_action_panel').attr('activeAction', false);
-
- $('.start').click(function(){
- var contentbox = $(this).parent().children('div#contentbox');
- var path = $(this).parent().children('a.name').attr('dir');
- alert(path);
- contentbox.show(100);
- contentbox.keypress(function(e) {
- if(e.which == 13) {
- var tag = contentbox.text();
- contentbox.text('');
- contentbox.hide();
- var displaybox = $(this).parent().children('div#displaybox');
- displaybox.append('<a href = "apps/reader/fetch_tags.php?tag='+tag+'">'+tag+'</a>');
- displaybox.append(' ');
- $.post('apps/reader/ajax/tags.php', {tag:tag, path:path});
- }
- });
- });
-});
-
-$(function() {
- // See if url conatins the index 'reader'
- if(location.href.indexOf("reader")!=-1) {
- 'use strict';
- // create thumbnails for pdfs inside current directory.
- create_thumbnails();
- create_thumbnails_for_directories();
- // Render pdf view on every click of a thumbnail, now and in future.
- $('td.filename a.name').live('click',function(event) {
- event.preventDefault();
- var filename=$(this).parent().parent().attr('data-file');
- var tr=$('tr').filterAttr('data-file',filename);
- var mime=$(this).parent().parent().data('mime');
- var type=$(this).parent().parent().data('type');
- // Check if clicked link is a pdf file or a directory, perform suitable function.
- var action=getAction(mime,type);
- if(action){
- action(filename);
- }
- });
- }
-});
-
-/* Function that returns suitable function definition to be executed on
- * click of the file whose mime and type are passed. */
-function getAction(mime,type) {
- var name;
- if(mime == 'application/pdf') {
- name = function (filename){
- showPDFviewer($('#dir').val(),filename);
- }
- }
- else {
- name = function (filename){
- window.location=OC.linkTo('reader', 'index.php') + '&dir='+
- encodeURIComponent($('#dir').val()).replace(/%2F/g, '/')+'/'+
- encodeURIComponent(filename) + '/';
- }
- }
- return name;
-}
-
-function create_thumbnails() {
- PDFJS.disableWorker = true;
- $('td#thumbnail_container img').each(function() {
- // Get url and title of each pdf file from image tags.
- var title = $(this).parent().parent().attr('data-file');
- var location = $(this).attr('id');
- var url = OC.linkTo('files', 'download.php')+'?file=' + location;
- var thumbnail_exists = $(this).attr('value');
- if (thumbnail_exists == "false") {
- if (url.indexOf('pdf') != -1) {
- render_thumbnail(url,location,title);
- }
- }
- });
-}
-
-function create_thumbnails_for_directories() {
- $('div#thumbs img').each(function(){
- var thumb_exists = $(this).attr('value');
- if (thumb_exists == "false") {
- var location = $(this).attr('id');
- var url = OC.linkTo('files', 'download.php')+'?file=' + location;
- var title = location.replace(/\\/g,'/').replace( /.*\//, '' );
- if (url.indexOf('pdf') != -1) {
- render_thumbnail(url,location,title);
- }
- }
- });
-}
-
-function canvasSaver(canvas,title,location) {
- var canvas_data = canvas.toDataURL('image/png');
- $.post("apps/reader/ajax/canvas_saver.php", {canv_data:canvas_data,title:title,location:location});
-}
-
-
-function render_thumbnail(url,location,title) {
-
- PDFJS.getDocument(url).then(function(pdf) {
- // Using promise to fetch the page
- pdf.getPage(1).then(function(page) {
- var scale = 0.2;
- var viewport = page.getViewport(scale);
-
- // Create canvas elements for each pdf's first page.
- var canvas = document.createElement("canvas");
-
- // Canvas elements should be of proper size, not too big, not too small.
- if (viewport.height > 170 || viewport.width > 130) {
- scale = 0.1;
- }
- else if (viewport.height < 129 || viewport.width < 86) {
- scale = 0.3;
- }
-
- viewport = page.getViewport(scale);
- canvas.height = viewport.height;
- canvas.width = viewport.width;
-
- var ctx = canvas.getContext('2d');
- ctx.save();
- ctx.fillStyle = 'rgb(255, 255, 255)';
- ctx.fillRect(0, 0, canvas.width, canvas.height);
- ctx.restore();
-
- var view = page.view;
- var scaleX = (canvas.width / page.width);
- var scaleY = (canvas.height / page.height);
- ctx.translate(-view.x * scaleX, -view.y * scaleY);
-
- // Render PDF page into canvas context
- var renderContext = {
- canvasContext: ctx,
- viewport: viewport
- };
-
- pageRendering = page.render(renderContext);
- pageRendering.onData(function(){
- canvasSaver(canvas,title,location);
- var imageElement = document.getElementById(location);
- imageElement.src = canvas.toDataURL();
- imageElement.style.height = '100px';
- imageElement.style.width = '100px';
-
- });
- });
- });
-}
diff --git a/reader/js/.goutputstream-GYESPW b/reader/js/.goutputstream-GYESPW
deleted file mode 100755
index 11b2e0248..000000000
--- a/reader/js/.goutputstream-GYESPW
+++ /dev/null
@@ -1,161 +0,0 @@
-$(document).ready(function() {
- $('#fileList tr').each(function(){
- // data-file attribute to contain unescaped filenames.
- $(this).attr('data-file',decodeURIComponent($(this).attr('data-file')));
- });
-
- $('#file_action_panel').attr('activeAction', false);
-
- $("#TagForm").submit(function(event) {
- event.preventDefault();
- var $form = $( this ),
- tag = $form.find( 'input[name="tag"]' ).val(),
- url = 'apps/reader/ajax/tags.php';
- var path = $(this).parent().children('a.name').attr('dir');
- $.post( url, {tag:tag,path:path},
- function( data ) {
- $("#result").append('<a href = "apps/reader/fetch_tags.php?tag='+data+'">'+data+'</a>');
- }
- );
- });
-
- $('#close').click(function(){
- event.preventDefault();
- var parent = $(this).parent();
- var filepath = $(this).parent().parent().parent().children('a.name').attr('dir');
- var url = 'apps/reader/ajax/remove_tags.php';
- var tag = $(this).attr('value');
- $.post(url, {tag:tag, filepath:filepath}, function(data) {alert(data)});
- });
-});
-
-$(function() {
- // See if url conatins the index 'reader'
- if(location.href.indexOf("reader")!=-1) {
- 'use strict';
- // create thumbnails for pdfs inside current directory.
- create_thumbnails();
- create_thumbnails_for_directories();
- // Render pdf view on every click of a thumbnail, now and in future.
- $('td.filename a.name').live('click',function(event) {
- event.preventDefault();
- var filename=$(this).parent().parent().attr('data-file');
- var tr=$('tr').filterAttr('data-file',filename);
- var mime=$(this).parent().parent().data('mime');
- var type=$(this).parent().parent().data('type');
- // Check if clicked link is a pdf file or a directory, perform suitable function.
- var action=getAction(mime,type);
- if(action){
- action(filename);
- }
- });
- }
-});
-
-/* Function that returns suitable function definition to be executed on
- * click of the file whose mime and type are passed. */
-function getAction(mime,type) {
- var name;
- if(mime == 'application/pdf') {
- name = function (filename){
- showPDFviewer($('#dir').val(),filename);
- }
- }
- else {
- name = function (filename){
- window.location=OC.linkTo('reader', 'index.php') + '&dir='+
- encodeURIComponent($('#dir').val()).replace(/%2F/g, '/')+'/'+
- encodeURIComponent(filename) + '/';
- }
- }
- return name;
-}
-
-function create_thumbnails() {
- PDFJS.disableWorker = true;
- $('td#thumbnail_container > img').each(function() {
- // Get url and title of each pdf file from image tags.
- var title = $(this).parent().parent().attr('data-file');
- var location = $(this).attr('id');
- var url = OC.linkTo('files', 'download.php')+'?file=' + location;
- var thumbnail_exists = $(this).attr('value');
- if (thumbnail_exists == "false") {
- if (url.indexOf('pdf') != -1) {
- render_thumbnail(url,location,title);
- }
- }
- });
-}
-
-function create_thumbnails_for_directories() {
- $('div#thumbs img').each(function(){
- var thumb_exists = $(this).attr('value');
- if (thumb_exists == "false") {
- var location = $(this).attr('id');
- var url = OC.linkTo('files', 'download.php')+'?file=' + location;
- var title = location.replace(/\\/g,'/').replace( /.*\//, '' );
- if (url.indexOf('pdf') != -1) {
- render_thumbnail(url,location,title);
- }
- }
- });
-}
-
-function canvasSaver(canvas,title,location) {
- var canvas_data = canvas.toDataURL('image/png');
- $.post("apps/reader/ajax/canvas_saver.php", {canv_data:canvas_data,title:title,location:location});
-}
-
-
-function render_thumbnail(url,location,title) {
-
- PDFJS.getDocument(url).then(function(pdf) {
- // Using promise to fetch the page
- pdf.getPage(1).then(function(page) {
- var scale = 0.2;
- var viewport = page.getViewport(scale);
-
- // Create canvas elements for each pdf's first page.
- var canvas = document.createElement("canvas");
-
- // Canvas elements should be of proper size, not too big, not too small.
- if (viewport.height > 170 || viewport.width > 130) {
- scale = 0.1;
- }
- else if (viewport.height < 129 || viewport.width < 86) {
- scale = 0.3;
- }
-
- viewport = page.getViewport(scale);
- canvas.height = viewport.height;
- canvas.width = viewport.width;
-
- var ctx = canvas.getContext('2d');
- ctx.save();
- ctx.fillStyle = 'rgb(255, 255, 255)';
- ctx.fillRect(0, 0, canvas.width, canvas.height);
- ctx.restore();
-
- var view = page.view;
- var scaleX = (canvas.width / page.width);
- var scaleY = (canvas.height / page.height);
- ctx.translate(-view.x * scaleX, -view.y * scaleY);
-
- // Render PDF page into canvas context
- var renderContext = {
- canvasContext: ctx,
- viewport: viewport
- };
-
- pageRendering = page.render(renderContext);
- pageRendering.onData(function(){
- canvasSaver(canvas,title,location);
- var imageElement = document.getElementById(location);
- imageElement.src = canvas.toDataURL();
- imageElement.style.height = '100px';
- imageElement.style.width = '100px';
-
- });
- });
- });
-}
diff --git a/reader/js/.goutputstream-H39LNW b/reader/js/.goutputstream-H39LNW
deleted file mode 100755
index 0d028f84d..000000000
--- a/reader/js/.goutputstream-H39LNW
+++ /dev/null
@@ -1,189 +0,0 @@
-$(document).ready(function() {
- $('#fileList tr').each(function(){
- // data-file attribute to contain unescaped filenames.
- $(this).attr('data-file',decodeURIComponent($(this).attr('data-file')));
- });
-
- $('#file_action_panel').attr('activeAction', false);
-});
-
-$(function() {
- // See if url conatins the index 'reader'
- if(location.href.indexOf("reader")!=-1) {
- 'use strict';
- // create thumbnails for pdfs inside current directory.
- create_thumbnails();
-
- // Render pdf view on every click of a thumbnail, now and in future.
- $('td.filename a').live('click',function(event) {
- event.preventDefault();
- var filename=$(this).parent().parent().attr('data-file');
- var tr=$('tr').filterAttr('data-file',filename);
- var mime=$(this).parent().parent().data('mime');
- var type=$(this).parent().parent().data('type');
- // Check if clicked link is a pdf file or a directory, perform suitable function.
- var action=getAction(mime,type);
- if(action){
- action(filename);
- }
- });
- // Generate thumbnails for folders.
- create_folder_thumbnails();
-
- // On hover over pdf thumbnails, their title should show.
- $('a.name').hover(function(){
- if($(this).children().hasClass('title'))
- $(this).children().addClass('visible');
- });
- $('a.name').mouseleave(function(){
- if($(this).children().hasClass('title'))
- $(this).children().removeClass('visible');
- });
- }
-});
-
-/* Function that returns suitable function definition to be executed on
- * click of the file whose mime and type are passed. */
-function getAction(mime,type) {
- var name;
- if(mime == 'application/pdf') {
- name = function (filename){
- showPDFviewer($('#dir').val(),filename);
- }
- }
- else {
- name = function (filename){
- window.location=OC.linkTo('reader', 'index.php') + '&dir='+
- encodeURIComponent($('#dir').val()).replace(/%2F/g, '/')+'/'+
- encodeURIComponent(filename) + '/';
- }
- }
- return name;
-}
-
-function create_thumbnails() {
- PDFJS.disableWorker = true;
- $('td.filename a').each(function() {
- // Get url and title of each pdf file from anchor tags.
- var url = $(this).attr('href');
- var title = $(this).parent().parent().attr('data-file');
- var location = $(this).attr('title');
- check_thumbnail_exists(location,title);
-
-
-
- if (url.indexOf('pdf') != -1) {
- PDFJS.getDocument(url).then(function(pdf) {
- // Using promise to fetch the page
- pdf.getPage(1).then(function(page) {
- var scale = 0.2;
- var viewport = page.getViewport(scale);
-
- // Create canvas elements for each pdf's first page.
- var canvas = document.createElement("canvas");
-
- // Canvas elements should be of proper size, not too big, not too small.
- if (viewport.height > 170 || viewport.width > 130) {
- scale = 0.1;
- }
- else if (viewport.height < 129 || viewport.width < 86) {
- scale = 0.3;
- }
-
- viewport = page.getViewport(scale);
- canvas.height = viewport.height;
- canvas.width = viewport.width;
-
- var ctx = canvas.getContext('2d');
- ctx.save();
- ctx.fillStyle = 'rgb(255, 255, 255)';
- ctx.fillRect(0, 0, canvas.width, canvas.height);
- ctx.restore();
-
- var view = page.view;
- var scaleX = (canvas.width / page.width);
- var scaleY = (canvas.height / page.height);
- ctx.translate(-view.x * scaleX, -view.y * scaleY);
-
- // Render PDF page into canvas context
- var renderContext = {
- canvasContext: ctx,
- viewport: viewport
- };
-
- pageRendering = page.render(renderContext);
- pageRendering.onData(function(){
- var imageElement = document.getElementById(url);
- imageElement.src = canvas.toDataURL();
- canvasSaver(canvas,title,location);
- });
- });
- });
- }
- });
-}
-
-// Function to create thumbnails for folders.
-function create_folder_thumbnails() {
- $('a.dirs input').each(function() {
- // fetch margin, url and and directory name values for each pdf, stored in input tags.
- var margin = $(this).attr('name');
- var pdf_dir = $(this).attr('value');
- var url = $(this).attr('id');
-
- PDFJS.getDocument(url).then(function(pdf) {
- // Using promise to fetch the page
- pdf.getPage(1).then(function(page) {
- var scale = 0.3;
- var viewport = page.getViewport(scale);
-
- // Prepare canvas using PDF page dimensions
- var anchor = document.getElementById(pdf_dir);
-
- var canvas = document.createElement("canvas");
- canvas.id = "dirsCanvas";
- // Each thumbnail in the 3-thumbnail set should be of same dimensions.
- canvas.height = '168';
- canvas.width = '120';
- // Canvases should be on top of each other
- $(canvas).css('z-index',100 - margin);
- $(canvas).css('margin-left', margin + 'px');
- $(canvas).css('-webkit-backface-visibility', 'visible');
- $(canvas).css('-webkit-transform-origin', '0% 51%');
- $(canvas).css('-webkit-transform',' perspective(' + margin*35 + 'px) rotateY(23deg)');
-
- anchor.appendChild(canvas);
-
- var ctx = canvas.getContext('2d');
- ctx.save();
- ctx.fillStyle = 'rgb(255, 255, 255)';
- ctx.fillRect(0, 0, canvas.width, canvas.height);
- ctx.restore();
-
- var view = page.view;
- var scaleX = (canvas.width / page.width);
- var scaleY = (canvas.height / page.height);
- ctx.translate(-view.x * scaleX, -view.y * scaleY);
-
- // Render PDF page into canvas context
-
- var renderContext = {
- canvasContext: ctx,
- viewport: viewport
- };
- page.render(renderContext);
- });
- });
- });
-}
-
-function canvasSaver(canvas,title,location) {
- var canvas_data = canvas.toDataURL('image/png');
- $.post("apps/reader/ajax/canvas_saver.php", {canv_data:canvas_data,title:title,location:location});
-}
-
-function check_thumbnail_exists(location,title) {
- var r;
- $.post("apps/reader/ajax/check_thumbnail.php", {title:title,location:location} ,function(data) {$("input#thumbnail_checker").html(result)});
-}
-
diff --git a/reader/js/.goutputstream-PFE3KW b/reader/js/.goutputstream-PFE3KW
deleted file mode 100755
index e69de29bb..000000000
--- a/reader/js/.goutputstream-PFE3KW
+++ /dev/null
diff --git a/reader/js/integrate.js b/reader/js/integrate.js
deleted file mode 100755
index 141fe7b43..000000000
--- a/reader/js/integrate.js
+++ /dev/null
@@ -1,166 +0,0 @@
-$(document).ready(function() {
- $('#fileList tr').each(function(){
- // data-file attribute to contain unescaped filenames.
- $(this).attr('data-file',decodeURIComponent($(this).attr('data-file')));
- });
-
- $('#file_action_panel').attr('activeAction', false);
-
-});
-
-
-$(function() {
- // See if url conatins the index 'reader'
- if(location.href.indexOf("reader")!=-1) {
- 'use strict';
- // create thumbnails for pdfs inside current directory.
- create_thumbnails();
- create_thumbnails_for_directories();
- // Render pdf view on every click of a thumbnail, now and in future.
- $('td.filename a.name').live('click',function(event) {
- event.preventDefault();
- var filename=$(this).parent().parent().attr('data-file');
- var tr=$('tr').filterAttr('data-file',filename);
- var mime=$(this).parent().parent().data('mime');
- var type=$(this).parent().parent().data('type');
- // Check if clicked link is a pdf file or a directory, perform suitable function.
- var action=getAction(mime,type);
- if(action){
- action(filename);
- }
- });
- }
-
- $('form#TagForm').submit(function(event) {
- event.preventDefault();
- var path = $(this).parent().children('a.name').attr('dir');
- var result = $(this).parent().children('div#result');
- var $form = $(this),
- tag = $form.find( 'input[name="tag"]' ).val(),
- url = $form.attr('action');
- $.post( url, {tag:tag,path:path},
- function(data) {
- result.append('<div class = "each_result"><a id = "each_tag" "href = "apps/reader/fetch_tags.php?tag='+data+'">'+data+'</a><a id = "close" value = "'+data+'">x</a></div></div>');
- }
- );
- });
-
- $('a#close').click(function(){
- event.preventDefault();
- var elem = $(this).parent();
- var filepath = $(this).parent().parent().parent().children('a.name').attr('dir');
- var url = 'apps/reader/ajax/remove_tags.php';
- var tag = $(this).attr('value');
- elem.hide();
- $.post(url, {tag:tag, filepath:filepath});
- });
-
-});
-
-/* Function that returns suitable function definition to be executed on
- * click of the file whose mime and type are passed. */
-function getAction(mime,type) {
- var name;
- if(mime == 'application/pdf') {
- name = function (filename){
- showPDFviewer($('#dir').val(),filename);
- }
- }
- else {
- name = function (filename){
- window.location=OC.linkTo('reader', 'index.php') + '&dir='+
- encodeURIComponent($('#dir').val()).replace(/%2F/g, '/')+'/'+
- encodeURIComponent(filename) + '/';
- }
- }
- return name;
-}
-
-function create_thumbnails() {
- PDFJS.disableWorker = true;
- $('td#thumbnail_container > img').each(function() {
- // Get url and title of each pdf file from image tags.
- var title = $(this).parent().parent().attr('data-file');
- var location = $(this).attr('id');
- var url = OC.linkTo('files', 'download.php')+'?file=' + location;
- var thumbnail_exists = $(this).attr('value');
- if (thumbnail_exists == "false") {
- if (url.indexOf('pdf') != -1) {
- render_thumbnail(url,location,title);
- }
- }
- });
-}
-
-function create_thumbnails_for_directories() {
- $('div#thumbs img').each(function(){
- var thumb_exists = $(this).attr('value');
- if (thumb_exists == "false") {
- var location = $(this).attr('id');
- var url = OC.linkTo('files', 'download.php')+'?file=' + location;
- var title = location.replace(/\\/g,'/').replace( /.*\//, '' );
- if (url.indexOf('pdf') != -1) {
- render_thumbnail(url,location,title);
- }
- }
- });
-}
-
-function canvasSaver(canvas,title,location) {
- var canvas_data = canvas.toDataURL('image/png');
- $.post("apps/reader/ajax/canvas_saver.php", {canv_data:canvas_data,title:title,location:location});
-}
-
-
-function render_thumbnail(url,location,title) {
-
- PDFJS.getDocument(url).then(function(pdf) {
- // Using promise to fetch the page
- pdf.getPage(1).then(function(page) {
- var scale = 0.2;
- var viewport = page.getViewport(scale);
-
- // Create canvas elements for each pdf's first page.
- var canvas = document.createElement("canvas");
-
- // Canvas elements should be of proper size, not too big, not too small.
- if (viewport.height > 170 || viewport.width > 130) {
- scale = 0.1;
- }
- else if (viewport.height < 129 || viewport.width < 86) {
- scale = 0.3;
- }
-
- viewport = page.getViewport(scale);
- canvas.height = viewport.height;
- canvas.width = viewport.width;
-
- var ctx = canvas.getContext('2d');
- ctx.save();
- ctx.fillStyle = 'rgb(255, 255, 255)';
- ctx.fillRect(0, 0, canvas.width, canvas.height);
- ctx.restore();
-
- var view = page.view;
- var scaleX = (canvas.width / page.width);
- var scaleY = (canvas.height / page.height);
- ctx.translate(-view.x * scaleX, -view.y * scaleY);
-
- // Render PDF page into canvas context
- var renderContext = {
- canvasContext: ctx,
- viewport: viewport
- };
-
- pageRendering = page.render(renderContext);
- pageRendering.onData(function(){
- canvasSaver(canvas,title,location);
- var imageElement = document.getElementById(location);
- imageElement.src = canvas.toDataURL();
- imageElement.style.height = '100px';
- imageElement.style.width = '100px';
-
- });
- });
- });
-}
diff --git a/reader/js/pdf.js b/reader/js/pdf.js
deleted file mode 100755
index eff5889ae..000000000
--- a/reader/js/pdf.js
+++ /dev/null
@@ -1,36074 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-/* Copyright 2012 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var PDFJS = {};
-
-(function pdfjsWrapper() {
- // Use strict in our context only - users might not want it
- 'use strict';
-
- PDFJS.build =
-'5542312';
-
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-/* Copyright 2012 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-'use strict';
-
-var globalScope = (typeof window === 'undefined') ? this : window;
-
-var isWorker = (typeof window == 'undefined');
-
-var ERRORS = 0, WARNINGS = 1, INFOS = 5;
-var verbosity = WARNINGS;
-
-// The global PDFJS object exposes the API
-// In production, it will be declared outside a global wrapper
-// In development, it will be declared here
-if (!globalScope.PDFJS) {
- globalScope.PDFJS = {};
-}
-
-// getPdf()
-// Convenience function to perform binary Ajax GET
-// Usage: getPdf('http://...', callback)
-// getPdf({
-// url:String ,
-// [,progress:Function, error:Function]
-// },
-// callback)
-function getPdf(arg, callback) {
- var params = arg;
- if (typeof arg === 'string')
- params = { url: arg };
- var xhr = new XMLHttpRequest();
- xhr.open('GET', params.url);
-
- var headers = params.headers;
- if (headers) {
- for (var property in headers) {
- if (typeof headers[property] === 'undefined')
- continue;
-
- xhr.setRequestHeader(property, params.headers[property]);
- }
- }
-
- xhr.mozResponseType = xhr.responseType = 'arraybuffer';
-
- var protocol = params.url.substring(0, params.url.indexOf(':') + 1);
- xhr.expected = (protocol === 'http:' || protocol === 'https:') ? 200 : 0;
-
- if ('progress' in params)
- xhr.onprogress = params.progress || undefined;
-
- var calledErrorBack = false;
-
- if ('error' in params) {
- xhr.onerror = function errorBack() {
- if (!calledErrorBack) {
- calledErrorBack = true;
- params.error();
- }
- }
- }
-
- xhr.onreadystatechange = function getPdfOnreadystatechange(e) {
- if (xhr.readyState === 4) {
- if (xhr.status === xhr.expected) {
- var data = (xhr.mozResponseArrayBuffer || xhr.mozResponse ||
- xhr.responseArrayBuffer || xhr.response);
- callback(data);
- } else if (params.error && !calledErrorBack) {
- calledErrorBack = true;
- params.error(e);
- }
- }
- };
- xhr.send(null);
-}
-globalScope.PDFJS.getPdf = getPdf;
-globalScope.PDFJS.pdfBug = false;
-
-var Page = (function PageClosure() {
- function Page(xref, pageNumber, pageDict, ref) {
- this.pageNumber = pageNumber;
- this.pageDict = pageDict;
- this.xref = xref;
- this.ref = ref;
-
- this.displayReadyPromise = null;
- }
-
- Page.prototype = {
- getPageProp: function Page_getPageProp(key) {
- return this.pageDict.get(key);
- },
- inheritPageProp: function Page_inheritPageProp(key) {
- var dict = this.pageDict;
- var obj = dict.get(key);
- while (obj === undefined) {
- dict = dict.get('Parent');
- if (!dict)
- break;
- obj = dict.get(key);
- }
- return obj;
- },
- get content() {
- return shadow(this, 'content', this.getPageProp('Contents'));
- },
- get resources() {
- return shadow(this, 'resources', this.inheritPageProp('Resources'));
- },
- get mediaBox() {
- var obj = this.inheritPageProp('MediaBox');
- // Reset invalid media box to letter size.
- if (!isArray(obj) || obj.length !== 4)
- obj = [0, 0, 612, 792];
- return shadow(this, 'mediaBox', obj);
- },
- get view() {
- var mediaBox = this.mediaBox;
- var cropBox = this.inheritPageProp('CropBox');
- if (!isArray(cropBox) || cropBox.length !== 4)
- return shadow(this, 'view', mediaBox);
-
- // From the spec, 6th ed., p.963:
- // "The crop, bleed, trim, and art boxes should not ordinarily
- // extend beyond the boundaries of the media box. If they do, they are
- // effectively reduced to their intersection with the media box."
- cropBox = Util.intersect(cropBox, mediaBox);
- if (!cropBox)
- return shadow(this, 'view', mediaBox);
-
- return shadow(this, 'view', cropBox);
- },
- get annotations() {
- return shadow(this, 'annotations', this.inheritPageProp('Annots'));
- },
- get rotate() {
- var rotate = this.inheritPageProp('Rotate') || 0;
- // Normalize rotation so it's a multiple of 90 and between 0 and 270
- if (rotate % 90 != 0) {
- rotate = 0;
- } else if (rotate >= 360) {
- rotate = rotate % 360;
- } else if (rotate < 0) {
- // The spec doesn't cover negatives, assume its counterclockwise
- // rotation. The following is the other implementation of modulo.
- rotate = ((rotate % 360) + 360) % 360;
- }
- return shadow(this, 'rotate', rotate);
- },
-
- getOperatorList: function Page_getOperatorList(handler, dependency) {
- var xref = this.xref;
- var content = this.content;
- var resources = this.resources;
- if (isArray(content)) {
- // fetching items
- var streams = [];
- var i, n = content.length;
- var streams = [];
- for (i = 0; i < n; ++i)
- streams.push(xref.fetchIfRef(content[i]));
- content = new StreamsSequenceStream(streams);
- } else if (isStream(content)) {
- content.reset();
- } else if (!content) {
- // replacing non-existent page content with empty one
- content = new Stream(new Uint8Array(0));
- }
-
- var pe = this.pe = new PartialEvaluator(
- xref, handler, 'p' + this.pageNumber + '_');
-
- return pe.getOperatorList(content, resources, dependency);
- },
- extractTextContent: function Page_extractTextContent() {
- var handler = {
- on: function nullHandlerOn() {},
- send: function nullHandlerSend() {}
- };
-
- var xref = this.xref;
- var content = xref.fetchIfRef(this.content);
- var resources = xref.fetchIfRef(this.resources);
- if (isArray(content)) {
- // fetching items
- var i, n = content.length;
- var streams = [];
- for (i = 0; i < n; ++i)
- streams.push(xref.fetchIfRef(content[i]));
- content = new StreamsSequenceStream(streams);
- } else if (isStream(content)) {
- content.reset();
- }
-
- var pe = new PartialEvaluator(
- xref, handler, 'p' + this.pageNumber + '_');
- return pe.getTextContent(content, resources);
- },
-
- ensureFonts: function Page_ensureFonts(fonts, callback) {
- this.stats.time('Font Loading');
- // Convert the font names to the corresponding font obj.
- for (var i = 0, ii = fonts.length; i < ii; i++) {
- fonts[i] = this.objs.objs[fonts[i]].data;
- }
-
- // Load all the fonts
- FontLoader.bind(
- fonts,
- function pageEnsureFontsFontObjs(fontObjs) {
- this.stats.timeEnd('Font Loading');
-
- callback.call(this);
- }.bind(this)
- );
- },
- getLinks: function Page_getLinks() {
- var links = [];
- var annotations = this.getAnnotations();
- var i, n = annotations.length;
- for (i = 0; i < n; ++i) {
- if (annotations[i].type != 'Link')
- continue;
- links.push(annotations[i]);
- }
- return links;
- },
- getAnnotations: function Page_getAnnotations() {
- var xref = this.xref;
- function getInheritableProperty(annotation, name) {
- var item = annotation;
- while (item && !item.has(name)) {
- item = item.get('Parent');
- }
- if (!item)
- return null;
- return item.get(name);
- }
- function isValidUrl(url) {
- if (!url)
- return false;
- var colon = url.indexOf(':');
- if (colon < 0)
- return false;
- var protocol = url.substr(0, colon);
- switch (protocol) {
- case 'http':
- case 'https':
- case 'ftp':
- case 'mailto':
- return true;
- default:
- return false;
- }
- }
-
- var annotations = this.annotations || [];
- var i, n = annotations.length;
- var items = [];
- for (i = 0; i < n; ++i) {
- var annotationRef = annotations[i];
- var annotation = xref.fetch(annotationRef);
- if (!isDict(annotation))
- continue;
- var subtype = annotation.get('Subtype');
- if (!isName(subtype))
- continue;
- var rect = annotation.get('Rect');
-
- var item = {};
- item.type = subtype.name;
- item.rect = rect;
- switch (subtype.name) {
- case 'Link':
- var a = annotation.get('A');
- if (a) {
- switch (a.get('S').name) {
- case 'URI':
- var url = a.get('URI');
- // TODO: pdf spec mentions urls can be relative to a Base
- // entry in the dictionary.
- if (!isValidUrl(url))
- url = '';
- item.url = url;
- break;
- case 'GoTo':
- item.dest = a.get('D');
- break;
- default:
- TODO('other link types');
- }
- } else if (annotation.has('Dest')) {
- // simple destination link
- var dest = annotation.get('Dest');
- item.dest = isName(dest) ? dest.name : dest;
- }
- break;
- case 'Widget':
- var fieldType = getInheritableProperty(annotation, 'FT');
- if (!isName(fieldType))
- break;
- item.fieldType = fieldType.name;
- // Building the full field name by collecting the field and
- // its ancestors 'T' properties and joining them using '.'.
- var fieldName = [];
- var namedItem = annotation, ref = annotationRef;
- while (namedItem) {
- var parent = namedItem.get('Parent');
- var parentRef = namedItem.getRaw('Parent');
- var name = namedItem.get('T');
- if (name) {
- fieldName.unshift(stringToPDFString(name));
- } else {
- // The field name is absent, that means more than one field
- // with the same name may exist. Replacing the empty name
- // with the '`' plus index in the parent's 'Kids' array.
- // This is not in the PDF spec but necessary to id the
- // the input controls.
- var kids = parent.get('Kids');
- var j, jj;
- for (j = 0, jj = kids.length; j < jj; j++) {
- var kidRef = kids[j];
- if (kidRef.num == ref.num && kidRef.gen == ref.gen)
- break;
- }
- fieldName.unshift('`' + j);
- }
- namedItem = parent;
- ref = parentRef;
- }
- item.fullName = fieldName.join('.');
- var alternativeText = stringToPDFString(annotation.get('TU') || '');
- item.alternativeText = alternativeText;
- var da = getInheritableProperty(annotation, 'DA') || '';
- var m = /([\d\.]+)\sTf/.exec(da);
- if (m)
- item.fontSize = parseFloat(m[1]);
- item.textAlignment = getInheritableProperty(annotation, 'Q');
- item.flags = getInheritableProperty(annotation, 'Ff') || 0;
- break;
- case 'Text':
- var content = annotation.get('Contents');
- var title = annotation.get('T');
- item.content = stringToPDFString(content || '');
- item.title = stringToPDFString(title || '');
- item.name = !annotation.has('Name') ? 'Note' :
- annotation.get('Name').name;
- break;
- default:
- TODO('unimplemented annotation type: ' + subtype.name);
- break;
- }
- items.push(item);
- }
- return items;
- }
- };
-
- return Page;
-})();
-
-/**
- * The `PDFDocument` holds all the data of the PDF file. Compared to the
- * `PDFDoc`, this one doesn't have any job management code.
- * Right now there exists one PDFDocument on the main thread + one object
- * for each worker. If there is no worker support enabled, there are two
- * `PDFDocument` objects on the main thread created.
- */
-var PDFDocument = (function PDFDocumentClosure() {
- function PDFDocument(arg, password) {
- if (isStream(arg))
- init.call(this, arg, password);
- else if (isArrayBuffer(arg))
- init.call(this, new Stream(arg), password);
- else
- error('PDFDocument: Unknown argument type');
- }
-
- function init(stream, password) {
- assertWellFormed(stream.length > 0, 'stream must have data');
- this.stream = stream;
- this.setup(password);
- this.acroForm = this.catalog.catDict.get('AcroForm');
- }
-
- function find(stream, needle, limit, backwards) {
- var pos = stream.pos;
- var end = stream.end;
- var str = '';
- if (pos + limit > end)
- limit = end - pos;
- for (var n = 0; n < limit; ++n)
- str += stream.getChar();
- stream.pos = pos;
- var index = backwards ? str.lastIndexOf(needle) : str.indexOf(needle);
- if (index == -1)
- return false; /* not found */
- stream.pos += index;
- return true; /* found */
- }
-
- var DocumentInfoValidators = {
- get entries() {
- // Lazily build this since all the validation functions below are not
- // defined until after this file loads.
- return shadow(this, 'entries', {
- Title: isString,
- Author: isString,
- Subject: isString,
- Keywords: isString,
- Creator: isString,
- Producer: isString,
- CreationDate: isString,
- ModDate: isString,
- Trapped: isName
- });
- }
- };
-
- PDFDocument.prototype = {
- get linearization() {
- var length = this.stream.length;
- var linearization = false;
- if (length) {
- try {
- linearization = new Linearization(this.stream);
- if (linearization.length != length)
- linearization = false;
- } catch (err) {
- warn('The linearization data is not available ' +
- 'or unreadable pdf data is found');
- }
- }
- // shadow the prototype getter with a data property
- return shadow(this, 'linearization', linearization);
- },
- get startXRef() {
- var stream = this.stream;
- var startXRef = 0;
- var linearization = this.linearization;
- if (linearization) {
- // Find end of first obj.
- stream.reset();
- if (find(stream, 'endobj', 1024))
- startXRef = stream.pos + 6;
- } else {
- // Find startxref by jumping backward from the end of the file.
- var step = 1024;
- var found = false, pos = stream.end;
- while (!found && pos > 0) {
- pos -= step - 'startxref'.length;
- if (pos < 0)
- pos = 0;
- stream.pos = pos;
- found = find(stream, 'startxref', step, true);
- }
- if (found) {
- stream.skip(9);
- var ch;
- do {
- ch = stream.getChar();
- } while (Lexer.isSpace(ch));
- var str = '';
- while ((ch - '0') <= 9) {
- str += ch;
- ch = stream.getChar();
- }
- startXRef = parseInt(str, 10);
- if (isNaN(startXRef))
- startXRef = 0;
- }
- }
- // shadow the prototype getter with a data property
- return shadow(this, 'startXRef', startXRef);
- },
- get mainXRefEntriesOffset() {
- var mainXRefEntriesOffset = 0;
- var linearization = this.linearization;
- if (linearization)
- mainXRefEntriesOffset = linearization.mainXRefEntriesOffset;
- // shadow the prototype getter with a data property
- return shadow(this, 'mainXRefEntriesOffset', mainXRefEntriesOffset);
- },
- // Find the header, remove leading garbage and setup the stream
- // starting from the header.
- checkHeader: function PDFDocument_checkHeader() {
- var stream = this.stream;
- stream.reset();
- if (find(stream, '%PDF-', 1024)) {
- // Found the header, trim off any garbage before it.
- stream.moveStart();
- return;
- }
- // May not be a PDF file, continue anyway.
- },
- setup: function PDFDocument_setup(password) {
- this.checkHeader();
- var xref = new XRef(this.stream,
- this.startXRef,
- this.mainXRefEntriesOffset,
- password);
- this.xref = xref;
- this.catalog = new Catalog(xref);
- },
- get numPages() {
- var linearization = this.linearization;
- var num = linearization ? linearization.numPages : this.catalog.numPages;
- // shadow the prototype getter
- return shadow(this, 'numPages', num);
- },
- getDocumentInfo: function PDFDocument_getDocumentInfo() {
- var docInfo;
- if (this.xref.trailer.has('Info')) {
- var infoDict = this.xref.trailer.get('Info');
-
- docInfo = {};
- var validEntries = DocumentInfoValidators.entries;
- // Only fill the document info with valid entries from the spec.
- for (var key in validEntries) {
- if (infoDict.has(key)) {
- var value = infoDict.get(key);
- // Make sure the value conforms to the spec.
- if (validEntries[key](value)) {
- docInfo[key] = typeof value !== 'string' ? value :
- stringToPDFString(value);
- } else {
- info('Bad value in document info for "' + key + '"');
- }
- }
- }
- }
- return shadow(this, 'getDocumentInfo', docInfo);
- },
- getFingerprint: function PDFDocument_getFingerprint() {
- var xref = this.xref, fileID;
- if (xref.trailer.has('ID')) {
- fileID = '';
- var id = xref.trailer.get('ID')[0];
- id.split('').forEach(function(el) {
- fileID += Number(el.charCodeAt(0)).toString(16);
- });
- } else {
- // If we got no fileID, then we generate one,
- // from the first 100 bytes of PDF
- var data = this.stream.bytes.subarray(0, 100);
- var hash = calculateMD5(data, 0, data.length);
- fileID = '';
- for (var i = 0, length = hash.length; i < length; i++) {
- fileID += Number(hash[i]).toString(16);
- }
- }
-
- return shadow(this, 'getFingerprint', fileID);
- },
- getPage: function PDFDocument_getPage(n) {
- return this.catalog.getPage(n);
- }
- };
-
- return PDFDocument;
-})();
-
-
-
-// Use only for debugging purposes. This should not be used in any code that is
-// in mozilla master.
-var log = (function() {
- if ('console' in globalScope && 'log' in globalScope['console']) {
- return globalScope['console']['log'].bind(globalScope['console']);
- } else {
- return function nop() {
- };
- }
-})();
-
-// A notice for devs that will not trigger the fallback UI. These are good
-// for things that are helpful to devs, such as warning that Workers were
-// disabled, which is important to devs but not end users.
-function info(msg) {
- if (verbosity >= INFOS) {
- log('Info: ' + msg);
- PDFJS.LogManager.notify('info', msg);
- }
-}
-
-// Non-fatal warnings that should trigger the fallback UI.
-function warn(msg) {
- if (verbosity >= WARNINGS) {
- log('Warning: ' + msg);
- PDFJS.LogManager.notify('warn', msg);
- }
-}
-
-// Fatal errors that should trigger the fallback UI and halt execution by
-// throwing an exception.
-function error(msg) {
- // If multiple arguments were passed, pass them all to the log function.
- if (arguments.length > 1) {
- var logArguments = ['Error:'];
- logArguments.push.apply(logArguments, arguments);
- log.apply(null, logArguments);
- // Join the arguments into a single string for the lines below.
- msg = [].join.call(arguments, ' ');
- } else {
- log('Error: ' + msg);
- }
- log(backtrace());
- PDFJS.LogManager.notify('error', msg);
- throw new Error(msg);
-}
-
-// Missing features that should trigger the fallback UI.
-function TODO(what) {
- warn('TODO: ' + what);
-}
-
-function backtrace() {
- try {
- throw new Error();
- } catch (e) {
- return e.stack ? e.stack.split('\n').slice(2).join('\n') : '';
- }
-}
-
-function assert(cond, msg) {
- if (!cond)
- error(msg);
-}
-
-// Combines two URLs. The baseUrl shall be absolute URL. If the url is an
-// absolute URL, it will be returned as is.
-function combineUrl(baseUrl, url) {
- if (url.indexOf(':') >= 0)
- return url;
- if (url.charAt(0) == '/') {
- // absolute path
- var i = baseUrl.indexOf('://');
- i = baseUrl.indexOf('/', i + 3);
- return baseUrl.substring(0, i) + url;
- } else {
- // relative path
- var pathLength = baseUrl.length, i;
- i = baseUrl.lastIndexOf('#');
- pathLength = i >= 0 ? i : pathLength;
- i = baseUrl.lastIndexOf('?', pathLength);
- pathLength = i >= 0 ? i : pathLength;
- var prefixLength = baseUrl.lastIndexOf('/', pathLength);
- return baseUrl.substring(0, prefixLength + 1) + url;
- }
-}
-
-// In a well-formed PDF, |cond| holds. If it doesn't, subsequent
-// behavior is undefined.
-function assertWellFormed(cond, msg) {
- if (!cond)
- error(msg);
-}
-
-var LogManager = PDFJS.LogManager = (function LogManagerClosure() {
- var loggers = [];
- return {
- addLogger: function logManager_addLogger(logger) {
- loggers.push(logger);
- },
- notify: function(type, message) {
- for (var i = 0, ii = loggers.length; i < ii; i++) {
- var logger = loggers[i];
- if (logger[type])
- logger[type](message);
- }
- }
- };
-})();
-
-function shadow(obj, prop, value) {
- Object.defineProperty(obj, prop, { value: value,
- enumerable: true,
- configurable: true,
- writable: false });
- return value;
-}
-
-var PasswordException = (function PasswordExceptionClosure() {
- function PasswordException(msg, code) {
- this.name = 'PasswordException';
- this.message = msg;
- this.code = code;
- }
-
- PasswordException.prototype = new Error();
- PasswordException.constructor = PasswordException;
-
- return PasswordException;
-})();
-
-function bytesToString(bytes) {
- var str = '';
- var length = bytes.length;
- for (var n = 0; n < length; ++n)
- str += String.fromCharCode(bytes[n]);
- return str;
-}
-
-function stringToBytes(str) {
- var length = str.length;
- var bytes = new Uint8Array(length);
- for (var n = 0; n < length; ++n)
- bytes[n] = str.charCodeAt(n) & 0xFF;
- return bytes;
-}
-
-var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];
-
-var Util = PDFJS.Util = (function UtilClosure() {
- function Util() {}
-
- Util.makeCssRgb = function Util_makeCssRgb(r, g, b) {
- var ri = (255 * r) | 0, gi = (255 * g) | 0, bi = (255 * b) | 0;
- return 'rgb(' + ri + ',' + gi + ',' + bi + ')';
- };
-
- Util.makeCssCmyk = function Util_makeCssCmyk(c, m, y, k) {
- c = (new DeviceCmykCS()).getRgb([c, m, y, k]);
- var ri = (255 * c[0]) | 0, gi = (255 * c[1]) | 0, bi = (255 * c[2]) | 0;
- return 'rgb(' + ri + ',' + gi + ',' + bi + ')';
- };
-
- // For 2d affine transforms
- Util.applyTransform = function Util_applyTransform(p, m) {
- var xt = p[0] * m[0] + p[1] * m[2] + m[4];
- var yt = p[0] * m[1] + p[1] * m[3] + m[5];
- return [xt, yt];
- };
-
- Util.applyInverseTransform = function Util_applyInverseTransform(p, m) {
- var d = m[0] * m[3] - m[1] * m[2];
- var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;
- var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;
- return [xt, yt];
- };
-
- Util.inverseTransform = function Util_inverseTransform(m) {
- var d = m[0] * m[3] - m[1] * m[2];
- return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d,
- (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];
- };
-
- // Apply a generic 3d matrix M on a 3-vector v:
- // | a b c | | X |
- // | d e f | x | Y |
- // | g h i | | Z |
- // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i],
- // with v as [X,Y,Z]
- Util.apply3dTransform = function Util_apply3dTransform(m, v) {
- return [
- m[0] * v[0] + m[1] * v[1] + m[2] * v[2],
- m[3] * v[0] + m[4] * v[1] + m[5] * v[2],
- m[6] * v[0] + m[7] * v[1] + m[8] * v[2]
- ];
- }
-
- // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2)
- // For coordinate systems whose origin lies in the bottom-left, this
- // means normalization to (BL,TR) ordering. For systems with origin in the
- // top-left, this means (TL,BR) ordering.
- Util.normalizeRect = function Util_normalizeRect(rect) {
- var r = rect.slice(0); // clone rect
- if (rect[0] > rect[2]) {
- r[0] = rect[2];
- r[2] = rect[0];
- }
- if (rect[1] > rect[3]) {
- r[1] = rect[3];
- r[3] = rect[1];
- }
- return r;
- }
-
- // Returns a rectangle [x1, y1, x2, y2] corresponding to the
- // intersection of rect1 and rect2. If no intersection, returns 'false'
- // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2]
- Util.intersect = function Util_intersect(rect1, rect2) {
- function compare(a, b) {
- return a - b;
- };
-
- // Order points along the axes
- var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare),
- orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare),
- result = [];
-
- rect1 = Util.normalizeRect(rect1);
- rect2 = Util.normalizeRect(rect2);
-
- // X: first and second points belong to different rectangles?
- if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) ||
- (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) {
- // Intersection must be between second and third points
- result[0] = orderedX[1];
- result[2] = orderedX[2];
- } else {
- return false;
- }
-
- // Y: first and second points belong to different rectangles?
- if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) ||
- (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) {
- // Intersection must be between second and third points
- result[1] = orderedY[1];
- result[3] = orderedY[2];
- } else {
- return false;
- }
-
- return result;
- };
-
- Util.sign = function Util_sign(num) {
- return num < 0 ? -1 : 1;
- };
-
- return Util;
-})();
-
-var PageViewport = PDFJS.PageViewport = (function PageViewportClosure() {
- function PageViewport(viewBox, scale, rotate, offsetX, offsetY) {
- // creating transform to convert pdf coordinate system to the normal
- // canvas like coordinates taking in account scale and rotation
- var centerX = (viewBox[2] + viewBox[0]) / 2;
- var centerY = (viewBox[3] + viewBox[1]) / 2;
- var rotateA, rotateB, rotateC, rotateD;
- switch (rotate) {
- case -180:
- case 180:
- rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1;
- break;
- case -270:
- case 90:
- rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0;
- break;
- case -90:
- case 270:
- rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0;
- break;
- case 360:
- case 0:
- default:
- rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1;
- break;
- }
- var offsetCanvasX, offsetCanvasY;
- var width, height;
- if (rotateA == 0) {
- offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;
- offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;
- width = Math.abs(viewBox[3] - viewBox[1]) * scale;
- height = Math.abs(viewBox[2] - viewBox[0]) * scale;
- } else {
- offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;
- offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;
- width = Math.abs(viewBox[2] - viewBox[0]) * scale;
- height = Math.abs(viewBox[3] - viewBox[1]) * scale;
- }
- // creating transform for the following operations:
- // translate(-centerX, -centerY), rotate and flip vertically,
- // scale, and translate(offsetCanvasX, offsetCanvasY)
- this.transform = [
- rotateA * scale,
- rotateB * scale,
- rotateC * scale,
- rotateD * scale,
- offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY,
- offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY
- ];
-
- this.offsetX = offsetX;
- this.offsetY = offsetY;
- this.width = width;
- this.height = height;
- this.fontScale = scale;
- }
- PageViewport.prototype = {
- convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) {
- return Util.applyTransform([x, y], this.transform);
- },
- convertToViewportRectangle:
- function PageViewport_convertToViewportRectangle(rect) {
- var tl = Util.applyTransform([rect[0], rect[1]], this.transform);
- var br = Util.applyTransform([rect[2], rect[3]], this.transform);
- return [tl[0], tl[1], br[0], br[1]];
- },
- convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) {
- return Util.applyInverseTransform([x, y], this.transform);
- }
- };
- return PageViewport;
-})();
-
-var PDFStringTranslateTable = [
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014,
- 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C,
- 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160,
- 0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC
-];
-
-function stringToPDFString(str) {
- var i, n = str.length, str2 = '';
- if (str[0] === '\xFE' && str[1] === '\xFF') {
- // UTF16BE BOM
- for (i = 2; i < n; i += 2)
- str2 += String.fromCharCode(
- (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1));
- } else {
- for (i = 0; i < n; ++i) {
- var code = PDFStringTranslateTable[str.charCodeAt(i)];
- str2 += code ? String.fromCharCode(code) : str.charAt(i);
- }
- }
- return str2;
-}
-
-function stringToUTF8String(str) {
- return decodeURIComponent(escape(str));
-}
-
-function isBool(v) {
- return typeof v == 'boolean';
-}
-
-function isInt(v) {
- return typeof v == 'number' && ((v | 0) == v);
-}
-
-function isNum(v) {
- return typeof v == 'number';
-}
-
-function isString(v) {
- return typeof v == 'string';
-}
-
-function isNull(v) {
- return v === null;
-}
-
-function isName(v) {
- return v instanceof Name;
-}
-
-function isCmd(v, cmd) {
- return v instanceof Cmd && (!cmd || v.cmd == cmd);
-}
-
-function isDict(v, type) {
- return v instanceof Dict && (!type || v.get('Type').name == type);
-}
-
-function isArray(v) {
- return v instanceof Array;
-}
-
-function isStream(v) {
- return typeof v == 'object' && v != null && ('getChar' in v);
-}
-
-function isArrayBuffer(v) {
- return typeof v == 'object' && v != null && ('byteLength' in v);
-}
-
-function isRef(v) {
- return v instanceof Ref;
-}
-
-function isPDFFunction(v) {
- var fnDict;
- if (typeof v != 'object')
- return false;
- else if (isDict(v))
- fnDict = v;
- else if (isStream(v))
- fnDict = v.dict;
- else
- return false;
- return fnDict.has('FunctionType');
-}
-
-/**
- * 'Promise' object.
- * Each object that is stored in PDFObjects is based on a Promise object that
- * contains the status of the object and the data. There migth be situations,
- * where a function want to use the value of an object, but it isn't ready at
- * that time. To get a notification, once the object is ready to be used, s.o.
- * can add a callback using the `then` method on the promise that then calls
- * the callback once the object gets resolved.
- * A promise can get resolved only once and only once the data of the promise
- * can be set. If any of these happens twice or the data is required before
- * it was set, an exception is throw.
- */
-var Promise = PDFJS.Promise = (function PromiseClosure() {
- var EMPTY_PROMISE = {};
-
- /**
- * If `data` is passed in this constructor, the promise is created resolved.
- * If there isn't data, it isn't resolved at the beginning.
- */
- function Promise(name, data) {
- this.name = name;
- this.isRejected = false;
- this.error = null;
- // If you build a promise and pass in some data it's already resolved.
- if (data != null) {
- this.isResolved = true;
- this._data = data;
- this.hasData = true;
- } else {
- this.isResolved = false;
- this._data = EMPTY_PROMISE;
- }
- this.callbacks = [];
- this.errbacks = [];
- this.progressbacks = [];
- };
- /**
- * Builds a promise that is resolved when all the passed in promises are
- * resolved.
- * @param {Promise[]} promises Array of promises to wait for.
- * @return {Promise} New dependant promise.
- */
- Promise.all = function Promise_all(promises) {
- var deferred = new Promise();
- var unresolved = promises.length;
- var results = [];
- if (unresolved === 0) {
- deferred.resolve(results);
- return deferred;
- }
- for (var i = 0, ii = promises.length; i < ii; ++i) {
- var promise = promises[i];
- promise.then((function(i) {
- return function(value) {
- results[i] = value;
- unresolved--;
- if (unresolved === 0)
- deferred.resolve(results);
- };
- })(i));
- }
- return deferred;
- };
- Promise.prototype = {
- hasData: false,
-
- set data(value) {
- if (value === undefined) {
- return;
- }
- if (this._data !== EMPTY_PROMISE) {
- error('Promise ' + this.name +
- ': Cannot set the data of a promise twice');
- }
- this._data = value;
- this.hasData = true;
-
- if (this.onDataCallback) {
- this.onDataCallback(value);
- }
- },
-
- get data() {
- if (this._data === EMPTY_PROMISE) {
- error('Promise ' + this.name + ': Cannot get data that isn\'t set');
- }
- return this._data;
- },
-
- onData: function Promise_onData(callback) {
- if (this._data !== EMPTY_PROMISE) {
- callback(this._data);
- } else {
- this.onDataCallback = callback;
- }
- },
-
- resolve: function Promise_resolve(data) {
- if (this.isResolved) {
- error('A Promise can be resolved only once ' + this.name);
- }
- if (this.isRejected) {
- error('The Promise was already rejected ' + this.name);
- }
-
- this.isResolved = true;
- this.data = (typeof data !== 'undefined') ? data : null;
- var callbacks = this.callbacks;
-
- for (var i = 0, ii = callbacks.length; i < ii; i++) {
- callbacks[i].call(null, data);
- }
- },
-
- progress: function Promise_progress(data) {
- var callbacks = this.progressbacks;
- for (var i = 0, ii = callbacks.length; i < ii; i++) {
- callbacks[i].call(null, data);
- }
- },
-
- reject: function Promise_reject(reason, exception) {
- if (this.isRejected) {
- error('A Promise can be rejected only once ' + this.name);
- }
- if (this.isResolved) {
- error('The Promise was already resolved ' + this.name);
- }
-
- this.isRejected = true;
- this.error = reason || null;
- var errbacks = this.errbacks;
-
- for (var i = 0, ii = errbacks.length; i < ii; i++) {
- errbacks[i].call(null, reason, exception);
- }
- },
-
- then: function Promise_then(callback, errback, progressback) {
- if (!callback) {
- error('Requiring callback' + this.name);
- }
-
- // If the promise is already resolved, call the callback directly.
- if (this.isResolved) {
- var data = this.data;
- callback.call(null, data);
- } else if (this.isRejected && errback) {
- var error = this.error;
- errback.call(null, error);
- } else {
- this.callbacks.push(callback);
- if (errback)
- this.errbacks.push(errback);
- }
-
- if (progressback)
- this.progressbacks.push(progressback);
- }
- };
-
- return Promise;
-})();
-
-var StatTimer = (function StatTimerClosure() {
- function rpad(str, pad, length) {
- while (str.length < length)
- str += pad;
- return str;
- }
- function StatTimer() {
- this.started = {};
- this.times = [];
- this.enabled = true;
- }
- StatTimer.prototype = {
- time: function StatTimer_time(name) {
- if (!this.enabled)
- return;
- if (name in this.started)
- throw 'Timer is already running for ' + name;
- this.started[name] = Date.now();
- },
- timeEnd: function StatTimer_timeEnd(name) {
- if (!this.enabled)
- return;
- if (!(name in this.started))
- throw 'Timer has not been started for ' + name;
- this.times.push({
- 'name': name,
- 'start': this.started[name],
- 'end': Date.now()
- });
- // Remove timer from started so it can be called again.
- delete this.started[name];
- },
- toString: function StatTimer_toString() {
- var times = this.times;
- var out = '';
- // Find the longest name for padding purposes.
- var longest = 0;
- for (var i = 0, ii = times.length; i < ii; ++i) {
- var name = times[i]['name'];
- if (name.length > longest)
- longest = name.length;
- }
- for (var i = 0, ii = times.length; i < ii; ++i) {
- var span = times[i];
- var duration = span.end - span.start;
- out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\n';
- }
- return out;
- }
- };
- return StatTimer;
-})();
-
-PDFJS.createBlob = function createBlob(data, contentType) {
- if (typeof Blob === 'function')
- return new Blob([data], { type: contentType });
- // Blob builder is deprecated in FF14 and removed in FF18.
- var bb = new MozBlobBuilder();
- bb.append(data);
- return bb.getBlob(contentType);
-};
-
-
-/**
- * This is the main entry point for loading a PDF and interacting with it.
- * NOTE: If a URL is used to fetch the PDF data a standard XMLHttpRequest(XHR)
- * is used, which means it must follow the same origin rules that any XHR does
- * e.g. No cross domain requests without CORS.
- *
- * @param {string|TypedAray|object} source Can be an url to where a PDF is
- * located, a typed array (Uint8Array) already populated with data or
- * and parameter object with the following possible fields:
- * - url - The URL of the PDF.
- * - data - A typed array with PDF data.
- * - httpHeaders - Basic authentication headers.
- * - password - For decrypting password-protected PDFs.
- *
- * @return {Promise} A promise that is resolved with {PDFDocumentProxy} object.
- */
-PDFJS.getDocument = function getDocument(source) {
- var workerInitializedPromise, workerReadyPromise, transport;
-
- if (typeof source === 'string') {
- source = { url: source };
- } else if (isArrayBuffer(source)) {
- source = { data: source };
- } else if (typeof source !== 'object') {
- error('Invalid parameter in getDocument, need either Uint8Array, ' +
- 'string or a parameter object');
- }
-
- if (!source.url && !source.data)
- error('Invalid parameter array, need either .data or .url');
-
- // copy/use all keys as is except 'url' -- full path is required
- var params = {};
- for (var key in source) {
- if (key === 'url' && typeof window !== 'undefined') {
- params[key] = combineUrl(window.location.href, source[key]);
- continue;
- }
- params[key] = source[key];
- }
-
- workerInitializedPromise = new PDFJS.Promise();
- workerReadyPromise = new PDFJS.Promise();
- transport = new WorkerTransport(workerInitializedPromise, workerReadyPromise);
- workerInitializedPromise.then(function transportInitialized() {
- transport.fetchDocument(params);
- });
- return workerReadyPromise;
-};
-
-/**
- * Proxy to a PDFDocument in the worker thread. Also, contains commonly used
- * properties that can be read synchronously.
- */
-var PDFDocumentProxy = (function PDFDocumentProxyClosure() {
- function PDFDocumentProxy(pdfInfo, transport) {
- this.pdfInfo = pdfInfo;
- this.transport = transport;
- }
- PDFDocumentProxy.prototype = {
- /**
- * @return {number} Total number of pages the PDF contains.
- */
- get numPages() {
- return this.pdfInfo.numPages;
- },
- /**
- * @return {string} A unique ID to identify a PDF. Not guaranteed to be
- * unique.
- */
- get fingerprint() {
- return this.pdfInfo.fingerprint;
- },
- /**
- * @param {number} The page number to get. The first page is 1.
- * @return {Promise} A promise that is resolved with a {PDFPageProxy}
- * object.
- */
- getPage: function PDFDocumentProxy_getPage(number) {
- return this.transport.getPage(number);
- },
- /**
- * @return {Promise} A promise that is resolved with a lookup table for
- * mapping named destinations to reference numbers.
- */
- getDestinations: function PDFDocumentProxy_getDestinations() {
- var promise = new PDFJS.Promise();
- var destinations = this.pdfInfo.destinations;
- promise.resolve(destinations);
- return promise;
- },
- /**
- * @return {Promise} A promise that is resolved with an {array} that is a
- * tree outline (if it has one) of the PDF. The tree is in the format of:
- * [
- * {
- * title: string,
- * bold: boolean,
- * italic: boolean,
- * color: rgb array,
- * dest: dest obj,
- * items: array of more items like this
- * },
- * ...
- * ].
- */
- getOutline: function PDFDocumentProxy_getOutline() {
- var promise = new PDFJS.Promise();
- var outline = this.pdfInfo.outline;
- promise.resolve(outline);
- return promise;
- },
- /**
- * @return {Promise} A promise that is resolved with an {object} that has
- * info and metadata properties. Info is an {object} filled with anything
- * available in the information dictionary and similarly metadata is a
- * {Metadata} object with information from the metadata section of the PDF.
- */
- getMetadata: function PDFDocumentProxy_getMetadata() {
- var promise = new PDFJS.Promise();
- var info = this.pdfInfo.info;
- var metadata = this.pdfInfo.metadata;
- promise.resolve({
- info: info,
- metadata: metadata ? new PDFJS.Metadata(metadata) : null
- });
- return promise;
- },
- isEncrypted: function PDFDocumentProxy_isEncrypted() {
- var promise = new PDFJS.Promise();
- promise.resolve(this.pdfInfo.encrypted);
- return promise;
- },
- /**
- * @return {Promise} A promise that is resolved with a TypedArray that has
- * the raw data from the PDF.
- */
- getData: function PDFDocumentProxy_getData() {
- var promise = new PDFJS.Promise();
- this.transport.getData(promise);
- return promise;
- },
- destroy: function PDFDocumentProxy_destroy() {
- this.transport.destroy();
- }
- };
- return PDFDocumentProxy;
-})();
-
-var PDFPageProxy = (function PDFPageProxyClosure() {
- function PDFPageProxy(pageInfo, transport) {
- this.pageInfo = pageInfo;
- this.transport = transport;
- this.stats = new StatTimer();
- this.stats.enabled = !!globalScope.PDFJS.enableStats;
- this.objs = transport.objs;
- this.renderInProgress = false;
- }
- PDFPageProxy.prototype = {
- /**
- * @return {number} Page number of the page. First page is 1.
- */
- get pageNumber() {
- return this.pageInfo.pageIndex + 1;
- },
- /**
- * @return {number} The number of degrees the page is rotated clockwise.
- */
- get rotate() {
- return this.pageInfo.rotate;
- },
- /**
- * @return {object} The reference that points to this page. It has 'num' and
- * 'gen' properties.
- */
- get ref() {
- return this.pageInfo.ref;
- },
- /**
- * @return {array} An array of the visible portion of the PDF page in the
- * user space units - [x1, y1, x2, y2].
- */
- get view() {
- return this.pageInfo.view;
- },
- /**
- * @param {number} scale The desired scale of the viewport.
- * @param {number} rotate Degrees to rotate the viewport. If omitted this
- * defaults to the page rotation.
- * @return {PageViewport} Contains 'width' and 'height' properties along
- * with transforms required for rendering.
- */
- getViewport: function PDFPageProxy_getViewport(scale, rotate) {
- if (arguments.length < 2)
- rotate = this.rotate;
- return new PDFJS.PageViewport(this.view, scale, rotate, 0, 0);
- },
- /**
- * @return {Promise} A promise that is resolved with an {array} of the
- * annotation objects.
- */
- getAnnotations: function PDFPageProxy_getAnnotations() {
- if (this.annotationsPromise)
- return this.annotationsPromise;
-
- var promise = new PDFJS.Promise();
- this.annotationsPromise = promise;
- this.transport.getAnnotations(this.pageInfo.pageIndex);
- return promise;
- },
- /**
- * Begins the process of rendering a page to the desired context.
- * @param {object} params A parameter object that supports:
- * {
- * canvasContext(required): A 2D context of a DOM Canvas object.,
- * textLayer(optional): An object that has beginLayout, endLayout, and
- * appendText functions.,
- * continueCallback(optional): A function that will be called each time
- * the rendering is paused. To continue
- * rendering call the function that is the
- * first argument to the callback.
- * }.
- * @return {Promise} A promise that is resolved when the page finishes
- * rendering.
- */
- render: function PDFPageProxy_render(params) {
- this.renderInProgress = true;
-
- var promise = new Promise();
- var stats = this.stats;
- stats.time('Overall');
- // If there is no displayReadyPromise yet, then the operatorList was never
- // requested before. Make the request and create the promise.
- if (!this.displayReadyPromise) {
- this.displayReadyPromise = new Promise();
- this.destroyed = false;
-
- this.stats.time('Page Request');
- this.transport.messageHandler.send('RenderPageRequest', {
- pageIndex: this.pageNumber - 1
- });
- }
-
- var self = this;
- function complete(error) {
- self.renderInProgress = false;
- if (self.destroyed) {
- delete self.operatorList;
- delete self.displayReadyPromise;
- }
-
- if (error)
- promise.reject(error);
- else
- promise.resolve();
- };
- var continueCallback = params.continueCallback;
-
- // Once the operatorList and fonts are loaded, do the actual rendering.
- this.displayReadyPromise.then(
- function pageDisplayReadyPromise() {
- if (self.destroyed) {
- complete();
- return;
- }
-
- var gfx = new CanvasGraphics(params.canvasContext,
- this.objs, params.textLayer);
- try {
- this.display(gfx, params.viewport, complete, continueCallback);
- } catch (e) {
- complete(e);
- }
- }.bind(this),
- function pageDisplayReadPromiseError(reason) {
- complete(reason);
- }
- );
-
- return promise;
- },
- /**
- * For internal use only.
- */
- startRenderingFromOperatorList:
- function PDFPageProxy_startRenderingFromOperatorList(operatorList,
- fonts) {
- var self = this;
- this.operatorList = operatorList;
-
- var displayContinuation = function pageDisplayContinuation() {
- // Always defer call to display() to work around bug in
- // Firefox error reporting from XHR callbacks.
- setTimeout(function pageSetTimeout() {
- self.displayReadyPromise.resolve();
- });
- };
-
- this.ensureFonts(fonts,
- function pageStartRenderingFromOperatorListEnsureFonts() {
- displayContinuation();
- }
- );
- },
- /**
- * For internal use only.
- */
- ensureFonts: function PDFPageProxy_ensureFonts(fonts, callback) {
- this.stats.time('Font Loading');
- // Convert the font names to the corresponding font obj.
- var fontObjs = [];
- for (var i = 0, ii = fonts.length; i < ii; i++) {
- var obj = this.objs.objs[fonts[i]].data;
- if (obj.error) {
- warn('Error during font loading: ' + obj.error);
- continue;
- }
- fontObjs.push(obj);
- }
-
- // Load all the fonts
- FontLoader.bind(
- fontObjs,
- function pageEnsureFontsFontObjs(fontObjs) {
- this.stats.timeEnd('Font Loading');
-
- callback.call(this);
- }.bind(this)
- );
- },
- /**
- * For internal use only.
- */
- display: function PDFPageProxy_display(gfx, viewport, callback,
- continueCallback) {
- var stats = this.stats;
- stats.time('Rendering');
-
- gfx.beginDrawing(viewport);
-
- var startIdx = 0;
- var length = this.operatorList.fnArray.length;
- var operatorList = this.operatorList;
- var stepper = null;
- if (PDFJS.pdfBug && 'StepperManager' in globalScope &&
- globalScope['StepperManager'].enabled) {
- stepper = globalScope['StepperManager'].create(this.pageNumber - 1);
- stepper.init(operatorList);
- stepper.nextBreakPoint = stepper.getNextBreakPoint();
- }
-
- var continueWrapper;
- if (continueCallback)
- continueWrapper = function() { continueCallback(next); }
- else
- continueWrapper = next;
-
- var self = this;
- function next() {
- startIdx = gfx.executeOperatorList(operatorList, startIdx,
- continueWrapper, stepper);
- if (startIdx == length) {
- gfx.endDrawing();
- stats.timeEnd('Rendering');
- stats.timeEnd('Overall');
- if (callback) callback();
- }
- }
- continueWrapper();
- },
- /**
- * @return {Promise} That is resolved with the a {string} that is the text
- * content from the page.
- */
- getTextContent: function PDFPageProxy_getTextContent() {
- var promise = new PDFJS.Promise();
- this.transport.messageHandler.send('GetTextContent', {
- pageIndex: this.pageNumber - 1
- },
- function textContentCallback(textContent) {
- promise.resolve(textContent);
- }
- );
- return promise;
- },
- /**
- * Stub for future feature.
- */
- getOperationList: function PDFPageProxy_getOperationList() {
- var promise = new PDFJS.Promise();
- var operationList = { // not implemented
- dependencyFontsID: null,
- operatorList: null
- };
- promise.resolve(operationList);
- return promise;
- },
- /**
- * Destroys resources allocated by the page.
- */
- destroy: function PDFPageProxy_destroy() {
- this.destroyed = true;
-
- if (!this.renderInProgress) {
- delete this.operatorList;
- delete this.displayReadyPromise;
- }
- }
- };
- return PDFPageProxy;
-})();
-/**
- * For internal use only.
- */
-var WorkerTransport = (function WorkerTransportClosure() {
- function WorkerTransport(workerInitializedPromise, workerReadyPromise) {
- this.workerReadyPromise = workerReadyPromise;
- this.objs = new PDFObjects();
-
- this.pageCache = [];
- this.pagePromises = [];
- this.fontsLoading = {};
-
- // If worker support isn't disabled explicit and the browser has worker
- // support, create a new web worker and test if it/the browser fullfills
- // all requirements to run parts of pdf.js in a web worker.
- // Right now, the requirement is, that an Uint8Array is still an Uint8Array
- // as it arrives on the worker. Chrome added this with version 15.
- if (!globalScope.PDFJS.disableWorker && typeof Worker !== 'undefined') {
- var workerSrc = PDFJS.workerSrc;
- if (typeof workerSrc === 'undefined') {
- error('No PDFJS.workerSrc specified');
- }
-
- try {
- var worker;
- // Some versions of FF can't create a worker on localhost, see:
- // https://bugzilla.mozilla.org/show_bug.cgi?id=683280
- worker = new Worker(workerSrc);
- var messageHandler = new MessageHandler('main', worker);
- this.messageHandler = messageHandler;
-
- messageHandler.on('test', function transportTest(supportTypedArray) {
- if (supportTypedArray) {
- this.worker = worker;
- this.setupMessageHandler(messageHandler);
- } else {
- globalScope.PDFJS.disableWorker = true;
- this.setupFakeWorker();
- }
- workerInitializedPromise.resolve();
- }.bind(this));
-
- var testObj = new Uint8Array(1);
- // Some versions of Opera throw a DATA_CLONE_ERR on
- // serializing the typed array.
- messageHandler.send('test', testObj);
- return;
- } catch (e) {
- info('The worker has been disabled.');
- }
- }
- // Either workers are disabled, not supported or have thrown an exception.
- // Thus, we fallback to a faked worker.
- globalScope.PDFJS.disableWorker = true;
- this.setupFakeWorker();
- workerInitializedPromise.resolve();
- }
- WorkerTransport.prototype = {
- destroy: function WorkerTransport_destroy() {
- if (this.worker)
- this.worker.terminate();
-
- this.pageCache = [];
- this.pagePromises = [];
- },
- setupFakeWorker: function WorkerTransport_setupFakeWorker() {
- warn('Setting up fake worker.');
- // If we don't use a worker, just post/sendMessage to the main thread.
- var fakeWorker = {
- postMessage: function WorkerTransport_postMessage(obj) {
- fakeWorker.onmessage({data: obj});
- },
- terminate: function WorkerTransport_terminate() {}
- };
-
- var messageHandler = new MessageHandler('main', fakeWorker);
- this.setupMessageHandler(messageHandler);
-
- // If the main thread is our worker, setup the handling for the messages
- // the main thread sends to it self.
- WorkerMessageHandler.setup(messageHandler);
- },
-
- setupMessageHandler:
- function WorkerTransport_setupMessageHandler(messageHandler) {
- this.messageHandler = messageHandler;
-
- messageHandler.on('GetDoc', function transportDoc(data) {
- var pdfInfo = data.pdfInfo;
- var pdfDocument = new PDFDocumentProxy(pdfInfo, this);
- this.pdfDocument = pdfDocument;
- this.workerReadyPromise.resolve(pdfDocument);
- }, this);
-
- messageHandler.on('NeedPassword', function transportPassword(data) {
- this.workerReadyPromise.reject(data.exception.message, data.exception);
- }, this);
-
- messageHandler.on('IncorrectPassword', function transportBadPass(data) {
- this.workerReadyPromise.reject(data.exception.message, data.exception);
- }, this);
-
- messageHandler.on('GetPage', function transportPage(data) {
- var pageInfo = data.pageInfo;
- var page = new PDFPageProxy(pageInfo, this);
- this.pageCache[pageInfo.pageIndex] = page;
- var promise = this.pagePromises[pageInfo.pageIndex];
- promise.resolve(page);
- }, this);
-
- messageHandler.on('GetAnnotations', function transportAnnotations(data) {
- var annotations = data.annotations;
- var promise = this.pageCache[data.pageIndex].annotationsPromise;
- promise.resolve(annotations);
- }, this);
-
- messageHandler.on('RenderPage', function transportRender(data) {
- var page = this.pageCache[data.pageIndex];
- var depFonts = data.depFonts;
-
- page.stats.timeEnd('Page Request');
- page.startRenderingFromOperatorList(data.operatorList, depFonts);
- }, this);
-
- messageHandler.on('obj', function transportObj(data) {
- var id = data[0];
- var type = data[1];
- if (this.objs.hasData(id))
- return;
-
- switch (type) {
- case 'JpegStream':
- var imageData = data[2];
- loadJpegStream(id, imageData, this.objs);
- break;
- case 'Image':
- var imageData = data[2];
- this.objs.resolve(id, imageData);
- break;
- case 'Font':
- var exportedData = data[2];
-
- // At this point, only the font object is created but the font is
- // not yet attached to the DOM. This is done in `FontLoader.bind`.
- var font;
- if ('error' in exportedData)
- font = new ErrorFont(exportedData.error);
- else
- font = new Font(exportedData);
- this.objs.resolve(id, font);
- break;
- default:
- error('Got unkown object type ' + type);
- }
- }, this);
-
- messageHandler.on('DocProgress', function transportDocProgress(data) {
- this.workerReadyPromise.progress({
- loaded: data.loaded,
- total: data.total
- });
- }, this);
-
- messageHandler.on('DocError', function transportDocError(data) {
- this.workerReadyPromise.reject(data);
- }, this);
-
- messageHandler.on('PageError', function transportError(data) {
- var page = this.pageCache[data.pageNum - 1];
- if (page.displayReadyPromise)
- page.displayReadyPromise.reject(data.error);
- else
- error(data.error);
- }, this);
-
- messageHandler.on('JpegDecode', function(data, promise) {
- var imageData = data[0];
- var components = data[1];
- if (components != 3 && components != 1)
- error('Only 3 component or 1 component can be returned');
-
- var img = new Image();
- img.onload = (function messageHandler_onloadClosure() {
- var width = img.width;
- var height = img.height;
- var size = width * height;
- var rgbaLength = size * 4;
- var buf = new Uint8Array(size * components);
- var tmpCanvas = createScratchCanvas(width, height);
- var tmpCtx = tmpCanvas.getContext('2d');
- tmpCtx.drawImage(img, 0, 0);
- var data = tmpCtx.getImageData(0, 0, width, height).data;
-
- if (components == 3) {
- for (var i = 0, j = 0; i < rgbaLength; i += 4, j += 3) {
- buf[j] = data[i];
- buf[j + 1] = data[i + 1];
- buf[j + 2] = data[i + 2];
- }
- } else if (components == 1) {
- for (var i = 0, j = 0; i < rgbaLength; i += 4, j++) {
- buf[j] = data[i];
- }
- }
- promise.resolve({ data: buf, width: width, height: height});
- }).bind(this);
- var src = 'data:image/jpeg;base64,' + window.btoa(imageData);
- img.src = src;
- });
- },
-
- fetchDocument: function WorkerTransport_fetchDocument(source) {
- this.messageHandler.send('GetDocRequest', {source: source});
- },
-
- getData: function WorkerTransport_getData(promise) {
- this.messageHandler.send('GetData', null, function(data) {
- promise.resolve(data);
- });
- },
-
- getPage: function WorkerTransport_getPage(pageNumber, promise) {
- var pageIndex = pageNumber - 1;
- if (pageIndex in this.pagePromises)
- return this.pagePromises[pageIndex];
- var promise = new PDFJS.Promise('Page ' + pageNumber);
- this.pagePromises[pageIndex] = promise;
- this.messageHandler.send('GetPageRequest', { pageIndex: pageIndex });
- return promise;
- },
-
- getAnnotations: function WorkerTransport_getAnnotations(pageIndex) {
- this.messageHandler.send('GetAnnotationsRequest',
- { pageIndex: pageIndex });
- }
- };
- return WorkerTransport;
-
-})();
-
-
-// <canvas> contexts store most of the state we need natively.
-// However, PDF needs a bit more state, which we store here.
-
-var TextRenderingMode = {
- FILL: 0,
- STROKE: 1,
- FILL_STROKE: 2,
- INVISIBLE: 3,
- FILL_ADD_TO_PATH: 4,
- STROKE_ADD_TO_PATH: 5,
- FILL_STROKE_ADD_TO_PATH: 6,
- ADD_TO_PATH: 7
-};
-
-// Minimal font size that would be used during canvas fillText operations.
-var MIN_FONT_SIZE = 1;
-
-function createScratchCanvas(width, height) {
- var canvas = document.createElement('canvas');
- canvas.width = width;
- canvas.height = height;
- return canvas;
-}
-
-function addContextCurrentTransform(ctx) {
- // If the context doesn't expose a `mozCurrentTransform`, add a JS based on.
- if (!ctx.mozCurrentTransform) {
- // Store the original context
- ctx._originalSave = ctx.save;
- ctx._originalRestore = ctx.restore;
- ctx._originalRotate = ctx.rotate;
- ctx._originalScale = ctx.scale;
- ctx._originalTranslate = ctx.translate;
- ctx._originalTransform = ctx.transform;
-
- ctx._transformMatrix = [1, 0, 0, 1, 0, 0];
- ctx._transformStack = [];
-
- Object.defineProperty(ctx, 'mozCurrentTransform', {
- get: function getCurrentTransform() {
- return this._transformMatrix;
- }
- });
-
- Object.defineProperty(ctx, 'mozCurrentTransformInverse', {
- get: function getCurrentTransformInverse() {
- // Calculation done using WolframAlpha:
- // http://www.wolframalpha.com/input/?
- // i=Inverse+{{a%2C+c%2C+e}%2C+{b%2C+d%2C+f}%2C+{0%2C+0%2C+1}}
-
- var m = this._transformMatrix;
- var a = m[0], b = m[1], c = m[2], d = m[3], e = m[4], f = m[5];
-
- var ad_bc = a * d - b * c;
- var bc_ad = b * c - a * d;
-
- return [
- d / ad_bc,
- b / bc_ad,
- c / bc_ad,
- a / ad_bc,
- (d * e - c * f) / bc_ad,
- (b * e - a * f) / ad_bc
- ];
- }
- });
-
- ctx.save = function ctxSave() {
- var old = this._transformMatrix;
- this._transformStack.push(old);
- this._transformMatrix = old.slice(0, 6);
-
- this._originalSave();
- };
-
- ctx.restore = function ctxRestore() {
- var prev = this._transformStack.pop();
- if (prev) {
- this._transformMatrix = prev;
- this._originalRestore();
- }
- };
-
- ctx.translate = function ctxTranslate(x, y) {
- var m = this._transformMatrix;
- m[4] = m[0] * x + m[2] * y + m[4];
- m[5] = m[1] * x + m[3] * y + m[5];
-
- this._originalTranslate(x, y);
- };
-
- ctx.scale = function ctxScale(x, y) {
- var m = this._transformMatrix;
- m[0] = m[0] * x;
- m[1] = m[1] * x;
- m[2] = m[2] * y;
- m[3] = m[3] * y;
-
- this._originalScale(x, y);
- };
-
- ctx.transform = function ctxTransform(a, b, c, d, e, f) {
- var m = this._transformMatrix;
- this._transformMatrix = [
- m[0] * a + m[2] * b,
- m[1] * a + m[3] * b,
- m[0] * c + m[2] * d,
- m[1] * c + m[3] * d,
- m[0] * e + m[2] * f + m[4],
- m[1] * e + m[3] * f + m[5]
- ];
-
- ctx._originalTransform(a, b, c, d, e, f);
- };
-
- ctx.rotate = function ctxRotate(angle) {
- var cosValue = Math.cos(angle);
- var sinValue = Math.sin(angle);
-
- var m = this._transformMatrix;
- this._transformMatrix = [
- m[0] * cosValue + m[2] * sinValue,
- m[1] * cosValue + m[3] * sinValue,
- m[0] * (-sinValue) + m[2] * cosValue,
- m[1] * (-sinValue) + m[3] * cosValue,
- m[4],
- m[5]
- ];
-
- this._originalRotate(angle);
- };
- }
-}
-
-var CanvasExtraState = (function CanvasExtraStateClosure() {
- function CanvasExtraState(old) {
- // Are soft masks and alpha values shapes or opacities?
- this.alphaIsShape = false;
- this.fontSize = 0;
- this.fontSizeScale = 1;
- this.textMatrix = IDENTITY_MATRIX;
- this.fontMatrix = IDENTITY_MATRIX;
- this.leading = 0;
- // Current point (in user coordinates)
- this.x = 0;
- this.y = 0;
- // Start of text line (in text coordinates)
- this.lineX = 0;
- this.lineY = 0;
- // Character and word spacing
- this.charSpacing = 0;
- this.wordSpacing = 0;
- this.textHScale = 1;
- this.textRenderingMode = TextRenderingMode.FILL;
- this.textRise = 0;
- // Color spaces
- this.fillColorSpace = new DeviceGrayCS();
- this.fillColorSpaceObj = null;
- this.strokeColorSpace = new DeviceGrayCS();
- this.strokeColorSpaceObj = null;
- this.fillColorObj = null;
- this.strokeColorObj = null;
- // Default fore and background colors
- this.fillColor = '#000000';
- this.strokeColor = '#000000';
- // Note: fill alpha applies to all non-stroking operations
- this.fillAlpha = 1;
- this.strokeAlpha = 1;
- this.lineWidth = 1;
-
- this.old = old;
- }
-
- CanvasExtraState.prototype = {
- clone: function CanvasExtraState_clone() {
- return Object.create(this);
- },
- setCurrentPoint: function CanvasExtraState_setCurrentPoint(x, y) {
- this.x = x;
- this.y = y;
- }
- };
- return CanvasExtraState;
-})();
-
-var CanvasGraphics = (function CanvasGraphicsClosure() {
- // Defines the time the executeOperatorList is going to be executing
- // before it stops and shedules a continue of execution.
- var kExecutionTime = 15;
-
- function CanvasGraphics(canvasCtx, objs, textLayer) {
- this.ctx = canvasCtx;
- this.current = new CanvasExtraState();
- this.stateStack = [];
- this.pendingClip = null;
- this.res = null;
- this.xobjs = null;
- this.objs = objs;
- this.textLayer = textLayer;
- if (canvasCtx) {
- addContextCurrentTransform(canvasCtx);
- }
- }
-
- var LINE_CAP_STYLES = ['butt', 'round', 'square'];
- var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];
- var NORMAL_CLIP = {};
- var EO_CLIP = {};
-
- CanvasGraphics.prototype = {
- slowCommands: {
- 'stroke': true,
- 'closeStroke': true,
- 'fill': true,
- 'eoFill': true,
- 'fillStroke': true,
- 'eoFillStroke': true,
- 'closeFillStroke': true,
- 'closeEOFillStroke': true,
- 'showText': true,
- 'showSpacedText': true,
- 'setStrokeColorSpace': true,
- 'setFillColorSpace': true,
- 'setStrokeColor': true,
- 'setStrokeColorN': true,
- 'setFillColor': true,
- 'setFillColorN': true,
- 'setStrokeGray': true,
- 'setFillGray': true,
- 'setStrokeRGBColor': true,
- 'setFillRGBColor': true,
- 'setStrokeCMYKColor': true,
- 'setFillCMYKColor': true,
- 'paintJpegXObject': true,
- 'paintImageXObject': true,
- 'paintImageMaskXObject': true,
- 'shadingFill': true
- },
-
- beginDrawing: function CanvasGraphics_beginDrawing(viewport) {
- var transform = viewport.transform;
- this.ctx.save();
- this.ctx.transform.apply(this.ctx, transform);
-
- if (this.textLayer)
- this.textLayer.beginLayout();
- },
-
- executeOperatorList: function CanvasGraphics_executeOperatorList(
- operatorList,
- executionStartIdx, continueCallback,
- stepper) {
- var argsArray = operatorList.argsArray;
- var fnArray = operatorList.fnArray;
- var i = executionStartIdx || 0;
- var argsArrayLen = argsArray.length;
-
- // Sometimes the OperatorList to execute is empty.
- if (argsArrayLen == i) {
- return i;
- }
-
- var executionEndIdx;
- var endTime = Date.now() + kExecutionTime;
-
- var objs = this.objs;
- var fnName;
- var slowCommands = this.slowCommands;
-
- while (true) {
- if (stepper && i === stepper.nextBreakPoint) {
- stepper.breakIt(i, continueCallback);
- return i;
- }
-
- fnName = fnArray[i];
-
- if (fnName !== 'dependency') {
- this[fnName].apply(this, argsArray[i]);
- } else {
- var deps = argsArray[i];
- for (var n = 0, nn = deps.length; n < nn; n++) {
- var depObjId = deps[n];
-
- // If the promise isn't resolved yet, add the continueCallback
- // to the promise and bail out.
- if (!objs.isResolved(depObjId)) {
- objs.get(depObjId, continueCallback);
- return i;
- }
- }
- }
-
- i++;
-
- // If the entire operatorList was executed, stop as were done.
- if (i == argsArrayLen) {
- return i;
- }
-
- // If the execution took longer then a certain amount of time, shedule
- // to continue exeution after a short delay.
- // However, this is only possible if a 'continueCallback' is passed in.
- if (continueCallback && slowCommands[fnName] && Date.now() > endTime) {
- setTimeout(continueCallback, 0);
- return i;
- }
-
- // If the operatorList isn't executed completely yet OR the execution
- // time was short enough, do another execution round.
- }
- },
-
- endDrawing: function CanvasGraphics_endDrawing() {
- this.ctx.restore();
-
- if (this.textLayer)
- this.textLayer.endLayout();
- },
-
- // Graphics state
- setLineWidth: function CanvasGraphics_setLineWidth(width) {
- this.current.lineWidth = width;
- this.ctx.lineWidth = width;
- },
- setLineCap: function CanvasGraphics_setLineCap(style) {
- this.ctx.lineCap = LINE_CAP_STYLES[style];
- },
- setLineJoin: function CanvasGraphics_setLineJoin(style) {
- this.ctx.lineJoin = LINE_JOIN_STYLES[style];
- },
- setMiterLimit: function CanvasGraphics_setMiterLimit(limit) {
- this.ctx.miterLimit = limit;
- },
- setDash: function CanvasGraphics_setDash(dashArray, dashPhase) {
- this.ctx.mozDash = dashArray;
- this.ctx.mozDashOffset = dashPhase;
- this.ctx.webkitLineDash = dashArray;
- this.ctx.webkitLineDashOffset = dashPhase;
- },
- setRenderingIntent: function CanvasGraphics_setRenderingIntent(intent) {
- // Maybe if we one day fully support color spaces this will be important
- // for now we can ignore.
- // TODO set rendering intent?
- },
- setFlatness: function CanvasGraphics_setFlatness(flatness) {
- // There's no way to control this with canvas, but we can safely ignore.
- // TODO set flatness?
- },
- setGState: function CanvasGraphics_setGState(states) {
- for (var i = 0, ii = states.length; i < ii; i++) {
- var state = states[i];
- var key = state[0];
- var value = state[1];
-
- switch (key) {
- case 'LW':
- this.setLineWidth(value);
- break;
- case 'LC':
- this.setLineCap(value);
- break;
- case 'LJ':
- this.setLineJoin(value);
- break;
- case 'ML':
- this.setMiterLimit(value);
- break;
- case 'D':
- this.setDash(value[0], value[1]);
- break;
- case 'RI':
- this.setRenderingIntent(value);
- break;
- case 'FL':
- this.setFlatness(value);
- break;
- case 'Font':
- this.setFont(state[1], state[2]);
- break;
- case 'CA':
- this.current.strokeAlpha = state[1];
- break;
- case 'ca':
- this.current.fillAlpha = state[1];
- this.ctx.globalAlpha = state[1];
- break;
- }
- }
- },
- save: function CanvasGraphics_save() {
- this.ctx.save();
- var old = this.current;
- this.stateStack.push(old);
- this.current = old.clone();
- },
- restore: function CanvasGraphics_restore() {
- var prev = this.stateStack.pop();
- if (prev) {
- this.current = prev;
- this.ctx.restore();
- }
- },
- transform: function CanvasGraphics_transform(a, b, c, d, e, f) {
- this.ctx.transform(a, b, c, d, e, f);
- },
-
- // Path
- moveTo: function CanvasGraphics_moveTo(x, y) {
- this.ctx.moveTo(x, y);
- this.current.setCurrentPoint(x, y);
- },
- lineTo: function CanvasGraphics_lineTo(x, y) {
- this.ctx.lineTo(x, y);
- this.current.setCurrentPoint(x, y);
- },
- curveTo: function CanvasGraphics_curveTo(x1, y1, x2, y2, x3, y3) {
- this.ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3);
- this.current.setCurrentPoint(x3, y3);
- },
- curveTo2: function CanvasGraphics_curveTo2(x2, y2, x3, y3) {
- var current = this.current;
- this.ctx.bezierCurveTo(current.x, current.y, x2, y2, x3, y3);
- current.setCurrentPoint(x3, y3);
- },
- curveTo3: function CanvasGraphics_curveTo3(x1, y1, x3, y3) {
- this.curveTo(x1, y1, x3, y3, x3, y3);
- this.current.setCurrentPoint(x3, y3);
- },
- closePath: function CanvasGraphics_closePath() {
- this.ctx.closePath();
- },
- rectangle: function CanvasGraphics_rectangle(x, y, width, height) {
- this.ctx.rect(x, y, width, height);
- },
- stroke: function CanvasGraphics_stroke(consumePath) {
- consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
- var ctx = this.ctx;
- var strokeColor = this.current.strokeColor;
- if (this.current.lineWidth === 0)
- ctx.lineWidth = this.getSinglePixelWidth();
- // For stroke we want to temporarily change the global alpha to the
- // stroking alpha.
- ctx.globalAlpha = this.current.strokeAlpha;
- if (strokeColor && strokeColor.hasOwnProperty('type') &&
- strokeColor.type === 'Pattern') {
- // for patterns, we transform to pattern space, calculate
- // the pattern, call stroke, and restore to user space
- ctx.save();
- ctx.strokeStyle = strokeColor.getPattern(ctx);
- ctx.stroke();
- ctx.restore();
- } else {
- ctx.stroke();
- }
- if (consumePath)
- this.consumePath();
- // Restore the global alpha to the fill alpha
- ctx.globalAlpha = this.current.fillAlpha;
- },
- closeStroke: function CanvasGraphics_closeStroke() {
- this.closePath();
- this.stroke();
- },
- fill: function CanvasGraphics_fill(consumePath) {
- consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
- var ctx = this.ctx;
- var fillColor = this.current.fillColor;
-
- if (fillColor && fillColor.hasOwnProperty('type') &&
- fillColor.type === 'Pattern') {
- ctx.save();
- ctx.fillStyle = fillColor.getPattern(ctx);
- ctx.fill();
- ctx.restore();
- } else {
- ctx.fill();
- }
- if (consumePath)
- this.consumePath();
- },
- eoFill: function CanvasGraphics_eoFill() {
- var savedFillRule = this.setEOFillRule();
- this.fill();
- this.restoreFillRule(savedFillRule);
- },
- fillStroke: function CanvasGraphics_fillStroke() {
- this.fill(false);
- this.stroke(false);
-
- this.consumePath();
- },
- eoFillStroke: function CanvasGraphics_eoFillStroke() {
- var savedFillRule = this.setEOFillRule();
- this.fillStroke();
- this.restoreFillRule(savedFillRule);
- },
- closeFillStroke: function CanvasGraphics_closeFillStroke() {
- this.closePath();
- this.fillStroke();
- },
- closeEOFillStroke: function CanvasGraphics_closeEOFillStroke() {
- var savedFillRule = this.setEOFillRule();
- this.closePath();
- this.fillStroke();
- this.restoreFillRule(savedFillRule);
- },
- endPath: function CanvasGraphics_endPath() {
- this.consumePath();
- },
-
- // Clipping
- clip: function CanvasGraphics_clip() {
- this.pendingClip = NORMAL_CLIP;
- },
- eoClip: function CanvasGraphics_eoClip() {
- this.pendingClip = EO_CLIP;
- },
-
- // Text
- beginText: function CanvasGraphics_beginText() {
- this.current.textMatrix = IDENTITY_MATRIX;
- this.current.x = this.current.lineX = 0;
- this.current.y = this.current.lineY = 0;
- },
- endText: function CanvasGraphics_endText() {
- },
- setCharSpacing: function CanvasGraphics_setCharSpacing(spacing) {
- this.current.charSpacing = spacing;
- },
- setWordSpacing: function CanvasGraphics_setWordSpacing(spacing) {
- this.current.wordSpacing = spacing;
- },
- setHScale: function CanvasGraphics_setHScale(scale) {
- this.current.textHScale = scale / 100;
- },
- setLeading: function CanvasGraphics_setLeading(leading) {
- this.current.leading = -leading;
- },
- setFont: function CanvasGraphics_setFont(fontRefName, size) {
- var fontObj = this.objs.get(fontRefName);
- var current = this.current;
-
- if (!fontObj)
- error('Can\'t find font for ' + fontRefName);
-
- // Slice-clone matrix so we can manipulate it without affecting original
- if (fontObj.fontMatrix)
- current.fontMatrix = fontObj.fontMatrix.slice(0);
- else
- current.fontMatrix = IDENTITY_MATRIX.slice(0);
-
- // A valid matrix needs all main diagonal elements to be non-zero
- // This also ensures we bypass FF bugzilla bug #719844.
- if (current.fontMatrix[0] === 0 ||
- current.fontMatrix[3] === 0) {
- warn('Invalid font matrix for font ' + fontRefName);
- }
-
- // The spec for Tf (setFont) says that 'size' specifies the font 'scale',
- // and in some docs this can be negative (inverted x-y axes).
- // We implement this condition with fontMatrix.
- if (size < 0) {
- size = -size;
- current.fontMatrix[0] *= -1;
- current.fontMatrix[3] *= -1;
- }
-
- this.current.font = fontObj;
- this.current.fontSize = size;
-
- if (fontObj.coded)
- return; // we don't need ctx.font for Type3 fonts
-
- var name = fontObj.loadedName || 'sans-serif';
- var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') :
- (fontObj.bold ? 'bold' : 'normal');
-
- var italic = fontObj.italic ? 'italic' : 'normal';
- var typeface = '"' + name + '", ' + fontObj.fallbackName;
-
- // Some font backends cannot handle fonts below certain size.
- // Keeping the font at minimal size and using the fontSizeScale to change
- // the current transformation matrix before the fillText/strokeText.
- // See https://bugzilla.mozilla.org/show_bug.cgi?id=726227
- var browserFontSize = size >= MIN_FONT_SIZE ? size : MIN_FONT_SIZE;
- this.current.fontSizeScale = browserFontSize != MIN_FONT_SIZE ? 1.0 :
- size / MIN_FONT_SIZE;
-
- var rule = italic + ' ' + bold + ' ' + browserFontSize + 'px ' + typeface;
- this.ctx.font = rule;
- },
- setTextRenderingMode: function CanvasGraphics_setTextRenderingMode(mode) {
- if (mode >= TextRenderingMode.FILL_ADD_TO_PATH)
- TODO('unsupported text rendering mode: ' + mode);
- this.current.textRenderingMode = mode;
- },
- setTextRise: function CanvasGraphics_setTextRise(rise) {
- this.current.textRise = rise;
- },
- moveText: function CanvasGraphics_moveText(x, y) {
- this.current.x = this.current.lineX += x;
- this.current.y = this.current.lineY += y;
- },
- setLeadingMoveText: function CanvasGraphics_setLeadingMoveText(x, y) {
- this.setLeading(-y);
- this.moveText(x, y);
- },
- setTextMatrix: function CanvasGraphics_setTextMatrix(a, b, c, d, e, f) {
- this.current.textMatrix = [a, b, c, d, e, f];
-
- this.current.x = this.current.lineX = 0;
- this.current.y = this.current.lineY = 0;
- },
- nextLine: function CanvasGraphics_nextLine() {
- this.moveText(0, this.current.leading);
- },
- applyTextTransforms: function CanvasGraphics_applyTextTransforms() {
- var ctx = this.ctx;
- var current = this.current;
- var textHScale = current.textHScale;
- var fontMatrix = current.fontMatrix || IDENTITY_MATRIX;
-
- ctx.transform.apply(ctx, current.textMatrix);
- ctx.scale(1, -1);
- ctx.translate(current.x, -current.y - current.textRise);
- ctx.transform.apply(ctx, fontMatrix);
- ctx.scale(textHScale, 1);
- },
- getTextGeometry: function CanvasGraphics_getTextGeometry() {
- var geometry = {};
- var ctx = this.ctx;
- var font = this.current.font;
- var ctxMatrix = ctx.mozCurrentTransform;
- if (ctxMatrix) {
- var bl = Util.applyTransform([0, 0], ctxMatrix);
- var tr = Util.applyTransform([1, 1], ctxMatrix);
- geometry.x = bl[0];
- geometry.y = bl[1];
- geometry.hScale = tr[0] - bl[0];
- geometry.vScale = tr[1] - bl[1];
- }
- geometry.spaceWidth = font.spaceWidth;
- return geometry;
- },
-
- showText: function CanvasGraphics_showText(str, skipTextSelection) {
- var ctx = this.ctx;
- var current = this.current;
- var font = current.font;
- var glyphs = font.charsToGlyphs(str);
- var fontSize = current.fontSize;
- var fontSizeScale = current.fontSizeScale;
- var charSpacing = current.charSpacing;
- var wordSpacing = current.wordSpacing;
- var textHScale = current.textHScale;
- var fontMatrix = current.fontMatrix || IDENTITY_MATRIX;
- var textHScale2 = textHScale * fontMatrix[0];
- var glyphsLength = glyphs.length;
- var textLayer = this.textLayer;
- var geom;
- var textSelection = textLayer && !skipTextSelection ? true : false;
- var textRenderingMode = current.textRenderingMode;
- var canvasWidth = 0.0;
-
- // Type3 fonts - each glyph is a "mini-PDF"
- if (font.coded) {
- ctx.save();
- ctx.transform.apply(ctx, current.textMatrix);
- ctx.translate(current.x, current.y);
-
- ctx.scale(textHScale, 1);
-
- if (textSelection) {
- this.save();
- ctx.scale(1, -1);
- geom = this.getTextGeometry();
- this.restore();
- }
- for (var i = 0; i < glyphsLength; ++i) {
-
- var glyph = glyphs[i];
- if (glyph === null) {
- // word break
- this.ctx.translate(wordSpacing, 0);
- current.x += wordSpacing * textHScale;
- continue;
- }
-
- this.save();
- ctx.scale(fontSize, fontSize);
- ctx.transform.apply(ctx, fontMatrix);
- this.executeOperatorList(glyph.operatorList);
- this.restore();
-
- var transformed = Util.applyTransform([glyph.width, 0], fontMatrix);
- var width = transformed[0] * fontSize +
- Util.sign(current.fontMatrix[0]) * charSpacing;
-
- ctx.translate(width, 0);
- current.x += width * textHScale;
-
- canvasWidth += width;
- }
- ctx.restore();
- } else {
- ctx.save();
- this.applyTextTransforms();
-
- var lineWidth = current.lineWidth;
- var scale = Math.abs(current.textMatrix[0] * fontMatrix[0]);
- if (scale == 0 || lineWidth == 0)
- lineWidth = this.getSinglePixelWidth();
- else
- lineWidth /= scale;
-
- if (textSelection)
- geom = this.getTextGeometry();
-
- if (fontSizeScale != 1.0) {
- ctx.scale(fontSizeScale, fontSizeScale);
- lineWidth /= fontSizeScale;
- }
-
- ctx.lineWidth = lineWidth;
-
- var x = 0;
- for (var i = 0; i < glyphsLength; ++i) {
- var glyph = glyphs[i];
- if (glyph === null) {
- // word break
- x += Util.sign(current.fontMatrix[0]) * wordSpacing;
- continue;
- }
-
- var character = glyph.fontChar;
- var charWidth = glyph.width * fontSize * 0.001 +
- Util.sign(current.fontMatrix[0]) * charSpacing;
-
- if (!glyph.disabled) {
- var scaledX = x / fontSizeScale;
- switch (textRenderingMode) {
- default: // other unsupported rendering modes
- case TextRenderingMode.FILL:
- case TextRenderingMode.FILL_ADD_TO_PATH:
- ctx.fillText(character, scaledX, 0);
- break;
- case TextRenderingMode.STROKE:
- case TextRenderingMode.STROKE_ADD_TO_PATH:
- ctx.strokeText(character, scaledX, 0);
- break;
- case TextRenderingMode.FILL_STROKE:
- case TextRenderingMode.FILL_STROKE_ADD_TO_PATH:
- ctx.fillText(character, scaledX, 0);
- ctx.strokeText(character, scaledX, 0);
- break;
- case TextRenderingMode.INVISIBLE:
- break;
- }
- }
-
- x += charWidth;
-
- var glyphUnicode = glyph.unicode === ' ' ? '\u00A0' : glyph.unicode;
- if (glyphUnicode in NormalizedUnicodes)
- glyphUnicode = NormalizedUnicodes[glyphUnicode];
-
- canvasWidth += charWidth;
- }
- current.x += x * textHScale2;
- ctx.restore();
- }
-
- if (textSelection) {
- geom.canvasWidth = canvasWidth;
- this.textLayer.appendText(font.fallbackName, fontSize, geom);
- }
-
- return canvasWidth;
- },
- showSpacedText: function CanvasGraphics_showSpacedText(arr) {
- var ctx = this.ctx;
- var current = this.current;
- var font = current.font;
- var fontSize = current.fontSize;
- var textHScale = current.textHScale;
- if (!font.coded)
- textHScale *= (current.fontMatrix || IDENTITY_MATRIX)[0];
- var arrLength = arr.length;
- var textLayer = this.textLayer;
- var geom;
- var canvasWidth = 0.0;
- var textSelection = textLayer ? true : false;
-
- if (textSelection) {
- ctx.save();
- // Type3 fonts - each glyph is a "mini-PDF" (see also showText)
- if (font.coded) {
- ctx.transform.apply(ctx, current.textMatrix);
- ctx.scale(1, -1);
- ctx.translate(current.x, -1 * current.y);
- ctx.scale(textHScale, 1);
- } else
- this.applyTextTransforms();
- geom = this.getTextGeometry();
- ctx.restore();
- }
-
- for (var i = 0; i < arrLength; ++i) {
- var e = arr[i];
- if (isNum(e)) {
- var spacingLength = -e * 0.001 * fontSize * textHScale;
- current.x += spacingLength;
-
- if (textSelection)
- canvasWidth += spacingLength;
- } else if (isString(e)) {
- var shownCanvasWidth = this.showText(e, true);
-
- if (textSelection)
- canvasWidth += shownCanvasWidth;
- } else {
- error('TJ array element ' + e + ' is not string or num');
- }
- }
-
- if (textSelection) {
- geom.canvasWidth = canvasWidth;
- this.textLayer.appendText(font.fallbackName, fontSize, geom);
- }
- },
- nextLineShowText: function CanvasGraphics_nextLineShowText(text) {
- this.nextLine();
- this.showText(text);
- },
- nextLineSetSpacingShowText:
- function CanvasGraphics_nextLineSetSpacingShowText(wordSpacing,
- charSpacing,
- text) {
- this.setWordSpacing(wordSpacing);
- this.setCharSpacing(charSpacing);
- this.nextLineShowText(text);
- },
-
- // Type3 fonts
- setCharWidth: function CanvasGraphics_setCharWidth(xWidth, yWidth) {
- // We can safely ignore this since the width should be the same
- // as the width in the Widths array.
- },
- setCharWidthAndBounds: function CanvasGraphics_setCharWidthAndBounds(xWidth,
- yWidth,
- llx,
- lly,
- urx,
- ury) {
- // TODO According to the spec we're also suppose to ignore any operators
- // that set color or include images while processing this type3 font.
- this.rectangle(llx, lly, urx - llx, ury - lly);
- this.clip();
- this.endPath();
- },
-
- // Color
- setStrokeColorSpace: function CanvasGraphics_setStrokeColorSpace(raw) {
- this.current.strokeColorSpace = ColorSpace.fromIR(raw);
- },
- setFillColorSpace: function CanvasGraphics_setFillColorSpace(raw) {
- this.current.fillColorSpace = ColorSpace.fromIR(raw);
- },
- setStrokeColor: function CanvasGraphics_setStrokeColor(/*...*/) {
- var cs = this.current.strokeColorSpace;
- var rgbColor = cs.getRgb(arguments);
- var color = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);
- this.ctx.strokeStyle = color;
- this.current.strokeColor = color;
- },
- getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR, cs) {
- if (IR[0] == 'TilingPattern') {
- var args = IR[1];
- var base = cs.base;
- var color;
- if (base) {
- var baseComps = base.numComps;
-
- color = [];
- for (var i = 0; i < baseComps; ++i)
- color.push(args[i]);
-
- color = base.getRgb(color);
- }
- var pattern = new TilingPattern(IR, color, this.ctx, this.objs);
- } else if (IR[0] == 'RadialAxial' || IR[0] == 'Dummy') {
- var pattern = Pattern.shadingFromIR(IR);
- } else {
- error('Unkown IR type ' + IR[0]);
- }
- return pattern;
- },
- setStrokeColorN: function CanvasGraphics_setStrokeColorN(/*...*/) {
- var cs = this.current.strokeColorSpace;
-
- if (cs.name == 'Pattern') {
- this.current.strokeColor = this.getColorN_Pattern(arguments, cs);
- } else {
- this.setStrokeColor.apply(this, arguments);
- }
- },
- setFillColor: function CanvasGraphics_setFillColor(/*...*/) {
- var cs = this.current.fillColorSpace;
- var rgbColor = cs.getRgb(arguments);
- var color = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);
- this.ctx.fillStyle = color;
- this.current.fillColor = color;
- },
- setFillColorN: function CanvasGraphics_setFillColorN(/*...*/) {
- var cs = this.current.fillColorSpace;
-
- if (cs.name == 'Pattern') {
- this.current.fillColor = this.getColorN_Pattern(arguments, cs);
- } else {
- this.setFillColor.apply(this, arguments);
- }
- },
- setStrokeGray: function CanvasGraphics_setStrokeGray(gray) {
- if (!(this.current.strokeColorSpace instanceof DeviceGrayCS))
- this.current.strokeColorSpace = new DeviceGrayCS();
-
- var color = Util.makeCssRgb(gray, gray, gray);
- this.ctx.strokeStyle = color;
- this.current.strokeColor = color;
- },
- setFillGray: function CanvasGraphics_setFillGray(gray) {
- if (!(this.current.fillColorSpace instanceof DeviceGrayCS))
- this.current.fillColorSpace = new DeviceGrayCS();
-
- var color = Util.makeCssRgb(gray, gray, gray);
- this.ctx.fillStyle = color;
- this.current.fillColor = color;
- },
- setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) {
- if (!(this.current.strokeColorSpace instanceof DeviceRgbCS))
- this.current.strokeColorSpace = new DeviceRgbCS();
-
- var color = Util.makeCssRgb(r, g, b);
- this.ctx.strokeStyle = color;
- this.current.strokeColor = color;
- },
- setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) {
- if (!(this.current.fillColorSpace instanceof DeviceRgbCS))
- this.current.fillColorSpace = new DeviceRgbCS();
-
- var color = Util.makeCssRgb(r, g, b);
- this.ctx.fillStyle = color;
- this.current.fillColor = color;
- },
- setStrokeCMYKColor: function CanvasGraphics_setStrokeCMYKColor(c, m, y, k) {
- if (!(this.current.strokeColorSpace instanceof DeviceCmykCS))
- this.current.strokeColorSpace = new DeviceCmykCS();
-
- var color = Util.makeCssCmyk(c, m, y, k);
- this.ctx.strokeStyle = color;
- this.current.strokeColor = color;
- },
- setFillCMYKColor: function CanvasGraphics_setFillCMYKColor(c, m, y, k) {
- if (!(this.current.fillColorSpace instanceof DeviceCmykCS))
- this.current.fillColorSpace = new DeviceCmykCS();
-
- var color = Util.makeCssCmyk(c, m, y, k);
- this.ctx.fillStyle = color;
- this.current.fillColor = color;
- },
-
- shadingFill: function CanvasGraphics_shadingFill(patternIR) {
- var ctx = this.ctx;
-
- this.save();
- var pattern = Pattern.shadingFromIR(patternIR);
- ctx.fillStyle = pattern.getPattern(ctx);
-
- var inv = ctx.mozCurrentTransformInverse;
- if (inv) {
- var canvas = ctx.canvas;
- var width = canvas.width;
- var height = canvas.height;
-
- var bl = Util.applyTransform([0, 0], inv);
- var br = Util.applyTransform([0, height], inv);
- var ul = Util.applyTransform([width, 0], inv);
- var ur = Util.applyTransform([width, height], inv);
-
- var x0 = Math.min(bl[0], br[0], ul[0], ur[0]);
- var y0 = Math.min(bl[1], br[1], ul[1], ur[1]);
- var x1 = Math.max(bl[0], br[0], ul[0], ur[0]);
- var y1 = Math.max(bl[1], br[1], ul[1], ur[1]);
-
- this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);
- } else {
- // HACK to draw the gradient onto an infinite rectangle.
- // PDF gradients are drawn across the entire image while
- // Canvas only allows gradients to be drawn in a rectangle
- // The following bug should allow us to remove this.
- // https://bugzilla.mozilla.org/show_bug.cgi?id=664884
-
- this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);
- }
-
- this.restore();
- },
-
- // Images
- beginInlineImage: function CanvasGraphics_beginInlineImage() {
- error('Should not call beginInlineImage');
- },
- beginImageData: function CanvasGraphics_beginImageData() {
- error('Should not call beginImageData');
- },
-
- paintFormXObjectBegin: function CanvasGraphics_paintFormXObjectBegin(matrix,
- bbox) {
- this.save();
-
- if (matrix && isArray(matrix) && 6 == matrix.length)
- this.transform.apply(this, matrix);
-
- if (bbox && isArray(bbox) && 4 == bbox.length) {
- var width = bbox[2] - bbox[0];
- var height = bbox[3] - bbox[1];
- this.rectangle(bbox[0], bbox[1], width, height);
- this.clip();
- this.endPath();
- }
- },
-
- paintFormXObjectEnd: function CanvasGraphics_paintFormXObjectEnd() {
- this.restore();
- },
-
- paintJpegXObject: function CanvasGraphics_paintJpegXObject(objId, w, h) {
- var domImage = this.objs.get(objId);
- if (!domImage) {
- error('Dependent image isn\'t ready yet');
- }
-
- this.save();
-
- var ctx = this.ctx;
- // scale the image to the unit square
- ctx.scale(1 / w, -1 / h);
-
- ctx.drawImage(domImage, 0, 0, domImage.width, domImage.height,
- 0, -h, w, h);
-
- this.restore();
- },
-
- paintImageMaskXObject: function CanvasGraphics_paintImageMaskXObject(
- imgArray, inverseDecode, width, height) {
- function applyStencilMask(buffer, inverseDecode) {
- var imgArrayPos = 0;
- var i, j, mask, buf;
- // removing making non-masked pixels transparent
- var bufferPos = 3; // alpha component offset
- for (i = 0; i < height; i++) {
- mask = 0;
- for (j = 0; j < width; j++) {
- if (!mask) {
- buf = imgArray[imgArrayPos++];
- mask = 128;
- }
- if (!(buf & mask) == inverseDecode) {
- buffer[bufferPos] = 0;
- }
- bufferPos += 4;
- mask >>= 1;
- }
- }
- }
- function rescaleImage(pixels, widthScale, heightScale) {
- var scaledWidth = Math.ceil(width / widthScale);
- var scaledHeight = Math.ceil(height / heightScale);
-
- var itemsSum = new Uint32Array(scaledWidth * scaledHeight * 4);
- var itemsCount = new Uint32Array(scaledWidth * scaledHeight);
- for (var i = 0, position = 0; i < height; i++) {
- var lineOffset = (0 | (i / heightScale)) * scaledWidth;
- for (var j = 0; j < width; j++) {
- var countOffset = lineOffset + (0 | (j / widthScale));
- var sumOffset = countOffset << 2;
- itemsSum[sumOffset] += pixels[position];
- itemsSum[sumOffset + 1] += pixels[position + 1];
- itemsSum[sumOffset + 2] += pixels[position + 2];
- itemsSum[sumOffset + 3] += pixels[position + 3];
- itemsCount[countOffset]++;
- position += 4;
- }
- }
- var tmpCanvas = createScratchCanvas(scaledWidth, scaledHeight);
- var tmpCtx = tmpCanvas.getContext('2d');
- var imgData = tmpCtx.getImageData(0, 0, scaledWidth, scaledHeight);
- pixels = imgData.data;
- for (var i = 0, j = 0, ii = scaledWidth * scaledHeight; i < ii; i++) {
- var count = itemsCount[i];
- pixels[j] = itemsSum[j] / count;
- pixels[j + 1] = itemsSum[j + 1] / count;
- pixels[j + 2] = itemsSum[j + 2] / count;
- pixels[j + 3] = itemsSum[j + 3] / count;
- j += 4;
- }
- tmpCtx.putImageData(imgData, 0, 0);
- return tmpCanvas;
- }
-
- this.save();
-
- var ctx = this.ctx;
- var w = width, h = height;
- // scale the image to the unit square
- ctx.scale(1 / w, -1 / h);
-
- var tmpCanvas = createScratchCanvas(w, h);
- var tmpCtx = tmpCanvas.getContext('2d');
-
- var fillColor = this.current.fillColor;
- tmpCtx.fillStyle = (fillColor && fillColor.hasOwnProperty('type') &&
- fillColor.type === 'Pattern') ?
- fillColor.getPattern(tmpCtx) : fillColor;
- tmpCtx.fillRect(0, 0, w, h);
-
- var imgData = tmpCtx.getImageData(0, 0, w, h);
- var pixels = imgData.data;
-
- applyStencilMask(pixels, inverseDecode);
-
- var currentTransform = ctx.mozCurrentTransformInverse;
- var widthScale = Math.max(Math.abs(currentTransform[0]), 1);
- var heightScale = Math.max(Math.abs(currentTransform[3]), 1);
- if (widthScale >= 2 || heightScale >= 2) {
- // canvas does not resize well large images to small -- using simple
- // algorithm to perform pre-scaling
- tmpCanvas = rescaleImage(imgData.data, widthScale, heightScale);
- ctx.scale(widthScale, heightScale);
- ctx.drawImage(tmpCanvas, 0, -h / heightScale);
- } else {
- tmpCtx.putImageData(imgData, 0, 0);
- ctx.drawImage(tmpCanvas, 0, -h);
- }
- this.restore();
- },
-
- paintImageXObject: function CanvasGraphics_paintImageXObject(objId) {
- var imgData = this.objs.get(objId);
- if (!imgData)
- error('Dependent image isn\'t ready yet');
-
- this.save();
- var ctx = this.ctx;
- var w = imgData.width;
- var h = imgData.height;
- // scale the image to the unit square
- ctx.scale(1 / w, -1 / h);
-
- var tmpCanvas = createScratchCanvas(w, h);
- var tmpCtx = tmpCanvas.getContext('2d');
- this.putBinaryImageData(tmpCtx, imgData, w, h);
-
- ctx.drawImage(tmpCanvas, 0, -h);
- this.restore();
- },
-
- putBinaryImageData: function CanvasGraphics_putBinaryImageData() {
- //
- },
-
- // Marked content
-
- markPoint: function CanvasGraphics_markPoint(tag) {
- // TODO Marked content.
- },
- markPointProps: function CanvasGraphics_markPointProps(tag, properties) {
- // TODO Marked content.
- },
- beginMarkedContent: function CanvasGraphics_beginMarkedContent(tag) {
- // TODO Marked content.
- },
- beginMarkedContentProps: function CanvasGraphics_beginMarkedContentProps(
- tag, properties) {
- // TODO Marked content.
- },
- endMarkedContent: function CanvasGraphics_endMarkedContent() {
- // TODO Marked content.
- },
-
- // Compatibility
-
- beginCompat: function CanvasGraphics_beginCompat() {
- TODO('ignore undefined operators (should we do that anyway?)');
- },
- endCompat: function CanvasGraphics_endCompat() {
- TODO('stop ignoring undefined operators');
- },
-
- // Helper functions
-
- consumePath: function CanvasGraphics_consumePath() {
- if (this.pendingClip) {
- var savedFillRule = null;
- if (this.pendingClip == EO_CLIP)
- savedFillRule = this.setEOFillRule();
-
- this.ctx.clip();
-
- this.pendingClip = null;
- if (savedFillRule !== null)
- this.restoreFillRule(savedFillRule);
- }
- this.ctx.beginPath();
- },
- // We generally keep the canvas context set for
- // nonzero-winding, and just set evenodd for the operations
- // that need them.
- setEOFillRule: function CanvasGraphics_setEOFillRule() {
- var savedFillRule = this.ctx.mozFillRule;
- this.ctx.mozFillRule = 'evenodd';
- return savedFillRule;
- },
- restoreFillRule: function CanvasGraphics_restoreFillRule(rule) {
- this.ctx.mozFillRule = rule;
- },
- getSinglePixelWidth: function CanvasGraphics_getSinglePixelWidth(scale) {
- var inverse = this.ctx.mozCurrentTransformInverse;
- return Math.abs(inverse[0] + inverse[2]);
- }
- };
-
- return CanvasGraphics;
-})();
-
-function checkPutBinaryImageDataCompatibility() {
- // Feature detection if the browser can use an Uint8Array directly as imgData.
- var canvas = document.createElement('canvas');
- canvas.width = 1;
- canvas.height = 1;
- var ctx = canvas.getContext('2d');
-
- try {
- ctx.putImageData({
- width: 1,
- height: 1,
- data: new Uint8Array(4)
- }, 0, 0);
-
- CanvasGraphics.prototype.putBinaryImageData =
- function CanvasGraphicsPutBinaryImageDataNative(ctx, imgData) {
- ctx.putImageData(imgData, 0, 0);
- };
- } catch (e) {
- CanvasGraphics.prototype.putBinaryImageData =
- function CanvasGraphicsPutBinaryImageDataShim(ctx, imgData, w, h) {
- var tmpImgData = 'createImageData' in ctx ? ctx.createImageData(w, h) :
- ctx.getImageData(0, 0, w, h);
-
- var tmpImgDataPixels = tmpImgData.data;
- var data = imgData.data;
- if ('set' in tmpImgDataPixels)
- tmpImgDataPixels.set(data);
- else {
- // Copy over the imageData pixel by pixel.
- for (var i = 0, ii = tmpImgDataPixels.length; i < ii; i++)
- tmpImgDataPixels[i] = data[i];
- }
-
- ctx.putImageData(tmpImgData, 0, 0);
- };
- }
-}
-if (!isWorker) {
- checkPutBinaryImageDataCompatibility();
-}
-
-
-var Name = (function NameClosure() {
- function Name(name) {
- this.name = name;
- }
-
- Name.prototype = {};
-
- return Name;
-})();
-
-var Cmd = (function CmdClosure() {
- function Cmd(cmd) {
- this.cmd = cmd;
- }
-
- Cmd.prototype = {};
-
- var cmdCache = {};
-
- Cmd.get = function Cmd_get(cmd) {
- var cmdValue = cmdCache[cmd];
- if (cmdValue)
- return cmdValue;
-
- return cmdCache[cmd] = new Cmd(cmd);
- };
-
- return Cmd;
-})();
-
-var Dict = (function DictClosure() {
- // xref is optional
- function Dict(xref) {
- // Map should only be used internally, use functions below to access.
- var map = Object.create(null);
-
- this.assignXref = function Dict_assignXref(newXref) {
- xref = newXref;
- };
-
- // automatically dereferences Ref objects
- this.get = function Dict_get(key1, key2, key3) {
- var value;
- if (typeof (value = map[key1]) != 'undefined' || key1 in map ||
- typeof key2 == 'undefined') {
- return xref ? xref.fetchIfRef(value) : value;
- }
- if (typeof (value = map[key2]) != 'undefined' || key2 in map ||
- typeof key3 == 'undefined') {
- return xref ? xref.fetchIfRef(value) : value;
- }
- value = map[key3] || null;
- return xref ? xref.fetchIfRef(value) : value;
- };
-
- // no dereferencing
- this.getRaw = function Dict_getRaw(key) {
- return map[key];
- };
-
- // creates new map and dereferences all Refs
- this.getAll = function Dict_getAll() {
- var all = {};
- for (var key in map) {
- var obj = this.get(key);
- all[key] = obj instanceof Dict ? obj.getAll() : obj;
- }
- return all;
- };
-
- this.set = function Dict_set(key, value) {
- map[key] = value;
- };
-
- this.has = function Dict_has(key) {
- return key in map;
- };
-
- this.forEach = function Dict_forEach(callback) {
- for (var key in map) {
- callback(key, this.get(key));
- }
- };
- };
-
- return Dict;
-})();
-
-var Ref = (function RefClosure() {
- function Ref(num, gen) {
- this.num = num;
- this.gen = gen;
- }
-
- Ref.prototype = {};
-
- return Ref;
-})();
-
-// The reference is identified by number and generation,
-// this structure stores only one instance of the reference.
-var RefSet = (function RefSetClosure() {
- function RefSet() {
- this.dict = {};
- }
-
- RefSet.prototype = {
- has: function RefSet_has(ref) {
- return !!this.dict['R' + ref.num + '.' + ref.gen];
- },
-
- put: function RefSet_put(ref) {
- this.dict['R' + ref.num + '.' + ref.gen] = ref;
- }
- };
-
- return RefSet;
-})();
-
-var Catalog = (function CatalogClosure() {
- function Catalog(xref) {
- this.xref = xref;
- var obj = xref.getCatalogObj();
- assertWellFormed(isDict(obj), 'catalog object is not a dictionary');
- this.catDict = obj;
- }
-
- Catalog.prototype = {
- get metadata() {
- var streamRef = this.catDict.getRaw('Metadata');
- if (!isRef(streamRef))
- return shadow(this, 'metadata', null);
-
- var encryptMetadata = !this.xref.encrypt ? false :
- this.xref.encrypt.encryptMetadata;
-
- var stream = this.xref.fetch(streamRef, !encryptMetadata);
- var metadata;
- if (stream && isDict(stream.dict)) {
- var type = stream.dict.get('Type');
- var subtype = stream.dict.get('Subtype');
-
- if (isName(type) && isName(subtype) &&
- type.name === 'Metadata' && subtype.name === 'XML') {
- // XXX: This should examine the charset the XML document defines,
- // however since there are currently no real means to decode
- // arbitrary charsets, let's just hope that the author of the PDF
- // was reasonable enough to stick with the XML default charset,
- // which is UTF-8.
- try {
- metadata = stringToUTF8String(bytesToString(stream.getBytes()));
- } catch (e) {
- info('Skipping invalid metadata.');
- }
- }
- }
-
- return shadow(this, 'metadata', metadata);
- },
- get toplevelPagesDict() {
- var pagesObj = this.catDict.get('Pages');
- assertWellFormed(isDict(pagesObj), 'invalid top-level pages dictionary');
- // shadow the prototype getter
- return shadow(this, 'toplevelPagesDict', pagesObj);
- },
- get documentOutline() {
- var xref = this.xref;
- var obj = this.catDict.get('Outlines');
- var root = { items: [] };
- if (isDict(obj)) {
- obj = obj.getRaw('First');
- var processed = new RefSet();
- if (isRef(obj)) {
- var queue = [{obj: obj, parent: root}];
- // to avoid recursion keeping track of the items
- // in the processed dictionary
- processed.put(obj);
- while (queue.length > 0) {
- var i = queue.shift();
- var outlineDict = xref.fetchIfRef(i.obj);
- if (outlineDict === null)
- continue;
- if (!outlineDict.has('Title'))
- error('Invalid outline item');
- var dest = outlineDict.get('A');
- if (dest)
- dest = dest.get('D');
- else if (outlineDict.has('Dest')) {
- dest = outlineDict.getRaw('Dest');
- if (isName(dest))
- dest = dest.name;
- }
- var title = outlineDict.get('Title');
- var outlineItem = {
- dest: dest,
- title: stringToPDFString(title),
- color: outlineDict.get('C') || [0, 0, 0],
- count: outlineDict.get('Count'),
- bold: !!(outlineDict.get('F') & 2),
- italic: !!(outlineDict.get('F') & 1),
- items: []
- };
- i.parent.items.push(outlineItem);
- obj = outlineDict.getRaw('First');
- if (isRef(obj) && !processed.has(obj)) {
- queue.push({obj: obj, parent: outlineItem});
- processed.put(obj);
- }
- obj = outlineDict.getRaw('Next');
- if (isRef(obj) && !processed.has(obj)) {
- queue.push({obj: obj, parent: i.parent});
- processed.put(obj);
- }
- }
- }
- }
- obj = root.items.length > 0 ? root.items : null;
- return shadow(this, 'documentOutline', obj);
- },
- get numPages() {
- var obj = this.toplevelPagesDict.get('Count');
- assertWellFormed(
- isInt(obj),
- 'page count in top level pages object is not an integer'
- );
- // shadow the prototype getter
- return shadow(this, 'num', obj);
- },
- traverseKids: function Catalog_traverseKids(pagesDict) {
- var pageCache = this.pageCache;
- var kids = pagesDict.get('Kids');
- assertWellFormed(isArray(kids),
- 'page dictionary kids object is not an array');
- for (var i = 0, ii = kids.length; i < ii; ++i) {
- var kid = kids[i];
- assertWellFormed(isRef(kid),
- 'page dictionary kid is not a reference');
- var obj = this.xref.fetch(kid);
- if (isDict(obj, 'Page') || (isDict(obj) && !obj.has('Kids'))) {
- pageCache.push(new Page(this.xref, pageCache.length, obj, kid));
- } else { // must be a child page dictionary
- assertWellFormed(
- isDict(obj),
- 'page dictionary kid reference points to wrong type of object'
- );
- this.traverseKids(obj);
- }
- }
- },
- get destinations() {
- function fetchDestination(dest) {
- return isDict(dest) ? dest.get('D') : dest;
- }
-
- var xref = this.xref;
- var dests = {}, nameTreeRef, nameDictionaryRef;
- var obj = this.catDict.get('Names');
- if (obj)
- nameTreeRef = obj.getRaw('Dests');
- else if (this.catDict.has('Dests'))
- nameDictionaryRef = this.catDict.get('Dests');
-
- if (nameDictionaryRef) {
- // reading simple destination dictionary
- obj = nameDictionaryRef;
- obj.forEach(function catalogForEach(key, value) {
- if (!value) return;
- dests[key] = fetchDestination(value);
- });
- }
- if (nameTreeRef) {
- // reading name tree
- var processed = new RefSet();
- processed.put(nameTreeRef);
- var queue = [nameTreeRef];
- while (queue.length > 0) {
- var i, n;
- obj = xref.fetch(queue.shift());
- if (obj.has('Kids')) {
- var kids = obj.get('Kids');
- for (i = 0, n = kids.length; i < n; i++) {
- var kid = kids[i];
- if (processed.has(kid))
- error('invalid destinations');
- queue.push(kid);
- processed.put(kid);
- }
- continue;
- }
- var names = obj.get('Names');
- for (i = 0, n = names.length; i < n; i += 2) {
- dests[names[i]] = fetchDestination(xref.fetchIfRef(names[i + 1]));
- }
- }
- }
- return shadow(this, 'destinations', dests);
- },
- getPage: function Catalog_getPage(n) {
- var pageCache = this.pageCache;
- if (!pageCache) {
- pageCache = this.pageCache = [];
- this.traverseKids(this.toplevelPagesDict);
- }
- return this.pageCache[n - 1];
- }
- };
-
- return Catalog;
-})();
-
-var XRef = (function XRefClosure() {
- function XRef(stream, startXRef, mainXRefEntriesOffset, password) {
- this.stream = stream;
- this.entries = [];
- this.xrefstms = {};
- var trailerDict = this.readXRef(startXRef);
- trailerDict.assignXref(this);
- this.trailer = trailerDict;
- // prepare the XRef cache
- this.cache = [];
-
- var encrypt = trailerDict.get('Encrypt');
- if (encrypt) {
- var fileId = trailerDict.get('ID');
- this.encrypt = new CipherTransformFactory(encrypt, fileId[0], password);
- }
-
- // get the root dictionary (catalog) object
- if (!(this.root = trailerDict.get('Root')))
- error('Invalid root reference');
- }
-
- XRef.prototype = {
- readXRefTable: function XRef_readXRefTable(parser) {
- // Example of cross-reference table:
- // xref
- // 0 1 <-- subsection header (first obj #, obj count)
- // 0000000000 65535 f <-- actual object (offset, generation #, f/n)
- // 23 2 <-- subsection header ... and so on ...
- // 0000025518 00002 n
- // 0000025635 00000 n
- // trailer
- // ...
-
- // Outer loop is over subsection headers
- var obj;
- while (!isCmd(obj = parser.getObj(), 'trailer')) {
- var first = obj,
- count = parser.getObj();
-
- if (!isInt(first) || !isInt(count))
- error('Invalid XRef table: wrong types in subsection header');
-
- // Inner loop is over objects themselves
- for (var i = 0; i < count; i++) {
- var entry = {};
- entry.offset = parser.getObj();
- entry.gen = parser.getObj();
- var type = parser.getObj();
-
- if (isCmd(type, 'f'))
- entry.free = true;
- else if (isCmd(type, 'n'))
- entry.uncompressed = true;
-
- // Validate entry obj
- if (!isInt(entry.offset) || !isInt(entry.gen) ||
- !(entry.free || entry.uncompressed)) {
- error('Invalid entry in XRef subsection: ' + first + ', ' + count);
- }
-
- if (!this.entries[i + first])
- this.entries[i + first] = entry;
- }
- }
-
- // Sanity check: as per spec, first object must be free
- if (this.entries[0] && !this.entries[0].free)
- error('Invalid XRef table: unexpected first object');
-
- // Sanity check
- if (!isCmd(obj, 'trailer'))
- error('Invalid XRef table: could not find trailer dictionary');
-
- // Read trailer dictionary, e.g.
- // trailer
- // << /Size 22
- // /Root 20R
- // /Info 10R
- // /ID [ <81b14aafa313db63dbd6f981e49f94f4> ]
- // >>
- // The parser goes through the entire stream << ... >> and provides
- // a getter interface for the key-value table
- var dict = parser.getObj();
- if (!isDict(dict))
- error('Invalid XRef table: could not parse trailer dictionary');
-
- return dict;
- },
- readXRefStream: function XRef_readXRefStream(stream) {
- var streamParameters = stream.parameters;
- var byteWidths = streamParameters.get('W');
- var range = streamParameters.get('Index');
- if (!range)
- range = [0, streamParameters.get('Size')];
- var i, j;
- while (range.length > 0) {
- var first = range[0], n = range[1];
- if (!isInt(first) || !isInt(n))
- error('Invalid XRef range fields: ' + first + ', ' + n);
- var typeFieldWidth = byteWidths[0];
- var offsetFieldWidth = byteWidths[1];
- var generationFieldWidth = byteWidths[2];
- if (!isInt(typeFieldWidth) || !isInt(offsetFieldWidth) ||
- !isInt(generationFieldWidth)) {
- error('Invalid XRef entry fields length: ' + first + ', ' + n);
- }
- for (i = 0; i < n; ++i) {
- var type = 0, offset = 0, generation = 0;
- for (j = 0; j < typeFieldWidth; ++j)
- type = (type << 8) | stream.getByte();
- // if type field is absent, its default value = 1
- if (typeFieldWidth == 0)
- type = 1;
- for (j = 0; j < offsetFieldWidth; ++j)
- offset = (offset << 8) | stream.getByte();
- for (j = 0; j < generationFieldWidth; ++j)
- generation = (generation << 8) | stream.getByte();
- var entry = {};
- entry.offset = offset;
- entry.gen = generation;
- switch (type) {
- case 0:
- entry.free = true;
- break;
- case 1:
- entry.uncompressed = true;
- break;
- case 2:
- break;
- default:
- error('Invalid XRef entry type: ' + type);
- }
- if (!this.entries[first + i])
- this.entries[first + i] = entry;
- }
- range.splice(0, 2);
- }
- return streamParameters;
- },
- indexObjects: function XRef_indexObjects() {
- // Simple scan through the PDF content to find objects,
- // trailers and XRef streams.
- function readToken(data, offset) {
- var token = '', ch = data[offset];
- while (ch !== 13 && ch !== 10) {
- if (++offset >= data.length)
- break;
- token += String.fromCharCode(ch);
- ch = data[offset];
- }
- return token;
- }
- function skipUntil(data, offset, what) {
- var length = what.length, dataLength = data.length;
- var skipped = 0;
- // finding byte sequence
- while (offset < dataLength) {
- var i = 0;
- while (i < length && data[offset + i] == what[i])
- ++i;
- if (i >= length)
- break; // sequence found
-
- offset++;
- skipped++;
- }
- return skipped;
- }
- var trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]);
- var startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114,
- 101, 102]);
- var endobjBytes = new Uint8Array([101, 110, 100, 111, 98, 106]);
- var xrefBytes = new Uint8Array([47, 88, 82, 101, 102]);
-
- var stream = this.stream;
- stream.pos = 0;
- var buffer = stream.getBytes();
- var position = stream.start, length = buffer.length;
- var trailers = [], xrefStms = [];
- var state = 0;
- var currentToken;
- while (position < length) {
- var ch = buffer[position];
- if (ch === 32 || ch === 9 || ch === 13 || ch === 10) {
- ++position;
- continue;
- }
- if (ch === 37) { // %-comment
- do {
- ++position;
- ch = buffer[position];
- } while (ch !== 13 && ch !== 10);
- continue;
- }
- var token = readToken(buffer, position);
- var m;
- if (token === 'xref') {
- position += skipUntil(buffer, position, trailerBytes);
- trailers.push(position);
- position += skipUntil(buffer, position, startxrefBytes);
- } else if ((m = /^(\d+)\s+(\d+)\s+obj\b/.exec(token))) {
- this.entries[m[1]] = {
- offset: position,
- gen: m[2] | 0,
- uncompressed: true
- };
-
- var contentLength = skipUntil(buffer, position, endobjBytes) + 7;
- var content = buffer.subarray(position, position + contentLength);
-
- // checking XRef stream suspect
- // (it shall have '/XRef' and next char is not a letter)
- var xrefTagOffset = skipUntil(content, 0, xrefBytes);
- if (xrefTagOffset < contentLength &&
- content[xrefTagOffset + 5] < 64) {
- xrefStms.push(position);
- this.xrefstms[position] = 1; // don't read it recursively
- }
-
- position += contentLength;
- } else
- position += token.length + 1;
- }
- // reading XRef streams
- for (var i = 0, ii = xrefStms.length; i < ii; ++i) {
- this.readXRef(xrefStms[i], true);
- }
- // finding main trailer
- var dict;
- for (var i = 0, ii = trailers.length; i < ii; ++i) {
- stream.pos = trailers[i];
- var parser = new Parser(new Lexer(stream), true, null);
- var obj = parser.getObj();
- if (!isCmd(obj, 'trailer'))
- continue;
- // read the trailer dictionary
- if (!isDict(dict = parser.getObj()))
- continue;
- // taking the first one with 'ID'
- if (dict.has('ID'))
- return dict;
- }
- // no tailer with 'ID', taking last one (if exists)
- if (dict)
- return dict;
- // nothing helps
- error('Invalid PDF structure');
- },
- readXRef: function XRef_readXRef(startXRef, recoveryMode) {
- var stream = this.stream;
- stream.pos = startXRef;
-
- try {
- var parser = new Parser(new Lexer(stream), true, null);
- var obj = parser.getObj();
- var dict;
-
- // Get dictionary
- if (isCmd(obj, 'xref')) {
- // Parse end-of-file XRef
- dict = this.readXRefTable(parser);
-
- // Recursively get other XRefs 'XRefStm', if any
- obj = dict.get('XRefStm');
- if (isInt(obj)) {
- var pos = obj;
- // ignore previously loaded xref streams
- // (possible infinite recursion)
- if (!(pos in this.xrefstms)) {
- this.xrefstms[pos] = 1;
- this.readXRef(pos);
- }
- }
- } else if (isInt(obj)) {
- // Parse in-stream XRef
- if (!isInt(parser.getObj()) ||
- !isCmd(parser.getObj(), 'obj') ||
- !isStream(obj = parser.getObj())) {
- error('Invalid XRef stream');
- }
- dict = this.readXRefStream(obj);
- if (!dict)
- error('Failed to read XRef stream');
- }
-
- // Recursively get previous dictionary, if any
- obj = dict.get('Prev');
- if (isInt(obj))
- this.readXRef(obj, recoveryMode);
- else if (isRef(obj)) {
- // The spec says Prev must not be a reference, i.e. "/Prev NNN"
- // This is a fallback for non-compliant PDFs, i.e. "/Prev NNN 0 R"
- this.readXRef(obj.num, recoveryMode);
- }
-
- return dict;
- } catch (e) {
- log('(while reading XRef): ' + e);
- }
-
- if (recoveryMode)
- return;
-
- warn('Indexing all PDF objects');
- return this.indexObjects();
- },
- getEntry: function XRef_getEntry(i) {
- var e = this.entries[i];
- if (e === null)
- return null;
- return e.free || !e.offset ? null : e; // returns null if entry is free
- },
- fetchIfRef: function XRef_fetchIfRef(obj) {
- if (!isRef(obj))
- return obj;
- return this.fetch(obj);
- },
- fetch: function XRef_fetch(ref, suppressEncryption) {
- assertWellFormed(isRef(ref), 'ref object is not a reference');
- var num = ref.num;
- if (num in this.cache)
- return this.cache[num];
-
- var e = this.getEntry(num);
-
- // the referenced entry can be free
- if (e === null)
- return (this.cache[num] = e);
-
- var gen = ref.gen;
- var stream, parser;
- if (e.uncompressed) {
- if (e.gen != gen)
- error('inconsistent generation in XRef');
- stream = this.stream.makeSubStream(e.offset);
- parser = new Parser(new Lexer(stream), true, this);
- var obj1 = parser.getObj();
- var obj2 = parser.getObj();
- var obj3 = parser.getObj();
- if (!isInt(obj1) || obj1 != num ||
- !isInt(obj2) || obj2 != gen ||
- !isCmd(obj3)) {
- error('bad XRef entry');
- }
- if (!isCmd(obj3, 'obj')) {
- // some bad pdfs use "obj1234" and really mean 1234
- if (obj3.cmd.indexOf('obj') == 0) {
- num = parseInt(obj3.cmd.substring(3), 10);
- if (!isNaN(num))
- return num;
- }
- error('bad XRef entry');
- }
- if (this.encrypt && !suppressEncryption) {
- try {
- e = parser.getObj(this.encrypt.createCipherTransform(num, gen));
- } catch (ex) {
- // almost all streams must be encrypted, but sometimes
- // they are not probably due to some broken generators
- // re-trying without encryption
- return this.fetch(ref, true);
- }
- } else {
- e = parser.getObj();
- }
- // Don't cache streams since they are mutable (except images).
- if (!isStream(e) || e instanceof JpegStream)
- this.cache[num] = e;
- return e;
- }
-
- // compressed entry
- stream = this.fetch(new Ref(e.offset, 0));
- if (!isStream(stream))
- error('bad ObjStm stream');
- var first = stream.parameters.get('First');
- var n = stream.parameters.get('N');
- if (!isInt(first) || !isInt(n)) {
- error('invalid first and n parameters for ObjStm stream');
- }
- parser = new Parser(new Lexer(stream), false, this);
- var i, entries = [], nums = [];
- // read the object numbers to populate cache
- for (i = 0; i < n; ++i) {
- num = parser.getObj();
- if (!isInt(num)) {
- error('invalid object number in the ObjStm stream: ' + num);
- }
- nums.push(num);
- var offset = parser.getObj();
- if (!isInt(offset)) {
- error('invalid object offset in the ObjStm stream: ' + offset);
- }
- }
- // read stream objects for cache
- for (i = 0; i < n; ++i) {
- entries.push(parser.getObj());
- this.cache[nums[i]] = entries[i];
- }
- e = entries[e.gen];
- if (!e) {
- error('bad XRef entry for compressed object');
- }
- return e;
- },
- getCatalogObj: function XRef_getCatalogObj() {
- return this.root;
- }
- };
-
- return XRef;
-})();
-
-/**
- * A PDF document and page is built of many objects. E.g. there are objects
- * for fonts, images, rendering code and such. These objects might get processed
- * inside of a worker. The `PDFObjects` implements some basic functions to
- * manage these objects.
- */
-var PDFObjects = (function PDFObjectsClosure() {
- function PDFObjects() {
- this.objs = {};
- }
-
- PDFObjects.prototype = {
- objs: null,
-
- /**
- * Internal function.
- * Ensures there is an object defined for `objId`. Stores `data` on the
- * object *if* it is created.
- */
- ensureObj: function PDFObjects_ensureObj(objId, data) {
- if (this.objs[objId])
- return this.objs[objId];
- return this.objs[objId] = new Promise(objId, data);
- },
-
- /**
- * If called *without* callback, this returns the data of `objId` but the
- * object needs to be resolved. If it isn't, this function throws.
- *
- * If called *with* a callback, the callback is called with the data of the
- * object once the object is resolved. That means, if you call this
- * function and the object is already resolved, the callback gets called
- * right away.
- */
- get: function PDFObjects_get(objId, callback) {
- // If there is a callback, then the get can be async and the object is
- // not required to be resolved right now
- if (callback) {
- this.ensureObj(objId).then(callback);
- return null;
- }
-
- // If there isn't a callback, the user expects to get the resolved data
- // directly.
- var obj = this.objs[objId];
-
- // If there isn't an object yet or the object isn't resolved, then the
- // data isn't ready yet!
- if (!obj || !obj.isResolved)
- error('Requesting object that isn\'t resolved yet ' + objId);
-
- return obj.data;
- },
-
- /**
- * Resolves the object `objId` with optional `data`.
- */
- resolve: function PDFObjects_resolve(objId, data) {
- var objs = this.objs;
-
- // In case there is a promise already on this object, just resolve it.
- if (objs[objId]) {
- objs[objId].resolve(data);
- } else {
- this.ensureObj(objId, data);
- }
- },
-
- onData: function PDFObjects_onData(objId, callback) {
- this.ensureObj(objId).onData(callback);
- },
-
- isResolved: function PDFObjects_isResolved(objId) {
- var objs = this.objs;
- if (!objs[objId]) {
- return false;
- } else {
- return objs[objId].isResolved;
- }
- },
-
- hasData: function PDFObjects_hasData(objId) {
- var objs = this.objs;
- if (!objs[objId]) {
- return false;
- } else {
- return objs[objId].hasData;
- }
- },
-
- /**
- * Sets the data of an object but *doesn't* resolve it.
- */
- setData: function PDFObjects_setData(objId, data) {
- // Watchout! If you call `this.ensureObj(objId, data)` you're going to
- // create a *resolved* promise which shouldn't be the case!
- this.ensureObj(objId).data = data;
- }
- };
- return PDFObjects;
-})();
-
-
-
-var PDFFunction = (function PDFFunctionClosure() {
- var CONSTRUCT_SAMPLED = 0;
- var CONSTRUCT_INTERPOLATED = 2;
- var CONSTRUCT_STICHED = 3;
- var CONSTRUCT_POSTSCRIPT = 4;
-
- return {
- getSampleArray: function PDFFunction_getSampleArray(size, outputSize, bps,
- str) {
- var length = 1;
- for (var i = 0, ii = size.length; i < ii; i++)
- length *= size[i];
- length *= outputSize;
-
- var array = [];
- var codeSize = 0;
- var codeBuf = 0;
- // 32 is a valid bps so shifting won't work
- var sampleMul = 1.0 / (Math.pow(2.0, bps) - 1);
-
- var strBytes = str.getBytes((length * bps + 7) / 8);
- var strIdx = 0;
- for (var i = 0; i < length; i++) {
- while (codeSize < bps) {
- codeBuf <<= 8;
- codeBuf |= strBytes[strIdx++];
- codeSize += 8;
- }
- codeSize -= bps;
- array.push((codeBuf >> codeSize) * sampleMul);
- codeBuf &= (1 << codeSize) - 1;
- }
- return array;
- },
-
- getIR: function PDFFunction_getIR(xref, fn) {
- var dict = fn.dict;
- if (!dict)
- dict = fn;
-
- var types = [this.constructSampled,
- null,
- this.constructInterpolated,
- this.constructStiched,
- this.constructPostScript];
-
- var typeNum = dict.get('FunctionType');
- var typeFn = types[typeNum];
- if (!typeFn)
- error('Unknown type of function');
-
- return typeFn.call(this, fn, dict, xref);
- },
-
- fromIR: function PDFFunction_fromIR(IR) {
- var type = IR[0];
- switch (type) {
- case CONSTRUCT_SAMPLED:
- return this.constructSampledFromIR(IR);
- case CONSTRUCT_INTERPOLATED:
- return this.constructInterpolatedFromIR(IR);
- case CONSTRUCT_STICHED:
- return this.constructStichedFromIR(IR);
- case CONSTRUCT_POSTSCRIPT:
- default:
- return this.constructPostScriptFromIR(IR);
- }
- },
-
- parse: function PDFFunction_parse(xref, fn) {
- var IR = this.getIR(xref, fn);
- return this.fromIR(IR);
- },
-
- constructSampled: function PDFFunction_constructSampled(str, dict) {
- function toMultiArray(arr) {
- var inputLength = arr.length;
- var outputLength = arr.length / 2;
- var out = [];
- var index = 0;
- for (var i = 0; i < inputLength; i += 2) {
- out[index] = [arr[i], arr[i + 1]];
- ++index;
- }
- return out;
- }
- var domain = dict.get('Domain');
- var range = dict.get('Range');
-
- if (!domain || !range)
- error('No domain or range');
-
- var inputSize = domain.length / 2;
- var outputSize = range.length / 2;
-
- domain = toMultiArray(domain);
- range = toMultiArray(range);
-
- var size = dict.get('Size');
- var bps = dict.get('BitsPerSample');
- var order = dict.get('Order') || 1;
- if (order !== 1) {
- // No description how cubic spline interpolation works in PDF32000:2008
- // As in poppler, ignoring order, linear interpolation may work as good
- TODO('No support for cubic spline interpolation: ' + order);
- }
-
- var encode = dict.get('Encode');
- if (!encode) {
- encode = [];
- for (var i = 0; i < inputSize; ++i) {
- encode.push(0);
- encode.push(size[i] - 1);
- }
- }
- encode = toMultiArray(encode);
-
- var decode = dict.get('Decode');
- if (!decode)
- decode = range;
- else
- decode = toMultiArray(decode);
-
- var samples = this.getSampleArray(size, outputSize, bps, str);
-
- return [
- CONSTRUCT_SAMPLED, inputSize, domain, encode, decode, samples, size,
- outputSize, Math.pow(2, bps) - 1, range
- ];
- },
-
- constructSampledFromIR: function PDFFunction_constructSampledFromIR(IR) {
- // See chapter 3, page 109 of the PDF reference
- function interpolate(x, xmin, xmax, ymin, ymax) {
- return ymin + ((x - xmin) * ((ymax - ymin) / (xmax - xmin)));
- }
-
- return function constructSampledFromIRResult(args) {
- // See chapter 3, page 110 of the PDF reference.
- var m = IR[1];
- var domain = IR[2];
- var encode = IR[3];
- var decode = IR[4];
- var samples = IR[5];
- var size = IR[6];
- var n = IR[7];
- var mask = IR[8];
- var range = IR[9];
-
- if (m != args.length)
- error('Incorrect number of arguments: ' + m + ' != ' +
- args.length);
-
- var x = args;
-
- // Building the cube vertices: its part and sample index
- // http://rjwagner49.com/Mathematics/Interpolation.pdf
- var cubeVertices = 1 << m;
- var cubeN = new Float64Array(cubeVertices);
- var cubeVertex = new Uint32Array(cubeVertices);
- for (var j = 0; j < cubeVertices; j++)
- cubeN[j] = 1;
-
- var k = n, pos = 1;
- // Map x_i to y_j for 0 <= i < m using the sampled function.
- for (var i = 0; i < m; ++i) {
- // x_i' = min(max(x_i, Domain_2i), Domain_2i+1)
- var domain_2i = domain[i][0];
- var domain_2i_1 = domain[i][1];
- var xi = Math.min(Math.max(x[i], domain_2i), domain_2i_1);
-
- // e_i = Interpolate(x_i', Domain_2i, Domain_2i+1,
- // Encode_2i, Encode_2i+1)
- var e = interpolate(xi, domain_2i, domain_2i_1,
- encode[i][0], encode[i][1]);
-
- // e_i' = min(max(e_i, 0), Size_i - 1)
- var size_i = size[i];
- e = Math.min(Math.max(e, 0), size_i - 1);
-
- // Adjusting the cube: N and vertex sample index
- var e0 = e < size_i - 1 ? Math.floor(e) : e - 1; // e1 = e0 + 1;
- var n0 = e0 + 1 - e; // (e1 - e) / (e1 - e0);
- var n1 = e - e0; // (e - e0) / (e1 - e0);
- var offset0 = e0 * k;
- var offset1 = offset0 + k; // e1 * k
- for (var j = 0; j < cubeVertices; j++) {
- if (j & pos) {
- cubeN[j] *= n1;
- cubeVertex[j] += offset1;
- } else {
- cubeN[j] *= n0;
- cubeVertex[j] += offset0;
- }
- }
-
- k *= size_i;
- pos <<= 1;
- }
-
- var y = new Float64Array(n);
- for (var j = 0; j < n; ++j) {
- // Sum all cube vertices' samples portions
- var rj = 0;
- for (var i = 0; i < cubeVertices; i++)
- rj += samples[cubeVertex[i] + j] * cubeN[i];
-
- // r_j' = Interpolate(r_j, 0, 2^BitsPerSample - 1,
- // Decode_2j, Decode_2j+1)
- rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]);
-
- // y_j = min(max(r_j, range_2j), range_2j+1)
- y[j] = Math.min(Math.max(rj, range[j][0]), range[j][1]);
- }
-
- return y;
- }
- },
-
- constructInterpolated: function PDFFunction_constructInterpolated(str,
- dict) {
- var c0 = dict.get('C0') || [0];
- var c1 = dict.get('C1') || [1];
- var n = dict.get('N');
-
- if (!isArray(c0) || !isArray(c1))
- error('Illegal dictionary for interpolated function');
-
- var length = c0.length;
- var diff = [];
- for (var i = 0; i < length; ++i)
- diff.push(c1[i] - c0[i]);
-
- return [CONSTRUCT_INTERPOLATED, c0, diff, n];
- },
-
- constructInterpolatedFromIR:
- function PDFFunction_constructInterpolatedFromIR(IR) {
- var c0 = IR[1];
- var diff = IR[2];
- var n = IR[3];
-
- var length = diff.length;
-
- return function constructInterpolatedFromIRResult(args) {
- var x = n == 1 ? args[0] : Math.pow(args[0], n);
-
- var out = [];
- for (var j = 0; j < length; ++j)
- out.push(c0[j] + (x * diff[j]));
-
- return out;
-
- }
- },
-
- constructStiched: function PDFFunction_constructStiched(fn, dict, xref) {
- var domain = dict.get('Domain');
-
- if (!domain)
- error('No domain');
-
- var inputSize = domain.length / 2;
- if (inputSize != 1)
- error('Bad domain for stiched function');
-
- var fnRefs = dict.get('Functions');
- var fns = [];
- for (var i = 0, ii = fnRefs.length; i < ii; ++i)
- fns.push(PDFFunction.getIR(xref, xref.fetchIfRef(fnRefs[i])));
-
- var bounds = dict.get('Bounds');
- var encode = dict.get('Encode');
-
- return [CONSTRUCT_STICHED, domain, bounds, encode, fns];
- },
-
- constructStichedFromIR: function PDFFunction_constructStichedFromIR(IR) {
- var domain = IR[1];
- var bounds = IR[2];
- var encode = IR[3];
- var fnsIR = IR[4];
- var fns = [];
-
- for (var i = 0, ii = fnsIR.length; i < ii; i++) {
- fns.push(PDFFunction.fromIR(fnsIR[i]));
- }
-
- return function constructStichedFromIRResult(args) {
- var clip = function constructStichedFromIRClip(v, min, max) {
- if (v > max)
- v = max;
- else if (v < min)
- v = min;
- return v;
- };
-
- // clip to domain
- var v = clip(args[0], domain[0], domain[1]);
- // calulate which bound the value is in
- for (var i = 0, ii = bounds.length; i < ii; ++i) {
- if (v < bounds[i])
- break;
- }
-
- // encode value into domain of function
- var dmin = domain[0];
- if (i > 0)
- dmin = bounds[i - 1];
- var dmax = domain[1];
- if (i < bounds.length)
- dmax = bounds[i];
-
- var rmin = encode[2 * i];
- var rmax = encode[2 * i + 1];
-
- var v2 = rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin);
-
- // call the appropropriate function
- return fns[i]([v2]);
- };
- },
-
- constructPostScript: function PDFFunction_constructPostScript(fn, dict,
- xref) {
- var domain = dict.get('Domain');
- var range = dict.get('Range');
-
- if (!domain)
- error('No domain.');
-
- if (!range)
- error('No range.');
-
- var lexer = new PostScriptLexer(fn);
- var parser = new PostScriptParser(lexer);
- var code = parser.parse();
-
- return [CONSTRUCT_POSTSCRIPT, domain, range, code];
- },
-
- constructPostScriptFromIR: function PDFFunction_constructPostScriptFromIR(
- IR) {
- var domain = IR[1];
- var range = IR[2];
- var code = IR[3];
- var numOutputs = range.length / 2;
- var evaluator = new PostScriptEvaluator(code);
- // Cache the values for a big speed up, the cache size is limited though
- // since the number of possible values can be huge from a PS function.
- var cache = new FunctionCache();
- return function constructPostScriptFromIRResult(args) {
- var initialStack = [];
- for (var i = 0, ii = (domain.length / 2); i < ii; ++i) {
- initialStack.push(args[i]);
- }
-
- var key = initialStack.join('_');
- if (cache.has(key))
- return cache.get(key);
-
- var stack = evaluator.execute(initialStack);
- var transformed = [];
- for (i = numOutputs - 1; i >= 0; --i) {
- var out = stack.pop();
- var rangeIndex = 2 * i;
- if (out < range[rangeIndex])
- out = range[rangeIndex];
- else if (out > range[rangeIndex + 1])
- out = range[rangeIndex + 1];
- transformed[i] = out;
- }
- cache.set(key, transformed);
- return transformed;
- };
- }
- };
-})();
-
-var FunctionCache = (function FunctionCacheClosure() {
- // Of 10 PDF's with type4 functions the maxium number of distinct values seen
- // was 256. This still may need some tweaking in the future though.
- var MAX_CACHE_SIZE = 1024;
- function FunctionCache() {
- this.cache = {};
- this.total = 0;
- }
- FunctionCache.prototype = {
- has: function FunctionCache_has(key) {
- return key in this.cache;
- },
- get: function FunctionCache_get(key) {
- return this.cache[key];
- },
- set: function FunctionCache_set(key, value) {
- if (this.total < MAX_CACHE_SIZE) {
- this.cache[key] = value;
- this.total++;
- }
- }
- };
- return FunctionCache;
-})();
-
-var PostScriptStack = (function PostScriptStackClosure() {
- var MAX_STACK_SIZE = 100;
- function PostScriptStack(initialStack) {
- this.stack = initialStack || [];
- }
-
- PostScriptStack.prototype = {
- push: function PostScriptStack_push(value) {
- if (this.stack.length >= MAX_STACK_SIZE)
- error('PostScript function stack overflow.');
- this.stack.push(value);
- },
- pop: function PostScriptStack_pop() {
- if (this.stack.length <= 0)
- error('PostScript function stack underflow.');
- return this.stack.pop();
- },
- copy: function PostScriptStack_copy(n) {
- if (this.stack.length + n >= MAX_STACK_SIZE)
- error('PostScript function stack overflow.');
- var stack = this.stack;
- for (var i = stack.length - n, j = n - 1; j >= 0; j--, i++)
- stack.push(stack[i]);
- },
- index: function PostScriptStack_index(n) {
- this.push(this.stack[this.stack.length - n - 1]);
- },
- // rotate the last n stack elements p times
- roll: function PostScriptStack_roll(n, p) {
- var stack = this.stack;
- var l = stack.length - n;
- var r = stack.length - 1, c = l + (p - Math.floor(p / n) * n), i, j, t;
- for (i = l, j = r; i < j; i++, j--) {
- t = stack[i]; stack[i] = stack[j]; stack[j] = t;
- }
- for (i = l, j = c - 1; i < j; i++, j--) {
- t = stack[i]; stack[i] = stack[j]; stack[j] = t;
- }
- for (i = c, j = r; i < j; i++, j--) {
- t = stack[i]; stack[i] = stack[j]; stack[j] = t;
- }
- }
- };
- return PostScriptStack;
-})();
-var PostScriptEvaluator = (function PostScriptEvaluatorClosure() {
- function PostScriptEvaluator(operators, operands) {
- this.operators = operators;
- this.operands = operands;
- }
- PostScriptEvaluator.prototype = {
- execute: function PostScriptEvaluator_execute(initialStack) {
- var stack = new PostScriptStack(initialStack);
- var counter = 0;
- var operators = this.operators;
- var length = operators.length;
- var operator, a, b;
- while (counter < length) {
- operator = operators[counter++];
- if (typeof operator == 'number') {
- // Operator is really an operand and should be pushed to the stack.
- stack.push(operator);
- continue;
- }
- switch (operator) {
- // non standard ps operators
- case 'jz': // jump if false
- b = stack.pop();
- a = stack.pop();
- if (!a)
- counter = b;
- break;
- case 'j': // jump
- a = stack.pop();
- counter = a;
- break;
-
- // all ps operators in alphabetical order (excluding if/ifelse)
- case 'abs':
- a = stack.pop();
- stack.push(Math.abs(a));
- break;
- case 'add':
- b = stack.pop();
- a = stack.pop();
- stack.push(a + b);
- break;
- case 'and':
- b = stack.pop();
- a = stack.pop();
- if (isBool(a) && isBool(b))
- stack.push(a && b);
- else
- stack.push(a & b);
- break;
- case 'atan':
- a = stack.pop();
- stack.push(Math.atan(a));
- break;
- case 'bitshift':
- b = stack.pop();
- a = stack.pop();
- if (a > 0)
- stack.push(a << b);
- else
- stack.push(a >> b);
- break;
- case 'ceiling':
- a = stack.pop();
- stack.push(Math.ceil(a));
- break;
- case 'copy':
- a = stack.pop();
- stack.copy(a);
- break;
- case 'cos':
- a = stack.pop();
- stack.push(Math.cos(a));
- break;
- case 'cvi':
- a = stack.pop() | 0;
- stack.push(a);
- break;
- case 'cvr':
- // noop
- break;
- case 'div':
- b = stack.pop();
- a = stack.pop();
- stack.push(a / b);
- break;
- case 'dup':
- stack.copy(1);
- break;
- case 'eq':
- b = stack.pop();
- a = stack.pop();
- stack.push(a == b);
- break;
- case 'exch':
- stack.roll(2, 1);
- break;
- case 'exp':
- b = stack.pop();
- a = stack.pop();
- stack.push(Math.pow(a, b));
- break;
- case 'false':
- stack.push(false);
- break;
- case 'floor':
- a = stack.pop();
- stack.push(Math.floor(a));
- break;
- case 'ge':
- b = stack.pop();
- a = stack.pop();
- stack.push(a >= b);
- break;
- case 'gt':
- b = stack.pop();
- a = stack.pop();
- stack.push(a > b);
- break;
- case 'idiv':
- b = stack.pop();
- a = stack.pop();
- stack.push((a / b) | 0);
- break;
- case 'index':
- a = stack.pop();
- stack.index(a);
- break;
- case 'le':
- b = stack.pop();
- a = stack.pop();
- stack.push(a <= b);
- break;
- case 'ln':
- a = stack.pop();
- stack.push(Math.log(a));
- break;
- case 'log':
- a = stack.pop();
- stack.push(Math.log(a) / Math.LN10);
- break;
- case 'lt':
- b = stack.pop();
- a = stack.pop();
- stack.push(a < b);
- break;
- case 'mod':
- b = stack.pop();
- a = stack.pop();
- stack.push(a % b);
- break;
- case 'mul':
- b = stack.pop();
- a = stack.pop();
- stack.push(a * b);
- break;
- case 'ne':
- b = stack.pop();
- a = stack.pop();
- stack.push(a != b);
- break;
- case 'neg':
- a = stack.pop();
- stack.push(-b);
- break;
- case 'not':
- a = stack.pop();
- if (isBool(a) && isBool(b))
- stack.push(a && b);
- else
- stack.push(a & b);
- break;
- case 'or':
- b = stack.pop();
- a = stack.pop();
- if (isBool(a) && isBool(b))
- stack.push(a || b);
- else
- stack.push(a | b);
- break;
- case 'pop':
- stack.pop();
- break;
- case 'roll':
- b = stack.pop();
- a = stack.pop();
- stack.roll(a, b);
- break;
- case 'round':
- a = stack.pop();
- stack.push(Math.round(a));
- break;
- case 'sin':
- a = stack.pop();
- stack.push(Math.sin(a));
- break;
- case 'sqrt':
- a = stack.pop();
- stack.push(Math.sqrt(a));
- break;
- case 'sub':
- b = stack.pop();
- a = stack.pop();
- stack.push(a - b);
- break;
- case 'true':
- stack.push(true);
- break;
- case 'truncate':
- a = stack.pop();
- a = a < 0 ? Math.ceil(a) : Math.floor(a);
- stack.push(a);
- break;
- case 'xor':
- b = stack.pop();
- a = stack.pop();
- if (isBool(a) && isBool(b))
- stack.push(a != b);
- else
- stack.push(a ^ b);
- break;
- default:
- error('Unknown operator ' + operator);
- break;
- }
- }
- return stack.stack;
- }
- };
- return PostScriptEvaluator;
-})();
-
-var PostScriptParser = (function PostScriptParserClosure() {
- function PostScriptParser(lexer) {
- this.lexer = lexer;
- this.operators = [];
- this.token;
- this.prev;
- }
- PostScriptParser.prototype = {
- nextToken: function PostScriptParser_nextToken() {
- this.prev = this.token;
- this.token = this.lexer.getToken();
- },
- accept: function PostScriptParser_accept(type) {
- if (this.token.type == type) {
- this.nextToken();
- return true;
- }
- return false;
- },
- expect: function PostScriptParser_expect(type) {
- if (this.accept(type))
- return true;
- error('Unexpected symbol: found ' + this.token.type + ' expected ' +
- type + '.');
- },
- parse: function PostScriptParser_parse() {
- this.nextToken();
- this.expect(PostScriptTokenTypes.LBRACE);
- this.parseBlock();
- this.expect(PostScriptTokenTypes.RBRACE);
- return this.operators;
- },
- parseBlock: function PostScriptParser_parseBlock() {
- while (true) {
- if (this.accept(PostScriptTokenTypes.NUMBER)) {
- this.operators.push(this.prev.value);
- } else if (this.accept(PostScriptTokenTypes.OPERATOR)) {
- this.operators.push(this.prev.value);
- } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
- this.parseCondition();
- } else {
- return;
- }
- }
- },
- parseCondition: function PostScriptParser_parseCondition() {
- // Add two place holders that will be updated later
- var conditionLocation = this.operators.length;
- this.operators.push(null, null);
-
- this.parseBlock();
- this.expect(PostScriptTokenTypes.RBRACE);
- if (this.accept(PostScriptTokenTypes.IF)) {
- // The true block is right after the 'if' so it just falls through on
- // true else it jumps and skips the true block.
- this.operators[conditionLocation] = this.operators.length;
- this.operators[conditionLocation + 1] = 'jz';
- } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
- var jumpLocation = this.operators.length;
- this.operators.push(null, null);
- var endOfTrue = this.operators.length;
- this.parseBlock();
- this.expect(PostScriptTokenTypes.RBRACE);
- this.expect(PostScriptTokenTypes.IFELSE);
- // The jump is added at the end of the true block to skip the false
- // block.
- this.operators[jumpLocation] = this.operators.length;
- this.operators[jumpLocation + 1] = 'j';
-
- this.operators[conditionLocation] = endOfTrue;
- this.operators[conditionLocation + 1] = 'jz';
- } else {
- error('PS Function: error parsing conditional.');
- }
- }
- };
- return PostScriptParser;
-})();
-
-var PostScriptTokenTypes = {
- LBRACE: 0,
- RBRACE: 1,
- NUMBER: 2,
- OPERATOR: 3,
- IF: 4,
- IFELSE: 5
-};
-
-var PostScriptToken = (function PostScriptTokenClosure() {
- function PostScriptToken(type, value) {
- this.type = type;
- this.value = value;
- }
-
- var opCache = {};
-
- PostScriptToken.getOperator = function PostScriptToken_getOperator(op) {
- var opValue = opCache[op];
- if (opValue)
- return opValue;
-
- return opCache[op] = new PostScriptToken(PostScriptTokenTypes.OPERATOR, op);
- };
-
- PostScriptToken.LBRACE = new PostScriptToken(PostScriptTokenTypes.LBRACE,
- '{');
- PostScriptToken.RBRACE = new PostScriptToken(PostScriptTokenTypes.RBRACE,
- '}');
- PostScriptToken.IF = new PostScriptToken(PostScriptTokenTypes.IF, 'IF');
- PostScriptToken.IFELSE = new PostScriptToken(PostScriptTokenTypes.IFELSE,
- 'IFELSE');
- return PostScriptToken;
-})();
-
-var PostScriptLexer = (function PostScriptLexerClosure() {
- function PostScriptLexer(stream) {
- this.stream = stream;
- }
- PostScriptLexer.prototype = {
- getToken: function PostScriptLexer_getToken() {
- var s = '';
- var ch;
- var comment = false;
- var stream = this.stream;
-
- // skip comments
- while (true) {
- if (!(ch = stream.getChar()))
- return EOF;
-
- if (comment) {
- if (ch == '\x0a' || ch == '\x0d')
- comment = false;
- } else if (ch == '%') {
- comment = true;
- } else if (!Lexer.isSpace(ch)) {
- break;
- }
- }
- switch (ch) {
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- case '+': case '-': case '.':
- return new PostScriptToken(PostScriptTokenTypes.NUMBER,
- this.getNumber(ch));
- case '{':
- return PostScriptToken.LBRACE;
- case '}':
- return PostScriptToken.RBRACE;
- }
- // operator
- var str = ch.toLowerCase();
- while (true) {
- ch = stream.lookChar();
- if (ch === null)
- break;
- ch = ch.toLowerCase();
- if (ch >= 'a' && ch <= 'z')
- str += ch;
- else
- break;
- stream.skip();
- }
- switch (str) {
- case 'if':
- return PostScriptToken.IF;
- case 'ifelse':
- return PostScriptToken.IFELSE;
- default:
- return PostScriptToken.getOperator(str);
- }
- },
- getNumber: function PostScriptLexer_getNumber(ch) {
- var str = ch;
- var stream = this.stream;
- while (true) {
- ch = stream.lookChar();
- if ((ch >= '0' && ch <= '9') || ch == '-' || ch == '.')
- str += ch;
- else
- break;
- stream.skip();
- }
- var value = parseFloat(str);
- if (isNaN(value))
- error('Invalid floating point number: ' + value);
- return value;
- }
- };
- return PostScriptLexer;
-})();
-
-
-
-var ISOAdobeCharset = [
- '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar',
- 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright',
- 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero',
- 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',
- 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question',
- 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
- 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
- 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore',
- 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
- 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
- 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent',
- 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
- 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
- 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl',
- 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase',
- 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis',
- 'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde',
- 'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla',
- 'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine',
- 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash',
- 'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu',
- 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter',
- 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior',
- 'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright',
- 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde',
- 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute',
- 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex',
- 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex',
- 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute',
- 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla',
- 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex',
- 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis',
- 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis',
- 'ugrave', 'yacute', 'ydieresis', 'zcaron'
-];
-
-var ExpertCharset = [
- '.notdef', 'space', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle',
- 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior',
- 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma',
- 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle',
- 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle',
- 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle',
- 'colon', 'semicolon', 'commasuperior', 'threequartersemdash',
- 'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior',
- 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',
- 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
- 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',
- 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall',
- 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall',
- 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall',
- 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall',
- 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary',
- 'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle',
- 'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall',
- 'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall',
- 'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall',
- 'Cedillasmall', 'onequarter', 'onehalf', 'threequarters',
- 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths',
- 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',
- 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',
- 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',
- 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',
- 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',
- 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',
- 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall',
- 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall',
- 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall',
- 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',
- 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall',
- 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall',
- 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',
- 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall',
- 'Ydieresissmall'
-];
-
-var ExpertSubsetCharset = [
- '.notdef', 'space', 'dollaroldstyle', 'dollarsuperior',
- 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',
- 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction',
- 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle',
- 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle',
- 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior',
- 'threequartersemdash', 'periodsuperior', 'asuperior', 'bsuperior',
- 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',
- 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
- 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',
- 'parenrightinferior', 'hyphensuperior', 'colonmonetary', 'onefitted',
- 'rupiah', 'centoldstyle', 'figuredash', 'hypheninferior', 'onequarter',
- 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths',
- 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',
- 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',
- 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',
- 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',
- 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',
- 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',
- 'periodinferior', 'commainferior'
-];
-
-
-
-var CIDToUnicodeMaps = {
- 'Adobe-Japan1': [[32, 160], {f: 12, c: 33}, [45, 8209], {f: 46, c: 46}, 165,
- {f: 2, c: 93}, [95, 818], [96, 768], {f: 27, c: 97}, 166, 125, [732, 771],
- [700, 8217], 92, [699, 8216], 124, [126, 8764], {f: 3, c: 161}, 8260, 402,
- 0, 164, 8220, 171, {f: 2, c: 8249}, {f: 2, c: 64257}, [8210, 8211], 0, 0,
- [183, 8729], 0, 8226, 8218, 8222, 8221, 187, 0, 0, 191, {f: 2, c: 769},
- [175, 772], {f: 3, c: 774}, 778, [184, 807], 779, 808, 780, [822, 8212],
- 198, 170, 321, 216, 338, 186, 230, 305, 322, 248, 339, 223, 173, 169, 172,
- 174, 0, 0, {f: 2, c: 178}, 181, 185, {f: 3, c: 188}, {f: 6, c: 192},
- {f: 16, c: 199}, 0, {f: 6, c: 217}, {f: 6, c: 224}, {f: 16, c: 231}, 0,
- {f: 7, c: 249}, 352, 376, 381, [773, 8254], 353, 8482, 382, 0, 8194,
- {s: 91}, 65512, {s: 3}, {f: 63, c: 65377}, {s: 243}, [8195, 12288],
- {f: 2, c: 12289}, 65292, 65294, 12539, {f: 2, c: 65306}, 65311, 65281,
- {f: 2, c: 12443}, 180, 65344, 168, 65342, 65507, 65343, {f: 2, c: 12541},
- {f: 2, c: 12445}, 12291, 20189, {f: 3, c: 12293}, 12540, 8213, 8208, 65295,
- 65340, [12316, 65374], 8214, 65372, 8230, 8229, {s: 4}, {f: 2, c: 65288},
- {f: 2, c: 12308}, 65339, 65341, 65371, 65373, {f: 10, c: 12296}, 65291,
- [8722, 65293], 177, 215, 247, 65309, 8800, 65308, 65310, {f: 2, c: 8806},
- 8734, 8756, 9794, 9792, 176, {f: 2, c: 8242}, 8451, 65509, 65284,
- {f: 2, c: 65504}, 65285, 65283, 65286, 65290, 65312, 167, 9734, 9733, 9675,
- 9679, 9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, 9660, 8251, 12306,
- 8594, {f: 2, c: 8592}, 8595, 12307, 8712, 8715, {f: 2, c: 8838},
- {f: 2, c: 8834}, 8746, 8745, {f: 2, c: 8743}, 65506, 8658, 8660, 8704,
- 8707, 8736, 8869, 8978, 8706, 8711, 8801, 8786, {f: 2, c: 8810}, 8730,
- 8765, 8733, 8757, {f: 2, c: 8747}, 8491, 8240, 9839, 9837, 9834,
- {f: 2, c: 8224}, 182, 9711, {f: 10, c: 65296}, {f: 26, c: 65313},
- {f: 26, c: 65345}, {f: 83, c: 12353}, {f: 86, c: 12449}, {f: 17, c: 913},
- {f: 7, c: 931}, {f: 17, c: 945}, {f: 7, c: 963}, {f: 6, c: 1040}, 1025,
- {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, 20124, 21782, 23043, 38463,
- 21696, 24859, 25384, 23030, 36898, 33909, 33564, 31312, 24746, 25569,
- 28197, 26093, 33894, 33446, 39925, 26771, 22311, 26017, 25201, 23451,
- 22992, 34427, 39156, 32098, 32190, 39822, 25110, 31903, 34999, 23433,
- 24245, 25353, 26263, 26696, 38343, 38797, 26447, 20197, 20234, 20301,
- 20381, 20553, 22258, 22839, 22996, 23041, 23561, 24799, 24847, 24944,
- 26131, 26885, 28858, 30031, 30064, 31227, 32173, 32239, 32963, 33806,
- [12176, 34915], 35586, 36949, 36986, 21307, 20117, 20133, 22495, 32946,
- 37057, 30959, [12032, 19968], 22769, 28322, 36920, 31282, 33576, 33419,
- 39983, 20801, 21360, 21693, 21729, 22240, 23035, 24341, 39154, 28139,
- 32996, 34093, 38498, 38512, 38560, 38907, 21515, 21491, 23431, 28879,
- [12155, 32701], 36802, [12204, 38632], 21359, 40284, 31418, 19985, 30867,
- [12165, 33276], 28198, 22040, 21764, 27421, 34074, 39995, 23013, 21417,
- 28006, [12128, 29916], 38287, 22082, 20113, 36939, 38642, 33615, 39180,
- 21473, 21942, 23344, 24433, 26144, 26355, 26628, 27704, 27891, 27945,
- 29787, 30408, 31310, 38964, 33521, 34907, 35424, 37613, 28082, 30123,
- 30410, 39365, 24742, 35585, 36234, 38322, 27022, 21421, 20870, 22290,
- 22576, 22852, 23476, 24310, 24616, 25513, 25588, 27839, 28436, 28814,
- 28948, 29017, 29141, 29503, 32257, 33398, 33489, 34199, 36960, 37467,
- 40219, 22633, 26044, 27738, 29989, 20985, 22830, 22885, 24448, 24540,
- 25276, 26106, 27178, 27431, 27572, 29579, 32705, 35158, 40236, 40206,
- [12009, 40644], 23713, 27798, 33659, 20740, 23627, 25014, 33222, 26742,
- 29281, [12036, 20057], 20474, 21368, 24681, 28201, 31311, [12211, 38899],
- 19979, 21270, 20206, 20309, 20285, 20385, 20339, 21152, 21487, 22025,
- 22799, 23233, 23478, 23521, 31185, 26247, 26524, 26550, 27468, 27827,
- [12117, 28779], 29634, 31117, [12146, 31166], 31292, 31623, 33457, 33499,
- 33540, 33655, 33775, 33747, 34662, 35506, 22057, 36008, 36838, 36942,
- 38686, 34442, 20420, 23784, 25105, [12123, 29273], 30011, 33253, 33469,
- 34558, 36032, 38597, 39187, 39381, 20171, 20250, 35299, 22238, 22602,
- 22730, 24315, 24555, 24618, 24724, 24674, 25040, 25106, 25296, 25913,
- 39745, 26214, 26800, 28023, 28784, 30028, 30342, 32117, 33445, 34809,
- 38283, 38542, [12185, 35997], 20977, 21182, 22806, 21683, 23475, 23830,
- 24936, 27010, 28079, 30861, 33995, 34903, 35442, 37799, 39608, 28012,
- 39336, 34521, 22435, 26623, 34510, 37390, 21123, 22151, 21508, 24275,
- 25313, 25785, 26684, 26680, 27579, 29554, 30906, 31339, 35226,
- [12179, 35282], 36203, 36611, 37101, 38307, 38548, [12208, 38761], 23398,
- 23731, 27005, {f: 2, c: 38989}, 25499, 31520, 27179, 27263, 26806, 39949,
- 28511, 21106, 21917, 24688, 25324, 27963, 28167, 28369, 33883, 35088,
- 36676, 19988, 39993, 21494, 26907, 27194, 38788, 26666, 20828, 31427,
- 33970, 37340, 37772, 22107, 40232, 26658, 33541, 33841, 31909, 21000,
- 33477, [12129, 29926], 20094, 20355, 20896, 23506, 21002, 21208, 21223,
- 24059, 21914, 22570, 23014, 23436, 23448, 23515, [12082, 24178], 24185,
- 24739, 24863, 24931, 25022, 25563, 25954, 26577, 26707, 26874, 27454,
- 27475, 27735, 28450, 28567, 28485, 29872, [12130, 29976], 30435, 30475,
- 31487, 31649, 31777, 32233, [12152, 32566], 32752, 32925, 33382, 33694,
- 35251, 35532, 36011, 36996, 37969, 38291, 38289, 38306, 38501, 38867,
- 39208, 33304, 20024, 21547, 23736, 24012, 29609, 30284, 30524, 23721,
- 32747, 36107, 38593, 38929, 38996, 39000, 20225, 20238, 21361, 21916,
- 22120, 22522, 22855, 23305, 23492, 23696, 24076, 24190, 24524, 25582,
- 26426, 26071, 26082, 26399, 26827, 26820, 27231, 24112, 27589, 27671,
- 27773, 30079, 31048, 23395, 31232, 32000, 24509, 35215, 35352, 36020,
- 36215, 36556, 36637, 39138, 39438, [12004, 12225, 39740], [12018, 20096],
- 20605, 20736, 22931, 23452, 25135, 25216, 25836, 27450, 29344, 30097,
- 31047, 32681, 34811, 35516, 35696, 25516, 33738, 38816, 21513, 21507,
- 21931, 26708, 27224, 35440, 30759, 26485, [12233, 40653], 21364, 23458,
- 33050, 34384, 36870, 19992, 20037, 20167, 20241, 21450, 21560, 23470,
- [12088, 24339], 24613, 25937, 26429, 27714, 27762, 27875, 28792, 29699,
- 31350, 31406, 31496, 32026, 31998, 32102, 26087, [12124, 29275], 21435,
- 23621, 24040, 25298, 25312, 25369, 28192, 34394, 35377, 36317, 37624,
- 28417, 31142, [12226, 39770], 20136, {f: 2, c: 20139}, 20379, 20384, 20689,
- 20807, 31478, 20849, 20982, 21332, 21281, 21375, 21483, 21932, 22659,
- 23777, 24375, 24394, 24623, 24656, 24685, 25375, 25945, 27211, 27841,
- 29378, 29421, 30703, 33016, 33029, 33288, 34126, 37111, 37857, 38911,
- 39255, 39514, 20208, 20957, 23597, 26241, 26989, 23616, 26354, 26997,
- [12127, 29577], 26704, 31873, 20677, 21220, 22343, [12081, 24062], 37670,
- [12100, 26020], 27427, 27453, 29748, 31105, 31165, 31563, 32202, 33465,
- 33740, 34943, 35167, 35641, 36817, [12198, 37329], 21535, 37504, 20061,
- 20534, 21477, 21306, 29399, 29590, 30697, 33510, 36527, 39366, 39368,
- 39378, 20855, 24858, 34398, 21936, 31354, 20598, 23507, 36935, 38533,
- 20018, 27355, 37351, 23633, 23624, 25496, 31391, 27795, 38772, 36705,
- 31402, 29066, 38536, 31874, 26647, 32368, 26705, 37740, 21234, 21531,
- 34219, 35347, 32676, 36557, 37089, 21350, 34952, 31041, 20418, 20670,
- 21009, 20804, 21843, 22317, 29674, 22411, 22865, 24418, 24452, 24693,
- 24950, 24935, 25001, 25522, 25658, 25964, 26223, 26690, 28179, 30054,
- 31293, 31995, 32076, 32153, 32331, 32619, 33550, 33610, 34509, 35336,
- 35427, 35686, 36605, 38938, 40335, 33464, 36814, 39912, 21127, 25119,
- 25731, 28608, 38553, 26689, 20625, [12107, 27424], 27770, 28500,
- [12147, 31348], 32080, [12174, 34880], 35363, [12105, 26376], 20214, 20537,
- 20518, 20581, 20860, 21048, 21091, 21927, 22287, 22533, 23244, 24314,
- 25010, 25080, 25331, 25458, 26908, 27177, 29309, [12125, 29356], 29486,
- 30740, 30831, 32121, 30476, 32937, [12178, 35211], 35609, 36066, 36562,
- 36963, 37749, 38522, 38997, 39443, 40568, 20803, 21407, 21427, 24187,
- 24358, 28187, 28304, [12126, 29572], 29694, 32067, 33335, [12180, 35328],
- 35578, 38480, 20046, 20491, 21476, 21628, 22266, 22993, 23396,
- [12080, 24049], 24235, 24359, [12094, 25144], 25925, 26543, 28246, 29392,
- 31946, 34996, 32929, 32993, 33776, [11969, 34382], 35463, 36328, 37431,
- 38599, 39015, [12238, 40723], 20116, 20114, 20237, 21320, 21577, 21566,
- 23087, 24460, 24481, 24735, 26791, 27278, 29786, 30849, 35486, 35492,
- 35703, 37264, 20062, 39881, 20132, 20348, 20399, 20505, 20502, 20809,
- 20844, 21151, 21177, 21246, 21402, [12061, 21475], 21521, 21518, 21897,
- 22353, 22434, 22909, 23380, 23389, 23439, [12079, 24037], 24039, 24055,
- 24184, 24195, 24218, 24247, 24344, 24658, 24908, 25239, 25304, 25511,
- 25915, 26114, 26179, 26356, 26477, 26657, 26775, 27083, 27743, 27946,
- 28009, 28207, 28317, 30002, 30343, 30828, 31295, 31968, 32005, 32024,
- 32094, 32177, 32789, 32771, 32943, 32945, 33108, 33167, 33322, 33618,
- [12175, 34892], 34913, 35611, 36002, 36092, 37066, 37237, 37489, 30783,
- 37628, 38308, 38477, 38917, [12217, 39321], [12220, 39640], 40251, 21083,
- 21163, 21495, 21512, 22741, 25335, 28640, 35946, 36703, 40633, 20811,
- 21051, 21578, 22269, 31296, 37239, 40288, [12234, 40658], 29508, 28425,
- 33136, 29969, 24573, 24794, [12219, 39592], 29403, 36796, 27492, 38915,
- 20170, 22256, 22372, 22718, 23130, 24680, 25031, 26127, 26118, 26681,
- 26801, 28151, 30165, 32058, [12169, 33390], 39746, 20123, 20304, 21449,
- 21766, 23919, 24038, 24046, 26619, 27801, 29811, 30722, 35408, 37782,
- 35039, 22352, 24231, 25387, 20661, 20652, 20877, 26368, 21705, 22622,
- 22971, 23472, 24425, 25165, 25505, 26685, 27507, 28168, 28797, 37319,
- 29312, 30741, 30758, 31085, 25998, 32048, 33756, 35009, 36617, 38555,
- 21092, 22312, 26448, 32618, 36001, 20916, 22338, 38442, 22586, 27018,
- 32948, 21682, 23822, 22524, 30869, 40442, 20316, 21066, 21643, 25662,
- 26152, 26388, 26613, 31364, 31574, 32034, 37679, 26716, 39853, 31545,
- 21273, 20874, 21047, 23519, 25334, 25774, 25830, 26413, 27578, 34217,
- 38609, 30352, 39894, 25420, 37638, 39851, [12139, 30399], 26194, 19977,
- 20632, 21442, [12077, 23665], 24808, 25746, 25955, 26719, 29158, 29642,
- 29987, 31639, 32386, 34453, 35715, 36059, 37240, 39184, 26028, 26283,
- 27531, 20181, 20180, 20282, 20351, 21050, 21496, 21490, 21987, 22235,
- [12064, 22763], 22987, 22985, 23039, [12070, 23376], 23629, 24066, 24107,
- 24535, 24605, 25351, [12096, 25903], 23388, 26031, 26045, 26088, 26525,
- [12108, 27490], 27515, [12114, 27663], 29509, 31049, 31169, [12151, 31992],
- 32025, 32043, 32930, 33026, [12164, 33267], 35222, 35422, 35433, 35430,
- 35468, 35566, 36039, 36060, 38604, 39164, [12013, 27503], 20107, 20284,
- 20365, 20816, 23383, 23546, 24904, 25345, 26178, 27425, 28363, 27835,
- 29246, 29885, 30164, 30913, [12144, 31034], [12157, 32780], [12159, 32819],
- [12163, 33258], 33940, 36766, 27728, [12229, 40575], 24335, 35672, 40235,
- 31482, 36600, 23437, 38635, 19971, 21489, 22519, 22833, 23241, 23460,
- 24713, 28287, 28422, 30142, 36074, 23455, 34048, 31712, 20594, 26612,
- 33437, 23649, 34122, 32286, 33294, 20889, 23556, 25448, 36198, 26012,
- 29038, 31038, 32023, 32773, 35613, [12190, 36554], 36974, 34503, 37034,
- 20511, 21242, 23610, 26451, 28796, 29237, 37196, 37320, 37675, 33509,
- 23490, 24369, 24825, 20027, 21462, 23432, [12095, 25163], 26417, 27530,
- 29417, 29664, 31278, 33131, 36259, 37202, [12216, 39318], 20754, 21463,
- 21610, 23551, 25480, 27193, 32172, 38656, 22234, 21454, 21608, 23447,
- 23601, 24030, 20462, 24833, 25342, 27954, 31168, 31179, 32066, 32333,
- 32722, 33261, [12168, 33311], 33936, 34886, 35186, 35728, 36468, 36655,
- 36913, 37195, 37228, 38598, 37276, 20160, 20303, 20805, [12055, 21313],
- 24467, 25102, 26580, 27713, 28171, 29539, 32294, 37325, 37507, 21460,
- 22809, 23487, 28113, 31069, 32302, 31899, 22654, 29087, 20986, 34899,
- 36848, 20426, 23803, 26149, 30636, 31459, 33308, 39423, 20934, 24490,
- 26092, 26991, 27529, 28147, 28310, 28516, 30462, 32020, 24033, 36981,
- 37255, 38918, 20966, 21021, 25152, 26257, 26329, 28186, 24246, 32210,
- 32626, 26360, 34223, 34295, 35576, 21161, 21465, [12069, 22899], 24207,
- 24464, 24661, 37604, 38500, 20663, 20767, 21213, 21280, 21319, 21484,
- 21736, 21830, 21809, 22039, 22888, 22974, 23100, 23477, 23558,
- [12073, 23567], 23569, 23578, 24196, 24202, 24288, 24432, 25215, 25220,
- 25307, 25484, 25463, 26119, 26124, 26157, 26230, 26494, 26786, 27167,
- 27189, 27836, 28040, 28169, 28248, 28988, 28966, 29031, 30151, 30465,
- 30813, 30977, 31077, 31216, 31456, 31505, 31911, 32057, 32918, 33750,
- 33931, 34121, 34909, 35059, 35359, 35388, 35412, 35443, 35937, 36062,
- 37284, 37478, 37758, 37912, 38556, 38808, 19978, 19976, 19998, 20055,
- 20887, 21104, 22478, 22580, 22732, 23330, 24120, 24773, 25854, 26465,
- 26454, 27972, 29366, 30067, 31331, 33976, 35698, 37304, 37664, 22065,
- 22516, 39166, 25325, 26893, 27542, 29165, 32340, 32887, [12170, 33394],
- 35302, [12215, 39135], 34645, 36785, 23611, 20280, 20449, 20405, 21767,
- 23072, 23517, 23529, [12092, 24515], 24910, 25391, 26032, 26187, 26862,
- 27035, 28024, 28145, 30003, 30137, 30495, 31070, 31206, 32051,
- [12162, 33251], 33455, 34218, 35242, 35386, [12189, 36523], [12191, 36763],
- 36914, 37341, 38663, [12040, 20154], 20161, 20995, 22645, 22764, 23563,
- 29978, 23613, 33102, 35338, 36805, 38499, 38765, 31525, 35535, 38920,
- 37218, 22259, 21416, 36887, 21561, 22402, 24101, 25512, [12116, 27700],
- 28810, 30561, 31883, 32736, 34928, 36930, 37204, 37648, 37656, 38543,
- 29790, 39620, 23815, 23913, 25968, 26530, 36264, 38619, 25454, 26441,
- 26905, 33733, 38935, 38592, 35070, 28548, 25722, [12072, 23544], 19990,
- 28716, 30045, 26159, 20932, 21046, 21218, 22995, 24449, 24615, 25104,
- 25919, 25972, 26143, 26228, 26866, 26646, 27491, 28165, 29298,
- [12131, 29983], 30427, 31934, 32854, 22768, 35069, [11972, 35199], 35488,
- 35475, 35531, 36893, 37266, [11992, 38738], 38745, [12011, 25993], 31246,
- 33030, 38587, 24109, 24796, 25114, 26021, 26132, 26512, [12143, 30707],
- 31309, 31821, 32318, 33034, 36012, [12186, 36196], 36321, 36447, 30889,
- 20999, 25305, 25509, 25666, 25240, 35373, 31363, 31680, 35500, 38634,
- 32118, [12166, 33292], 34633, 20185, 20808, 21315, 21344, 23459, 23554,
- 23574, 24029, 25126, 25159, 25776, 26643, 26676, 27849, 27973, 27927,
- 26579, 28508, 29006, 29053, 26059, 31359, 31661, 32218, 32330, 32680,
- 33146, [12167, 33307], 33337, 34214, 35438, 36046, 36341, 36984, 36983,
- 37549, 37521, 38275, 39854, 21069, 21892, 28472, 28982, 20840, 31109,
- 32341, 33203, 31950, 22092, 22609, 23720, 25514, 26366, 26365, 26970,
- 29401, 30095, 30094, 30990, 31062, 31199, 31895, 32032, 32068, 34311,
- 35380, 38459, 36961, [12239, 40736], 20711, 21109, 21452, 21474, 20489,
- 21930, 22766, 22863, 29245, 23435, 23652, 21277, 24803, 24819, 25436,
- 25475, 25407, 25531, 25805, 26089, 26361, 24035, 27085, 27133, 28437,
- 29157, 20105, 30185, 30456, 31379, 31967, 32207, 32156, 32865, 33609,
- 33624, 33900, 33980, 34299, 35013, [12187, 36208], 36865, 36973, 37783,
- 38684, 39442, 20687, 22679, 24974, 33235, 34101, 36104, 36896, 20419,
- 20596, 21063, 21363, 24687, 25417, 26463, 28204, [12188, 36275], 36895,
- 20439, 23646, 36042, 26063, 32154, 21330, 34966, 20854, 25539, 23384,
- 23403, 23562, 25613, 26449, 36956, 20182, 22810, 22826, 27760, 35409,
- 21822, 22549, 22949, 24816, 25171, 26561, 33333, 26965, 38464, 39364,
- 39464, 20307, 22534, 23550, 32784, 23729, 24111, 24453, 24608, 24907,
- 25140, 26367, 27888, 28382, 32974, 33151, 33492, 34955, 36024, 36864,
- 36910, 38538, 40667, 39899, 20195, 21488, [12068, 22823], 31532, 37261,
- 38988, 40441, 28381, 28711, 21331, 21828, 23429, 25176, 25246, 25299,
- 27810, 28655, 29730, 35351, 37944, 28609, 35582, 33592, 20967, 34552,
- 21482, 21481, 20294, 36948, [12192, 36784], 22890, 33073, 24061, 31466,
- 36799, 26842, [12181, 35895], 29432, 40008, 27197, 35504, 20025, 21336,
- 22022, 22374, 25285, 25506, 26086, 27470, 28129, 28251, 28845, 30701,
- 31471, 31658, 32187, 32829, 32966, 34507, 35477, 37723, 22243, 22727,
- 24382, 26029, 26262, 27264, 27573, 30007, 35527, 20516, 30693, 22320,
- 24347, 24677, 26234, 27744, 30196, 31258, 32622, 33268, 34584, 36933,
- 39347, 31689, 30044, [12149, 31481], 31569, 33988, 36880, 31209, 31378,
- 33590, 23265, 30528, 20013, 20210, 23449, 24544, 25277, 26172, 26609,
- 27880, [12173, 34411], 34935, 35387, 37198, 37619, 39376, 27159, 28710,
- 29482, 33511, 33879, 36015, 19969, 20806, 20939, 21899, 23541, 24086,
- 24115, 24193, 24340, 24373, 24427, 24500, 25074, 25361, 26274, 26397,
- 28526, 29266, 30010, 30522, 32884, 33081, 33144, 34678, 35519, 35548,
- 36229, 36339, 37530, [11985, 12199, 38263], 38914, [12227, 40165], 21189,
- 25431, 30452, 26389, 27784, 29645, 36035, 37806, 38515, 27941, 22684,
- 26894, 27084, 36861, 37786, 30171, 36890, 22618, 26626, 25524, 27131,
- 20291, 28460, 26584, 36795, 34086, 32180, 37716, 26943, 28528, 22378,
- 22775, 23340, 32044, [12118, 29226], 21514, 37347, 40372, 20141, 20302,
- 20572, 20597, 21059, 35998, 21576, 22564, 23450, 24093, 24213, 24237,
- 24311, 24351, 24716, 25269, 25402, 25552, 26799, 27712, 30855, 31118,
- 31243, 32224, 33351, 35330, 35558, 36420, 36883, 37048, 37165, 37336,
- [12237, 40718], 27877, 25688, 25826, 25973, 28404, 30340, 31515, 36969,
- 37841, 28346, 21746, 24505, 25764, 36685, 36845, 37444, 20856, 22635,
- 22825, 23637, 24215, 28155, 32399, 29980, 36028, 36578, 39003, 28857,
- 20253, 27583, 28593, [12133, 30000], 38651, 20814, 21520, 22581, 22615,
- 22956, 23648, 24466, [12099, 26007], 26460, 28193, 30331, 33759, 36077,
- 36884, 37117, 37709, 30757, 30778, 21162, 24230, [12063, 22303], 22900,
- 24594, 20498, 20826, 20908, 20941, [12049, 20992], 21776, 22612, 22616,
- 22871, 23445, 23798, 23947, 24764, 25237, 25645, 26481, 26691, 26812,
- 26847, 30423, 28120, 28271, 28059, 28783, 29128, 24403, 30168, 31095,
- 31561, 31572, 31570, 31958, 32113, 21040, 33891, 34153, 34276, 35342,
- 35588, [12182, 35910], 36367, 36867, 36879, 37913, 38518, 38957, 39472,
- 38360, 20685, 21205, 21516, 22530, 23566, 24999, 25758, 27934, 30643,
- 31461, 33012, 33796, 36947, 37509, 23776, 40199, 21311, 24471, 24499,
- 28060, 29305, 30563, 31167, 31716, 27602, 29420, 35501, 26627, 27233,
- 20984, 31361, 26932, 23626, 40182, 33515, 23493, [12195, 37193], 28702,
- 22136, 23663, 24775, 25958, 27788, 35930, 36929, 38931, 21585, 26311,
- 37389, 22856, 37027, 20869, 20045, 20970, 34201, 35598, 28760, 25466,
- 37707, 26978, 39348, 32260, 30071, 21335, 26976, 36575, 38627, 27741,
- [12038, 20108], 23612, 24336, 36841, 21250, 36049, [12161, 32905], 34425,
- 24319, [12103, 26085], 20083, [12042, 20837], 22914, 23615, 38894, 20219,
- 22922, 24525, 35469, 28641, 31152, 31074, 23527, 33905, 29483, 29105,
- 24180, 24565, 25467, 25754, 29123, 31896, 20035, 24316, 20043, 22492,
- 22178, 24745, 28611, 32013, 33021, 33075, 33215, 36786, 35223, 34468,
- 24052, 25226, 25773, 35207, 26487, 27874, 27966, 29750, 30772, 23110,
- 32629, 33453, [12218, 39340], 20467, 24259, 25309, 25490, 25943, 26479,
- 30403, 29260, 32972, 32954, 36649, 37197, 20493, 22521, 23186, 26757,
- 26995, 29028, 29437, 36023, 22770, 36064, 38506, 36889, 34687, 31204,
- 30695, 33833, 20271, 21093, 21338, 25293, 26575, 27850, [12137, 30333],
- 31636, 31893, 33334, 34180, 36843, 26333, 28448, 29190, 32283, 33707,
- 39361, [12008, 40614], 20989, 31665, 30834, 31672, 32903, 31560, 27368,
- 24161, 32908, 30033, 30048, [12043, 20843], 37474, 28300, 30330, 37271,
- 39658, 20240, 32624, 25244, 31567, 38309, 40169, 22138, 22617, 34532,
- 38588, 20276, 21028, 21322, 21453, 21467, 24070, 25644, 26001, 26495,
- 27710, 27726, 29256, 29359, 29677, 30036, 32321, 33324, 34281, 36009,
- 31684, [12196, 37318], 29033, 38930, 39151, 25405, 26217, 30058, 30436,
- 30928, 34115, 34542, 21290, 21329, 21542, 22915, 24199, 24444, 24754,
- 25161, 25209, 25259, 26000, [12112, 27604], 27852, 30130, [12138, 30382],
- 30865, 31192, 32203, 32631, 32933, 34987, 35513, 36027, 36991,
- [12206, 38750], [12214, 39131], 27147, 31800, 20633, 23614, 24494, 26503,
- 27608, 29749, 30473, 32654, [12240, 40763], 26570, 31255, 21305,
- [12134, 30091], 39661, 24422, 33181, 33777, 32920, 24380, 24517, 30050,
- 31558, 36924, 26727, 23019, 23195, 32016, 30334, 35628, 20469, 24426,
- 27161, 27703, 28418, 29922, 31080, 34920, 35413, 35961, 24287, 25551,
- 30149, 31186, 33495, 37672, 37618, 33948, 34541, 39981, 21697, 24428,
- 25996, 27996, 28693, 36007, 36051, 38971, 25935, 29942, 19981, 20184,
- 22496, 22827, 23142, 23500, 20904, 24067, 24220, 24598, 25206, 25975,
- 26023, 26222, 28014, [12119, 29238], 31526, 33104, 33178, 33433, 35676,
- 36000, 36070, 36212, [12201, 38428], 38468, 20398, 25771, 27494, 33310,
- 33889, 34154, 37096, 23553, 26963, [12213, 39080], 33914, 34135, 20239,
- 21103, 24489, 24133, 26381, 31119, 33145, 35079, 35206, 28149, 24343,
- 25173, 27832, 20175, 29289, 39826, 20998, 21563, 22132, 22707, 24996,
- 25198, 28954, 22894, 31881, 31966, 32027, 38640, [12098, 25991], 32862,
- 19993, 20341, 20853, 22592, 24163, 24179, 24330, 26564, 20006, 34109,
- 38281, 38491, [12150, 31859], [12212, 38913], 20731, 22721, 30294, 30887,
- 21029, 30629, 34065, 31622, 20559, 22793, [12122, 29255], 31687, 32232,
- 36794, 36820, 36941, 20415, 21193, 23081, 24321, 38829, 20445, 33303,
- 37610, 22275, 25429, 27497, 29995, 35036, 36628, 31298, 21215, 22675,
- 24917, 25098, 26286, [11935, 27597], 31807, 33769, 20515, 20472, 21253,
- 21574, 22577, 22857, 23453, 23792, 23791, 23849, 24214, 25265, 25447,
- 25918, [12101, 26041], 26379, 27861, 27873, 28921, 30770, 32299, 32990,
- 33459, 33804, 34028, 34562, 35090, 35370, 35914, 37030, 37586, 39165,
- 40179, 40300, 20047, 20129, 20621, 21078, 22346, 22952, 24125,
- {f: 2, c: 24536}, 25151, 26292, 26395, 26576, 26834, 20882, 32033, 32938,
- 33192, 35584, 35980, 36031, 37502, 38450, 21536, 38956, 21271, 20693,
- [12056, 21340], 22696, 25778, 26420, 29287, 30566, 31302, 37350, 21187,
- 27809, 27526, 22528, 24140, 22868, 26412, 32763, 20961, 30406, 25705,
- 30952, 39764, [12231, 40635], 22475, 22969, 26151, 26522, 27598, 21737,
- 27097, 24149, 33180, 26517, 39850, 26622, 40018, 26717, 20134, 20451,
- [12060, 21448], 25273, 26411, 27819, 36804, 20397, 32365, 40639, 19975,
- 24930, 28288, 28459, 34067, 21619, 26410, 39749, [11922, 24051], 31637,
- 23724, 23494, 34588, 28234, 34001, 31252, 33032, 22937, 31885,
- [11936, 27665], 30496, 21209, 22818, 28961, 29279, [12141, 30683], 38695,
- 40289, 26891, 23167, 23064, 20901, 21517, 21629, 26126, 30431, 36855,
- 37528, 40180, 23018, 29277, 28357, 20813, 26825, 32191, 32236,
- [12207, 38754], 40634, 25720, 27169, 33538, 22916, 23391, [12113, 27611],
- 29467, 30450, 32178, 32791, 33945, 20786, [12106, 26408], 40665,
- [12140, 30446], 26466, 21247, 39173, 23588, 25147, 31870, 36016, 21839,
- 24758, 32011, [12200, 38272], 21249, 20063, 20918, 22812, 29242, 32822,
- 37326, 24357, [12142, 30690], 21380, 24441, 32004, 34220, 35379, 36493,
- 38742, 26611, 34222, 37971, 24841, 24840, 27833, 30290, 35565, 36664,
- 21807, 20305, 20778, 21191, 21451, 23461, 24189, 24736, 24962, 25558,
- 26377, 26586, 28263, 28044, {f: 2, c: 29494}, 30001, 31056, 35029, 35480,
- 36938, [12194, 37009], 37109, 38596, 34701, [12067, 22805], 20104, 20313,
- 19982, 35465, 36671, 38928, 20653, 24188, 22934, 23481, 24248, 25562,
- 25594, 25793, 26332, 26954, 27096, 27915, 28342, 29076, [12132, 29992],
- 31407, [12154, 32650], 32768, 33865, 33993, 35201, 35617, 36362, 36965,
- 38525, 39178, 24958, 25233, 27442, 27779, 28020, 32716, 32764, 28096,
- 32645, 34746, 35064, 26469, 33713, 38972, 38647, 27931, 32097, 33853,
- 37226, 20081, 21365, 23888, 27396, 28651, 34253, 34349, 35239, 21033,
- 21519, 23653, 26446, 26792, 29702, 29827, 30178, 35023, 35041,
- [12197, 37324], 38626, 38520, 24459, 29575, [12148, 31435], 33870, 25504,
- 30053, 21129, 27969, 28316, 29705, 30041, 30827, 31890, 38534,
- [12015, 31452], [12243, 40845], 20406, 24942, 26053, 34396, 20102, 20142,
- 20698, 20001, 20940, 23534, 26009, 26753, 28092, 29471, 30274, 30637,
- 31260, 31975, 33391, 35538, 36988, 37327, 38517, 38936, [12050, 21147],
- 32209, 20523, 21400, 26519, 28107, 29136, 29747, 33256, 36650, 38563,
- 40023, 40607, 29792, 22593, 28057, 32047, 39006, 20196, 20278, 20363,
- 20919, 21169, 23994, 24604, 29618, 31036, 33491, 37428, 38583, 38646,
- 38666, 40599, 40802, 26278, 27508, 21015, 21155, 28872, 35010, 24265,
- 24651, 24976, 28451, 29001, 31806, 32244, 32879, 34030, 36899, 37676,
- 21570, 39791, 27347, 28809, 36034, 36335, 38706, 21172, 23105, 24266,
- 24324, 26391, 27004, 27028, 28010, 28431, 29282, 29436, 31725,
- [12156, 32769], 32894, 34635, 37070, 20845, 40595, 31108, 32907, 37682,
- 35542, 20525, 21644, 35441, 27498, 36036, 33031, 24785, 26528, 40434,
- 20121, 20120, 39952, 35435, 34241, 34152, 26880, 28286, 30871, 33109,
- 24332, 19984, 19989, 20010, 20017, [12034, 20022], 20028, [12035, 20031],
- 20034, 20054, 20056, 20098, [12037, 20101], 35947, 20106, 33298, 24333,
- 20110, {f: 2, c: 20126}, [12039, 20128], 20130, 20144, 20147, 20150, 20174,
- 20173, 20164, 20166, 20162, 20183, 20190, 20205, 20191, 20215, 20233,
- 20314, 20272, 20315, 20317, 20311, 20295, 20342, 20360, 20367, 20376,
- 20347, 20329, 20336, 20369, 20335, 20358, 20374, 20760, 20436, 20447,
- 20430, 20440, 20443, 20433, 20442, 20432, {f: 2, c: 20452}, 20506, 20520,
- 20500, 20522, 20517, 20485, 20252, 20470, 20513, 20521, 20524, 20478,
- 20463, 20497, 20486, 20547, 20551, 26371, 20565, 20560, 20552, 20570,
- 20566, 20588, 20600, 20608, 20634, 20613, 20660, 20658, {f: 2, c: 20681},
- 20659, 20674, 20694, 20702, 20709, 20717, 20707, 20718, 20729, 20725,
- 20745, {f: 2, c: 20737}, 20758, 20757, 20756, 20762, 20769, 20794, 20791,
- 20796, 20795, [12041, 20799], [11918, 20800], 20818, 20812, 20820, 20834,
- 31480, {f: 2, c: 20841}, 20846, 20864, [12044, 20866], 22232, 20876, 20873,
- 20879, 20881, 20883, 20885, [12045, 20886], 20900, 20902, 20898,
- {f: 2, c: 20905}, [12046, 20907], 20915, {f: 2, c: 20913}, 20912, 20917,
- 20925, 20933, 20937, 20955, [12047, 20960], 34389, 20969, 20973, 20976,
- [12048, 20981], 20990, 20996, 21003, 21012, 21006, 21031, 21034, 21038,
- 21043, 21049, 21071, 21060, {f: 2, c: 21067}, 21086, 21076, 21098, 21108,
- 21097, 21107, 21119, 21117, 21133, 21140, 21138, 21105, 21128, 21137,
- 36776, 36775, {f: 2, c: 21164}, 21180, 21173, 21185, 21197, 21207, 21214,
- 21219, 21222, 39149, 21216, 21235, 21237, 21240, [12051, 21241], 21254,
- 21256, 30008, 21261, 21264, 21263, [12052, 21269], [12053, 21274], 21283,
- 21295, 21297, 21299, [12054, 21304], 21312, 21318, 21317, 19991, 21321,
- 21325, 20950, 21342, [12057, 21353], 21358, 22808, 21371, 21367,
- [12058, 21378], 21398, 21408, 21414, 21413, 21422, 21424, [12059, 21430],
- 21443, 31762, 38617, 21471, 26364, 29166, 21486, 21480, 21485, 21498,
- 21505, 21565, 21568, {f: 2, c: 21548}, 21564, 21550, 21558, 21545, 21533,
- 21582, 21647, 21621, 21646, 21599, 21617, 21623, 21616, 21650, 21627,
- 21632, 21622, 21636, 21648, 21638, 21703, 21666, 21688, 21669, 21676,
- 21700, 21704, 21672, 21675, 21698, 21668, 21694, 21692, 21720,
- {f: 2, c: 21733}, 21775, 21780, 21757, 21742, 21741, 21754, 21730, 21817,
- 21824, 21859, 21836, 21806, 21852, 21829, {f: 2, c: 21846}, 21816, 21811,
- 21853, 21913, 21888, 21679, 21898, 21919, 21883, 21886, 21912, 21918,
- 21934, 21884, 21891, 21929, 21895, 21928, 21978, 21957, 21983, 21956,
- 21980, 21988, 21972, 22036, 22007, 22038, 22014, 22013, 22043, 22009,
- 22094, 22096, 29151, 22068, 22070, 22066, 22072, 22123, 22116, 22063,
- 22124, 22122, 22150, 22144, 22154, 22176, 22164, 22159, 22181, 22190,
- 22198, 22196, 22210, 22204, 22209, 22211, 22208, 22216, 22222, 22225,
- 22227, [12062, 22231], 22254, 22265, 22272, 22271, 22276, 22281, 22280,
- 22283, 22285, 22291, 22296, 22294, 21959, 22300, 22310, {f: 2, c: 22327},
- 22350, 22331, 22336, 22351, 22377, 22464, 22408, 22369, 22399, 22409,
- 22419, 22432, 22451, 22436, 22442, 22448, 22467, 22470, 22484,
- {f: 2, c: 22482}, 22538, 22486, 22499, 22539, 22553, 22557, 22642, 22561,
- 22626, 22603, 22640, 27584, 22610, 22589, 22649, 22661, 22713, 22687,
- 22699, 22714, 22750, 22715, 22712, 22702, 22725, 22739, 22737, 22743,
- 22745, 22744, 22757, 22748, 22756, 22751, 22767, 22778, 22777,
- {f: 3, c: 22779}, [12065, 22786], [12066, 22794], 22800, 22811, 26790,
- 22821, {f: 2, c: 22828}, 22834, 22840, 22846, 31442, 22869, 22864, 22862,
- 22874, 22872, 22882, 22880, 22887, 22892, 22889, 22904, 22913, 22941,
- 20318, 20395, 22947, 22962, 22982, 23016, 23004, 22925, {f: 2, c: 23001},
- 23077, 23071, 23057, 23068, 23049, 23066, 23104, 23148, 23113,
- {f: 2, c: 23093}, 23138, 23146, 23194, 23228, 23230, 23243, 23234, 23229,
- 23267, 23255, 23270, 23273, 23254, {f: 2, c: 23290}, 23308, 23307, 23318,
- 23346, 23248, 23338, 23350, 23358, 23363, 23365, 23360, 23377, 23381,
- {f: 2, c: 23386}, 23397, 23401, 23408, 23411, 23413, 23416, 25992, 23418,
- [12071, 23424], 23427, 23462, 23480, 23491, 23495, 23497, 23508, 23504,
- 23524, 23526, 23522, 23518, 23525, 23531, 23536, 23542, 23539, 23557,
- {f: 2, c: 23559}, 23565, 23571, 23584, [11920, 12074, 23586], 23592,
- [12075, 23608], 23609, 23617, 23622, 23630, 23635, 23632, 23631, 23409,
- 23660, [12076, 23662], 20066, 23670, 23673, 23692, 23697, 23700, 22939,
- 23723, 23739, 23734, 23740, 23735, 23749, 23742, 23751, 23769, 23785,
- 23805, 23802, 23789, 23948, 23786, 23819, 23829, 23831, 23900, 23839,
- 23835, 23825, 23828, 23842, 23834, 23833, 23832, 23884, 23890, 23886,
- 23883, 23916, 23923, 23926, 23943, 23940, 23938, 23970, 23965, 23980,
- 23982, 23997, 23952, 23991, 23996, 24009, 24013, 24019, 24018, 24022,
- [12078, 24027], 24043, 24050, 24053, 24075, 24090, 24089, 24081, 24091,
- {f: 2, c: 24118}, 24132, 24131, 24128, 24142, 24151, 24148, 24159, 24162,
- 24164, 24135, {f: 2, c: 24181}, [11923, 12083, 24186], 40636,
- [12084, 24191], 24224, {f: 2, c: 24257}, 24264, 24272, 24271, 24278, 24291,
- 24285, {f: 2, c: 24282}, 24290, 24289, {f: 2, c: 24296}, 24300, 24305,
- 24307, 24304, [12085, 24308], 24312, [12086, 24318], 24323, 24329, 24413,
- 24412, [12087, 24331], 24337, 24342, 24361, 24365, 24376, 24385, 24392,
- 24396, 24398, 24367, [11924, 24401], {f: 2, c: 24406}, 24409,
- [12090, 24417], 24429, [12091, 24435], 24439, 24451, 24450, 24447, 24458,
- 24456, 24465, 24455, 24478, 24473, 24472, 24480, 24488, 24493, 24508,
- 24534, 24571, 24548, 24568, 24561, 24541, 24755, 24575, 24609, 24672,
- 24601, 24592, 24617, 24590, 24625, 24603, 24597, 24619, 24614, 24591,
- 24634, 24666, 24641, 24682, 24695, 24671, 24650, 24646, 24653, 24675,
- 24643, 24676, 24642, 24684, 24683, 24665, 24705, 24717, 24807, 24707,
- 24730, 24708, 24731, {f: 2, c: 24726}, 24722, 24743, 24715, 24801, 24760,
- 24800, 24787, 24756, 24560, 24765, 24774, 24757, 24792, 24909, 24853,
- 24838, {f: 2, c: 24822}, 24832, 24820, 24826, 24835, 24865, 24827, 24817,
- {f: 2, c: 24845}, 24903, 24894, 24872, 24871, 24906, 24895, 24892, 24876,
- 24884, 24893, 24898, 24900, 24947, 24951, {f: 3, c: 24920}, 24939, 24948,
- 24943, 24933, 24945, 24927, 24925, 24915, 24949, 24985, 24982, 24967,
- 25004, 24980, 24986, 24970, 24977, 25003, 25006, 25036, 25034, 25033,
- 25079, 25032, 25027, 25030, 25018, 25035, 32633, 25037, 25062, 25059,
- 25078, 25082, 25076, 25087, 25085, 25084, 25086, 25088, [12093, 25096],
- 25097, 25101, 25100, 25108, 25115, 25118, 25121, 25130, 25134, 25136,
- {f: 2, c: 25138}, 25153, 25166, 25182, 25187, 25179, 25184, 25192, 25212,
- 25218, 25225, 25214, {f: 2, c: 25234}, 25238, 25300, 25219, 25236, 25303,
- 25297, 25275, 25295, 25343, 25286, 25812, 25288, 25308, 25292, 25290,
- 25282, 25287, 25243, 25289, 25356, 25326, 25329, 25383, 25346, 25352,
- 25327, 25333, 25424, 25406, 25421, 25628, 25423, 25494, 25486, 25472,
- 25515, 25462, 25507, 25487, 25481, 25503, 25525, 25451, 25449, 25534,
- 25577, 25536, 25542, 25571, 25545, 25554, 25590, 25540, 25622, 25652,
- 25606, 25619, 25638, 25654, 25885, 25623, 25640, 25615, 25703, 25711,
- 25718, 25678, 25898, 25749, 25747, 25765, 25769, 25736, 25788, 25818,
- 25810, 25797, 25799, 25787, 25816, 25794, 25841, 25831, 33289,
- {f: 2, c: 25824}, 25260, 25827, 25839, 25900, 25846, 25844, 25842, 25850,
- 25856, 25853, 25880, 25884, 25861, 25892, 25891, 25899, [12097, 25908],
- [11929, 25909], 25911, 25910, 25912, 30027, 25928, 25942, 25941, 25933,
- 25944, 25950, 25949, 25970, 25976, {f: 2, c: 25986}, 35722, 26011, 26015,
- 26027, 26039, 26051, 26054, 26049, 26052, 26060, 26066, 26075, 26073,
- [12102, 26080], [11931, 26081], 26097, 26482, 26122, 26115, 26107, 26483,
- {f: 2, c: 26165}, 26164, 26140, 26191, 26180, 26185, 26177, 26206, 26205,
- 26212, {f: 2, c: 26215}, 26207, 26210, 26224, 26243, 26248, 26254, 26249,
- 26244, 26264, 26269, 26305, 26297, 26313, 26302, 26300, 26308, 26296,
- 26326, 26330, 26336, 26175, 26342, 26345, [12104, 26352], 26357, 26359,
- 26383, 26390, 26398, {f: 2, c: 26406}, 38712, 26414, 26431, 26422, 26433,
- 26424, 26423, 26438, 26462, 26464, 26457, {f: 2, c: 26467}, 26505, 26480,
- 26537, 26492, 26474, 26508, 26507, 26534, 26529, 26501, 26551, 26607,
- 26548, 26604, 26547, 26601, 26552, 26596, 26590, 26589, 26594, 26606,
- 26553, 26574, 26566, 26599, 27292, 26654, 26694, 26665, 26688, 26701,
- 26674, 26702, 26803, 26667, 26713, 26723, 26743, 26751, 26783, 26767,
- 26797, 26772, 26781, 26779, 26755, 27310, 26809, 26740, 26805, 26784,
- 26810, 26895, 26765, 26750, 26881, 26826, 26888, 26840, 26914, 26918,
- 26849, 26892, 26829, 26836, 26855, 26837, 26934, 26898, 26884, 26839,
- 26851, 26917, 26873, 26848, 26863, 26920, 26922, 26906, 26915, 26913,
- 26822, 27001, 26999, 26972, 27000, 26987, 26964, 27006, 26990, 26937,
- 26996, 26941, 26969, 26928, 26977, 26974, 26973, 27009, 26986, 27058,
- 27054, 27088, 27071, 27073, 27091, 27070, 27086, 23528, 27082, 27101,
- 27067, 27075, 27047, 27182, 27025, 27040, 27036, 27029, 27060, 27102,
- 27112, 27138, 27163, 27135, 27402, 27129, 27122, 27111, 27141, 27057,
- 27166, 27117, 27156, 27115, 27146, 27154, 27329, 27171, 27155, 27204,
- 27148, 27250, 27190, 27256, 27207, 27234, 27225, 27238, 27208, 27192,
- 27170, 27280, 27277, 27296, 27268, {f: 2, c: 27298}, 27287, 34327, 27323,
- 27331, 27330, 27320, 27315, 27308, 27358, 27345, 27359, 27306, 27354,
- 27370, 27387, 27397, 34326, 27386, 27410, 27414, 39729, 27423, 27448,
- 27447, 30428, 27449, 39150, 27463, 27459, 27465, 27472, 27481, 27476,
- 27483, 27487, 27489, 27512, [12109, 27513], {f: 2, c: 27519}, 27524, 27523,
- 27533, 27544, 27541, 27550, 27556, {f: 2, c: 27562}, 27567, 27570, 27569,
- [12110, 27571], 27575, 27580, 27590, [12111, 27595], 27603, 27615, 27628,
- 27627, 27635, 27631, 40638, 27656, 27667, [12115, 27668], 27675, 27684,
- 27683, 27742, 27733, 27746, 27754, 27778, 27789, 27802, 27777, 27803,
- 27774, 27752, 27763, 27794, 27792, 27844, 27889, 27859, 27837, 27863,
- 27845, 27869, 27822, 27825, 27838, 27834, 27867, 27887, 27865, 27882,
- 27935, 34893, 27958, 27947, 27965, 27960, 27929, 27957, 27955, 27922,
- 27916, 28003, 28051, 28004, 27994, 28025, 27993, 28046, 28053, 28644,
- 28037, 28153, 28181, 28170, 28085, 28103, 28134, 28088, 28102, 28140,
- 28126, 28108, 28136, 28114, 28101, 28154, 28121, 28132, 28117, 28138,
- 28142, 28205, 28270, 28206, 28185, 28274, 28255, 28222, 28195, 28267,
- 28203, 28278, 28237, 28191, 28227, 28218, 28238, 28196, 28415, 28189,
- 28216, 28290, 28330, 28312, 28361, 28343, 28371, 28349, 28335, 28356,
- 28338, {f: 2, c: 28372}, 28303, 28325, 28354, 28319, 28481, 28433, 28748,
- 28396, 28408, 28414, 28479, 28402, 28465, 28399, 28466, 28364, 28478,
- 28435, 28407, 28550, 28538, 28536, 28545, 28544, 28527, 28507, 28659,
- 28525, 28546, 28540, 28504, 28558, 28561, 28610, 28518, 28595, 28579,
- 28577, 28580, 28601, 28614, 28586, 28639, 28629, 28652, 28628, 28632,
- 28657, 28654, 28635, 28681, 28683, 28666, 28689, 28673, 28687, 28670,
- 28699, 28698, 28532, 28701, 28696, 28703, 28720, 28734, 28722, 28753,
- 28771, 28825, 28818, 28847, 28913, 28844, 28856, 28851, 28846, 28895,
- 28875, 28893, 28889, 28937, 28925, 28956, 28953, 29029, 29013, 29064,
- 29030, 29026, 29004, 29014, 29036, 29071, 29179, 29060, 29077, 29096,
- 29100, 29143, 29113, 29118, 29138, 29129, 29140, 29134, 29152, 29164,
- 29159, 29173, 29180, 29177, 29183, 29197, 29200, 29211, 29224, 29229,
- 29228, 29232, 29234, [12120, 29243], 29244, [12121, 29247], 29248, 29254,
- 29259, 29272, 29300, 29310, 29314, 29313, 29319, 29330, 29334, 29346,
- 29351, 29369, 29362, 29379, 29382, 29380, 29390, 29394, 29410,
- {f: 2, c: 29408}, 29433, 29431, 20495, 29463, 29450, 29468, 29462, 29469,
- 29492, 29487, 29481, 29477, 29502, {f: 2, c: 29518}, 40664, 29527, 29546,
- 29544, 29552, 29560, 29557, 29563, 29562, 29640, 29619, 29646, 29627,
- 29632, 29669, 29678, 29662, 29858, 29701, 29807, 29733, 29688, 29746,
- 29754, 29781, 29759, 29791, 29785, 29761, 29788, 29801, 29808, 29795,
- 29802, 29814, 29822, 29835, 29854, 29863, 29898, 29903, 29908, 29681,
- 29920, 29923, 29927, 29929, 29934, 29938, {f: 2, c: 29936}, 29944, 29943,
- 29956, 29955, 29957, 29964, 29966, 29965, 29973, 29971, 29982, 29990,
- 29996, 30012, 30020, 30029, 30026, 30025, 30043, 30022, 30042, 30057,
- 30052, 30055, 30059, 30061, 30072, 30070, {f: 2, c: 30086}, 30068, 30090,
- 30089, 30082, 30100, 30106, 30109, 30117, 30115, 30146, 30131, 30147,
- 30133, 30141, 30136, 30140, 30129, 30157, 30154, 30162, 30169, 30179,
- 30174, {f: 2, c: 30206}, 30204, 30209, 30192, 30202, {f: 2, c: 30194},
- 30219, 30221, 30217, 30239, 30247, {f: 3, c: 30240}, 30244, 30260, 30256,
- 30267, {f: 2, c: 30279}, 30278, 30300, 30296, {f: 2, c: 30305},
- {f: 3, c: 30312}, 30311, 30316, 30320, 30322, [12136, 30326], 30328, 30332,
- 30336, 30339, 30344, 30347, 30350, 30358, 30355, {f: 2, c: 30361}, 30384,
- 30388, {f: 3, c: 30392}, 30402, 30413, 30422, 30418, 30430, 30433, 30437,
- 30439, 30442, 34351, 30459, 30472, 30471, 30468, 30505, 30500, 30494,
- {f: 2, c: 30501}, 30491, {f: 2, c: 30519}, 30535, 30554, 30568, 30571,
- 30555, 30565, 30591, 30590, 30585, 30606, 30603, 30609, 30624, 30622,
- 30640, 30646, 30649, 30655, {f: 2, c: 30652}, 30651, 30663, 30669, 30679,
- 30682, 30684, 30691, 30702, 30716, 30732, 30738, 31014, 30752, 31018,
- 30789, 30862, 30836, 30854, 30844, 30874, 30860, 30883, 30901, 30890,
- 30895, 30929, 30918, 30923, 30932, 30910, 30908, 30917, 30922, 30956,
- 30951, 30938, 30973, 30964, 30983, 30994, 30993, 31001, 31020, 31019,
- 31040, 31072, 31063, 31071, 31066, 31061, 31059, 31098, 31103, 31114,
- 31133, 31143, 40779, 31146, 31150, 31155, {f: 2, c: 31161}, 31177, 31189,
- 31207, 31212, 31201, 31203, 31240, 31245, {f: 2, c: 31256}, 31264, 31263,
- 31104, 31281, 31291, 31294, 31287, 31299, 31319, 31305, {f: 2, c: 31329},
- 31337, 40861, 31344, 31353, 31357, 31368, 31383, 31381, 31384, 31382,
- 31401, 31432, 31408, 31414, 31429, 31428, 31423, 36995, 31431, 31434,
- 31437, 31439, 31445, 31443, {f: 2, c: 31449}, 31453, {f: 2, c: 31457},
- 31462, 31469, 31472, 31490, 31503, 31498, 31494, 31539, {f: 2, c: 31512},
- 31518, 31541, 31528, 31542, 31568, 31610, 31492, 31565, 31499, 31564,
- 31557, 31605, 31589, 31604, 31591, {f: 2, c: 31600}, 31596, 31598, 31645,
- 31640, 31647, 31629, 31644, 31642, 31627, 31634, 31631, 31581, 31641,
- 31691, 31681, 31692, 31695, 31668, 31686, 31709, 31721, 31761, 31764,
- 31718, 31717, 31840, 31744, 31751, 31763, 31731, 31735, 31767, 31757,
- 31734, 31779, 31783, 31786, 31775, 31799, 31787, 31805, 31820, 31811,
- 31828, 31823, 31808, 31824, 31832, 31839, 31844, 31830, 31845, 31852,
- 31861, 31875, 31888, 31908, 31917, 31906, 31915, 31905, 31912, 31923,
- 31922, 31921, 31918, 31929, 31933, 31936, 31941, 31938, 31960, 31954,
- 31964, 31970, 39739, 31983, 31986, 31988, 31990, 31994, 32006, 32002,
- 32028, 32021, 32010, 32069, 32075, 32046, 32050, 32063, 32053, 32070,
- 32115, 32086, 32078, 32114, 32104, 32110, 32079, 32099, 32147, 32137,
- 32091, 32143, 32125, 32155, 32186, 32174, 32163, 32181, 32199, 32189,
- 32171, 32317, 32162, 32175, 32220, 32184, 32159, 32176, 32216, 32221,
- 32228, 32222, 32251, 32242, 32225, 32261, 32266, 32291, 32289, 32274,
- 32305, 32287, 32265, 32267, 32290, 32326, 32358, 32315, 32309, 32313,
- 32323, 32311, 32306, 32314, 32359, 32349, 32342, 32350, {f: 2, c: 32345},
- 32377, 32362, 32361, 32380, 32379, 32387, 32213, 32381, 36782, 32383,
- {f: 2, c: 32392}, 32396, 32402, 32400, {f: 2, c: 32403}, 32406, 32398,
- {f: 2, c: 32411}, 32568, 32570, 32581, {f: 3, c: 32588}, 32592,
- [12153, 32593], 32597, 32596, 32600, {f: 2, c: 32607}, {f: 2, c: 32616},
- 32615, 32632, 32642, 32646, 32643, 32648, 32647, 32652, 32660, 32670,
- 32669, 32666, 32675, 32687, 32690, 32697, 32686, 32694, 32696, 35697,
- {f: 2, c: 32709}, 32714, 32725, 32724, 32737, 32742, 32745, 32755, 32761,
- 39132, 32774, 32772, 32779, [12158, 32786], {f: 2, c: 32792}, 32796, 32801,
- 32808, 32831, 32827, 32842, 32838, 32850, 32856, 32858, 32863, 32866,
- 32872, 32883, 32882, 32880, 32886, 32889, 32893, [12160, 32895], 32900,
- 32902, 32901, 32923, 32915, 32922, 32941, 20880, 32940, 32987, 32997,
- 32985, 32989, 32964, 32986, 32982, 33033, 33007, 33009, 33051, 33065,
- 33059, 33071, 33099, 38539, 33094, 33086, 33107, 33105, 33020, 33137,
- 33134, {f: 2, c: 33125}, 33140, 33155, 33160, 33162, 33152, 33154, 33184,
- 33173, 33188, 33187, 33119, 33171, 33193, 33200, 33205, 33214, 33208,
- 33213, 33216, 33218, 33210, 33225, 33229, 33233, 33241, 33240, 33224,
- 33242, {f: 2, c: 33247}, 33255, {f: 2, c: 33274}, 33278, {f: 2, c: 33281},
- 33285, 33287, 33290, 33293, 33296, 33302, 33321, 33323, 33336, 33331,
- 33344, 33369, 33368, 33373, 33370, 33375, 33380, 33378, 33384,
- {f: 2, c: 33386}, 33326, 33393, 33399, [12171, 33400], 33406, 33421, 33426,
- 33451, 33439, 33467, 33452, 33505, 33507, 33503, 33490, 33524, 33523,
- 33530, 33683, 33539, 33531, 33529, 33502, 33542, 33500, 33545, 33497,
- 33589, 33588, 33558, 33586, 33585, 33600, 33593, 33616, 33605, 33583,
- 33579, {f: 2, c: 33559}, 33669, 33690, 33706, 33695, 33698, 33686, 33571,
- 33678, 33671, 33674, 33660, 33717, 33651, 33653, 33696, 33673, 33704,
- 33780, 33811, 33771, 33742, 33789, 33795, 33752, 33803, 33729, 33783,
- 33799, 33760, 33778, 33805, 33826, 33824, 33725, 33848, 34054, 33787,
- 33901, 33834, 33852, 34138, 33924, 33911, 33899, 33965, 33902, 33922,
- 33897, 33862, 33836, 33903, 33913, 33845, 33994, 33890, 33977, 33983,
- 33951, 34009, 33997, 33979, 34010, 34000, 33985, 33990, 34006, 33953,
- 34081, 34047, 34036, {f: 2, c: 34071}, 34092, 34079, 34069, 34068, 34044,
- 34112, 34147, 34136, 34120, 34113, 34306, 34123, 34133, 34176, 34212,
- 34184, 34193, 34186, 34216, 34157, 34196, 34203, 34282, 34183, 34204,
- 34167, 34174, 34192, 34249, 34234, 34255, 34233, 34256, 34261, 34269,
- 34277, 34268, 34297, 34314, 34323, 34315, 34302, 34298, 34310, 34338,
- 34330, 34352, 34367, [12172, 34381], 20053, 34388, 34399, 34407, 34417,
- 34451, 34467, {f: 2, c: 34473}, {f: 2, c: 34443}, 34486, 34479, 34500,
- 34502, 34480, 34505, 34851, 34475, 34516, 34526, 34537, 34540, 34527,
- 34523, 34543, 34578, 34566, 34568, 34560, 34563, 34555, 34577, 34569,
- 34573, 34553, 34570, 34612, 34623, 34615, 34619, 34597, 34601, 34586,
- 34656, 34655, 34680, 34636, 34638, 34676, 34647, 34664, 34670, 34649,
- 34643, 34659, 34666, 34821, 34722, 34719, 34690, 34735, 34763, 34749,
- 34752, 34768, 38614, 34731, 34756, 34739, 34759, 34758, 34747, 34799,
- 34802, 34784, 34831, 34829, 34814, {f: 2, c: 34806}, 34830, 34770, 34833,
- 34838, 34837, 34850, 34849, 34865, 34870, 34873, 34855, 34875, 34884,
- 34882, 34898, 34905, 34910, 34914, 34923, 34945, 34942, 34974, 34933,
- 34941, 34997, 34930, 34946, 34967, 34962, 34990, 34969, 34978, 34957,
- 34980, 34992, 35007, 34993, {f: 2, c: 35011}, 35028, {f: 2, c: 35032},
- 35037, 35065, 35074, 35068, 35060, 35048, 35058, 35076, 35084, 35082,
- 35091, 35139, 35102, 35109, {f: 2, c: 35114}, 35137, 35140, 35131, 35126,
- 35128, 35148, 35101, 35168, 35166, 35174, 35172, 35181, 35178, 35183,
- 35188, 35191, [12177, 35198], 35203, 35208, 35210, 35219, 35224, 35233,
- 35241, 35238, 35244, 35247, 35250, 35258, 35261, {f: 2, c: 35263}, 35290,
- {f: 2, c: 35292}, 35303, 35316, 35320, 35331, 35350, 35344, 35340, 35355,
- 35357, 35365, 35382, 35393, 35419, 35410, 35398, 35400, 35452, 35437,
- 35436, 35426, 35461, 35458, 35460, 35496, 35489, 35473, {f: 2, c: 35493},
- 35482, 35491, 35524, 35533, 35522, 35546, 35563, 35571, 35559, 35556,
- 35569, 35604, 35552, 35554, 35575, 35550, 35547, 35596, 35591, 35610,
- 35553, 35606, 35600, 35607, 35616, 35635, 38827, 35622, 35627, 35646,
- 35624, 35649, 35660, 35663, 35662, 35657, 35670, 35675, 35674, 35691,
- 35679, 35692, 35695, 35700, 35709, 35712, 35724, 35726, {f: 2, c: 35730},
- 35734, {f: 2, c: 35737}, 35898, 35905, 35903, 35912, 35916, 35918, 35920,
- [12183, 35925], 35938, 35948, [12184, 35960], 35962, 35970, 35977, 35973,
- 35978, {f: 2, c: 35981}, 35988, 35964, 35992, 25117, 36013, 36010, 36029,
- {f: 2, c: 36018}, 36014, 36022, 36040, 36033, 36068, 36067, 36058, 36093,
- {f: 2, c: 36090}, {f: 2, c: 36100}, 36106, 36103, 36111, 36109, 36112,
- 40782, 36115, 36045, 36116, 36118, 36199, 36205, 36209, 36211, 36225,
- 36249, 36290, 36286, 36282, 36303, 36314, 36310, 36300, 36315, 36299,
- {f: 2, c: 36330}, 36319, 36323, 36348, {f: 2, c: 36360}, 36351,
- {f: 2, c: 36381}, 36368, 36383, 36418, 36405, 36400, 36404, 36426, 36423,
- 36425, 36428, 36432, 36424, 36441, 36452, 36448, 36394, 36451, 36437,
- 36470, 36466, 36476, 36481, 36487, 36485, 36484, 36491, 36490, 36499,
- 36497, 36500, 36505, 36522, 36513, 36524, 36528, 36550, 36529, 36542,
- 36549, 36552, 36555, 36571, 36579, 36604, 36603, 36587, 36606, 36618,
- 36613, 36629, 36626, 36633, 36627, 36636, 36639, 36635, 36620, 36646,
- 36659, 36667, 36665, 36677, 36674, 36670, 36684, 36681, 36678, 36686,
- 36695, 36700, {f: 3, c: 36706}, 36764, 36767, 36771, 36781, 36783, 36791,
- 36826, 36837, 36834, 36842, 36847, 36999, 36852, 36869, {f: 2, c: 36857},
- 36881, 36885, 36897, 36877, 36894, 36886, 36875, 36903, 36918, 36917,
- 36921, 36856, {f: 4, c: 36943}, 36878, 36937, 36926, 36950, 36952, 36958,
- 36968, 36975, 36982, 38568, 36978, 36994, 36989, 36993, 36992, 37002,
- 37001, 37007, 37032, 37039, 37041, 37045, 37090, 37092, 25160, 37083,
- 37122, 37138, 37145, 37170, 37168, 37194, 37206, 37208, 37219, 37221,
- 37225, 37235, 37234, 37259, 37257, 37250, 37282, 37291, 37295, 37290,
- 37301, 37300, 37306, {f: 2, c: 37312}, 37321, 37323, 37328, 37334, 37343,
- 37345, 37339, 37372, {f: 2, c: 37365}, 37406, 37375, 37396, 37420, 37397,
- 37393, 37470, 37463, 37445, 37449, 37476, 37448, 37525, 37439, 37451,
- 37456, 37532, 37526, 37523, 37531, 37466, 37583, 37561, 37559, 37609,
- 37647, 37626, 37700, 37678, 37657, 37666, 37658, 37667, 37690, 37685,
- 37691, 37724, 37728, 37756, 37742, 37718, 37808, {f: 2, c: 37804}, 37780,
- 37817, {f: 2, c: 37846}, 37864, 37861, 37848, 37827, 37853, 37840, 37832,
- 37860, 37914, 37908, 37907, 37891, 37895, 37904, 37942, 37931, 37941,
- 37921, 37946, 37953, 37970, 37956, 37979, 37984, 37986, 37982, 37994,
- 37417, 38000, 38005, 38007, 38013, 37978, 38012, 38014, 38017, 38015,
- 38274, 38279, 38282, 38292, 38294, {f: 2, c: 38296}, 38304, 38312, 38311,
- 38317, 38332, 38331, 38329, 38334, 38346, 28662, 38339, 38349, 38348,
- 38357, 38356, 38358, 38364, 38369, 38373, 38370, 38433, 38440,
- {f: 2, c: 38446}, 38466, 38476, 38479, 38475, 38519, 38492, 38494, 38493,
- 38495, 38502, 38514, 38508, 38541, 38552, 38549, 38551, 38570, 38567,
- {f: 2, c: 38577}, 38576, 38580, [12202, 38582], 38584, [12203, 38585],
- 38606, 38603, 38601, 38605, 35149, 38620, 38669, 38613, 38649, 38660,
- 38662, 38664, 38675, 38670, 38673, 38671, 38678, 38681, 38692, 38698,
- 38704, 38713, {f: 2, c: 38717}, 38724, 38726, 38728, 38722, 38729, 38748,
- 38752, 38756, 38758, 38760, 21202, 38763, 38769, 38777, 38789, 38780,
- 38785, 38778, 38790, 38795, {f: 2, c: 38799}, 38812, 38824, 38822, 38819,
- {f: 2, c: 38835}, 38851, 38854, 38856, [12209, 38859], 38876,
- [12210, 38893], 40783, 38898, 31455, 38902, 38901, 38927, 38924, 38968,
- 38948, 38945, 38967, 38973, 38982, 38991, 38987, 39019, {f: 3, c: 39023},
- 39028, 39027, 39082, 39087, 39089, 39094, 39108, 39107, 39110, 39145,
- 39147, 39171, 39177, 39186, 39188, 39192, 39201, {f: 2, c: 39197}, 39204,
- 39200, 39212, 39214, {f: 2, c: 39229}, 39234, 39241, 39237, 39248, 39243,
- {f: 2, c: 39249}, 39244, 39253, {f: 2, c: 39319}, 39333, {f: 2, c: 39341},
- 39356, 39391, 39387, 39389, 39384, 39377, {f: 2, c: 39405},
- {f: 2, c: 39409}, 39419, 39416, 39425, 39439, 39429, 39394, 39449, 39467,
- 39479, 39493, 39490, 39488, 39491, 39486, 39509, 39501, 39515, 39511,
- 39519, 39522, 39525, 39524, 39529, 39531, 39530, 39597, 39600, 39612,
- 39616, 39631, 39633, {f: 2, c: 39635}, 39646, [12221, 39647],
- {f: 2, c: 39650}, 39654, 39663, 39659, 39662, 39668, 39665, 39671, 39675,
- 39686, 39704, 39706, 39711, {f: 2, c: 39714}, [12222, 39717],
- {f: 4, c: 39719}, 39726, [12223, 39727], [12224, 39730], 39748, 39747,
- 39759, {f: 2, c: 39757}, 39761, 39768, 39796, 39827, 39811, 39825,
- {f: 2, c: 39830}, {f: 2, c: 39839}, 39848, 39860, 39872, 39882, 39865,
- 39878, 39887, {f: 2, c: 39889}, 39907, 39906, 39908, 39892, 39905, 39994,
- 39922, 39921, 39920, 39957, 39956, 39945, 39955, 39948, 39942, 39944,
- 39954, 39946, 39940, 39982, 39963, 39973, 39972, 39969, 39984, 40007,
- 39986, 40006, 39998, 40026, 40032, 40039, 40054, 40056, 40167, 40172,
- 40176, 40201, 40200, 40171, 40195, 40198, 40234, 40230, 40367, 40227,
- 40223, 40260, 40213, 40210, 40257, 40255, 40254, 40262, 40264,
- {f: 2, c: 40285}, 40292, 40273, 40272, 40281, 40306, 40329, 40327, 40363,
- 40303, 40314, 40346, 40356, 40361, 40370, 40388, 40385, 40379, 40376,
- 40378, 40390, 40399, 40386, 40409, 40403, 40440, 40422, 40429, 40431,
- 40445, {f: 2, c: 40474}, 40478, [12228, 40565], 40569, 40573, 40577, 40584,
- {f: 2, c: 40587}, 40594, 40597, 40593, 40605, [12230, 40613], 40617, 40632,
- 40618, 40621, 38753, 40652, {f: 3, c: 40654}, 40660, 40668, 40670, 40669,
- 40672, 40677, 40680, 40687, 40692, {f: 2, c: 40694}, [12235, 40697],
- {f: 2, c: 40699}, [12236, 40701], {f: 2, c: 40711}, 30391, 40725, 40737,
- 40748, 40766, [12241, 40778], [12242, 40786], 40788, 40803,
- {f: 3, c: 40799}, {f: 2, c: 40806}, 40812, 40810, 40823, 40818, 40822,
- 40853, [12244, 40860], [12245, 40864], 22575, 27079, 36953, 29796, 0,
- {f: 76, c: 9472}, {f: 20, c: 9312}, {f: 10, c: 8544}, 13129, 13076, 0,
- 13133, 0, 13095, 0, 13110, 13137, 0, 13069, 13094, 0, 13099, 13130, 0,
- {f: 3, c: 13212}, {f: 2, c: 13198}, 13252, 13217, 12317, 12319, 8470,
- 13261, 0, {f: 5, c: 12964}, {f: 2, c: 12849}, 12857, 13182, 13181, 13180,
- 8750, 8721, {s: 3}, 8735, 8895, 0, 0, 21854, {s: 7}, 167133, 0, 0, 28976,
- 0, 40407, {s: 4}, 64054, 0, 0, 22169, 15694, {s: 4}, 20448, 0, 0, 36544, 0,
- 194797, {s: 4}, 153716, 32363, 33606, 167670, {s: 3}, 40572, 0, 0, 26171,
- 0, 40628, {s: 4}, 26629, {s: 5}, 23650, 0, 194780, 0, 32353, 0, 0, 64070,
- {s: 5}, 34083, 37292, {s: 7}, 34796, {s: 8}, 25620, 0, 0, 39506, {s: 4},
- 64074, 0, 194692, {s: 4}, 31774, {s: 6}, 64016, 25681, 0, 0, 63980, 22625,
- 39002, 0, 194679, {s: 3}, 31153, 0, 28678, {s: 9}, 22218, {s: 3}, 21085, 0,
- 28497, 37297, {s: 10}, 64106, {s: 6}, 38960, 0, 40629, {s: 9}, 33802,
- 63939, {f: 2, c: 63890}, 63897, 0, 34847, 194575, 0, 194771, 194584,
- {s: 7}, 137754, 23643, {s: 4}, 25890, 0, 0, 26618, 0, 26766, 0, 148432,
- 194848, {s: 21}, 34110, {s: 15}, 30562, {s: 12}, 65075, 0,
- {f: 2, c: 65073}, {s: 4}, 65072, {f: 2, c: 65077}, {f: 2, c: 65081}, 0, 0,
- {f: 2, c: 65079}, {f: 2, c: 65087}, {f: 2, c: 65085}, {f: 4, c: 65089},
- {f: 2, c: 65083}, {s: 41}, {f: 3, c: 12436}, 0, 0, 22099, {s: 41}, 65508,
- 65287, 65282, 0, 9665, 9655, 8681, 8679, 8678, 8680, 9634, 9831, 9825,
- 9828, 9826, 13216, 13218, {f: 2, c: 13220}, 13207, 8467, 13208, 13235,
- 13234, 13233, 13232, {f: 3, c: 13189}, 13259, 13200, 13268, 13206, 13090,
- 13078, 13080, 13077, 13059, 13091, 13143, 13122, 13113, 13115, 13056,
- 13105, 13127, 13086, 13098, 0, 13183, 8481, 9742, 12342, 12320, {s: 3},
- {f: 9, c: 9352}, {f: 20, c: 9332}, 12881, {f: 10, c: 8560},
- {f: 10, c: 12882}, {f: 26, c: 9372}, 12867, 12861, 12863, 12852, 12856,
- 12851, 12860, 12866, 12862, 12854, 12853, 12859, 12864, 12858, 12976,
- 12973, 12969, 12975, 12948, 12970, 12952, 12971, 12946, 12945, 12947,
- 12972, 12974, 12950, {s: 8}, {f: 3, c: 9131}, 0, {f: 3, c: 9127}, 0, 13260,
- 13061, 0, 0, 13215, 13219, 13222, 0, 0, 12958, {f: 2, c: 13192}, 13256,
- 8749, 0, 12848, {f: 6, c: 12842}, 12855, 12865, 10145, {s: 3}, 9673, 9824,
- 9829, 9827, 9830, {f: 4, c: 9728}, 9758, {f: 2, c: 9756}, 9759, 12953,
- 9450, {f: 2, c: 8554}, {s: 3}, {f: 8, c: 9601}, 9615, 9614, 9613, 9612,
- 9611, 9610, 9609, {f: 2, c: 9620}, {f: 2, c: 9581}, 9584, 9583, 9552, 9566,
- 9578, 9569, {f: 2, c: 9698}, 9701, 9700, 0, 0, {f: 3, c: 9585}, {s: 20},
- 20956, 29081, {f: 9, c: 10102}, {s: 3}, {f: 2, c: 8570}, {s: 3}, 8575,
- 8458, 8457, 0, 0, 12292, 8646, {f: 2, c: 8644}, 0, {f: 4, c: 12535}, 0, 0,
- 12957, {s: 3}, 13179, {s: 3}, 13107, 13134, {s: 30}, 32394, 35100, 37704,
- 37512, 34012, 20425, 28859, 26161, 26824, 37625, 26363, 24389,
- [12033, 20008], 20193, 20220, 20224, 20227, 20281, 20310, 20370, 20362,
- 20378, 20372, 20429, 20544, 20514, 20479, 20510, 20550, 20592, 20546,
- 20628, 20724, 20696, 20810, 20836, 20893, 20926, 20972, 21013, 21148,
- 21158, 21184, 21211, 21248, 0, 21284, 21362, 21395, 21426, 21469, 64014,
- 21660, 21642, 21673, 21759, 21894, 22361, 22373, 22444, 22472, 22471,
- 64015, 0, 22686, 22706, 22795, 22867, 22875, 22877, 22883, 22948, 22970,
- 23382, 23488, 29999, 23512, 0, 23582, 23718, 23738, 23797, 23847, 23891, 0,
- 23874, 23917, {f: 2, c: 23992}, 24016, 24353, 24372, 24423, 24503, 24542,
- 24669, 24709, 24714, 24798, 24789, 24864, 24818, 24849, 24887, 24880,
- 24984, 25107, 25254, 25589, 25696, 25757, 25806, 25934, 26112, 26133,
- 26121, 26158, 0, 26148, 26213, 26199, 26201, 64018, 26227, 26265, 26272,
- 26290, 26303, 26362, 26382, 0, 26470, 26555, 26706, 26560, 0, 26692, 26831,
- 64019, 26984, 64020, 27032, 27106, 27184, 27243, 27206, 27251, 27262,
- 27362, 27364, 27606, 27711, 27740, 27782, 27759, 27866, 27908, 28039,
- 28015, 28054, 28076, 28111, 28152, 28146, 28156, 28217, 28252, 28199,
- 28220, 28351, 28552, 28597, 28661, 28677, 28679, 28712, 28805, 28843,
- 28943, 28932, 29020, {f: 2, c: 28998}, 0, 29121, 29182, 29361, 29374,
- 29476, 64022, 29559, 29629, 29641, 29654, 29667, 29650, 29703, 29685,
- 29734, 29738, 29737, 29742, 0, 29833, 29855, 29953, 30063, 30338, 30364,
- 30366, 30363, 30374, 64023, 30534, 21167, 30753, 30798, 30820, 30842,
- 31024, {f: 3, c: 64024}, 31124, 64027, 31131, 31441, 31463, 64028, 31467,
- 31646, 64029, 32072, 0, 32183, 32160, 32214, 32338, 32583, 32673, 64030,
- 33537, 33634, 33663, 33735, 33782, 33864, 33972, 34131, 34137, 34155,
- 64031, 34224, {f: 2, c: 64032}, 34823, 35061, 35346, 35383, 35449, 35495,
- 35518, 35551, 64034, 35574, 35667, 35711, 36080, 36084, 36114, 36214,
- 64035, 36559, 0, 64037, 36967, 37086, 64038, 37141, 37159, 37338, 37335,
- 37342, {f: 2, c: 37357}, {f: 2, c: 37348}, 37382, 37392, 37386, 37434,
- 37440, 37436, 37454, 37465, 37457, 37433, 37479, 37543, {f: 2, c: 37495},
- 37607, 37591, 37593, 37584, 64039, 37589, 37600, 37587, 37669, 37665,
- 37627, 64040, 37662, 37631, 37661, 37634, 37744, 37719, 37796, 37830,
- 37854, 37880, 37937, 37957, 37960, 38290, 0, 64041, 38557, 38575, 38707,
- 38715, 38723, 38733, 38735, [12205, 38737], 0, 38999, 39013,
- {f: 2, c: 64042}, 39207, 64044, 39326, 39502, 39641, 39644, 39797, 39794,
- 39823, 39857, 39867, 39936, 40304, 40299, 64045, 40473, 40657, {s: 636},
- 8364, 8486, 0, 0, 64256, {f: 2, c: 64259}, 257, 299, 363, 275, 333, 256,
- 298, 362, 274, 332, {f: 4, c: 8539}, {f: 2, c: 8531}, 8304,
- {f: 6, c: 8308}, {f: 10, c: 8320}, 461, 282, 0, 7868, 463, 0, 296, 465, 0,
- 467, 366, 360, 462, 283, 0, 7869, 464, 0, 297, 466, 0, 468, 367, 361, 593,
- 8049, 8048, 509, 0, 596, 0, 0, 601, 0, 0, 602, 0, 0, 603, 8051, 8050, 0,
- 331, 629, 652, 0, 0, 658, 643, 720, {s: 682}, {f: 10, c: 12832}, {s: 108},
- {f: 4, c: 12892}, {f: 15, c: 12977}, {s: 50}, {f: 26, c: 9424},
- {f: 26, c: 9398}, {s: 48}, {f: 47, c: 13008}, 0, {f: 10, c: 12928}, 12944,
- {f: 6, c: 12938}, 0, 12959, {s: 6}, {f: 2, c: 12960}, 12955, 12954, 12963,
- 12962, 12951, 0, 12956, 12949, {s: 6}, 9676, {s: 11}, 10111,
- {f: 10, c: 9451}, {s: 510}, 8414, {s: 815}, 13274, {s: 3}, 8448, 13250, 0,
- 0, 8453, 0, 13169, 0, 0, 13197, 13211, {s: 3}, {f: 2, c: 13271}, {s: 3},
- {f: 2, c: 13057}, 13060, 13062, 0, 13064, 0, 13063, 13066, 0, 13065, 0,
- 13067, 0, 13068, {f: 6, c: 13070}, 0, 13079, 0, 13081, 0, {f: 4, c: 13082},
- {f: 3, c: 13087}, 13092, 0, 13093, 0, 0, {f: 2, c: 13096}, 0, 13101, 0, 0,
- {f: 3, c: 13102}, 13106, 0, 0, {f: 2, c: 13108}, 13116, {s: 3}, 13111, 0,
- 13112, 13114, 13117, 13121, {f: 3, c: 13118}, {f: 4, c: 13123}, 13128,
- {f: 2, c: 13131}, {f: 2, c: 13135}, 0, 0, 13138, 13140, 0, 0, 13139,
- {f: 2, c: 13141}, {s: 132}, 8501, 976, 8714, 8463, 0, 981, 987, 977, 0,
- {f: 2, c: 9832}, 9836, {s: 5}, 12347, 0, {f: 3, c: 12339}, 8252, 8265,
- {s: 5}, 8723, 0, 8771, {f: 2, c: 8818}, {s: 6}, {f: 2, c: 12312},
- {f: 2, c: 65375}, {s: 10}, 9115, {f: 2, c: 9117}, 9120, {s: 4}, 9121,
- {f: 2, c: 9123}, 9126, {s: 12}, [9116, 9119, 9122, 9125, 9130], {s: 8},
- 9986, 0, 0, 12349, 0, 12447, 0, 0, 8709, 8864, 8854, 8856, 8853, 8855,
- {s: 4}, 9664, 9654, {s: 4}, 8656, 8596, {f: 2, c: 8600}, {f: 2, c: 8598},
- 8652, 8651, {s: 10}, 12336, 8967, {s: 8}, 10048, 10047, {s: 7}, 9643, 0,
- 9642, 0, 10010, {s: 12}, 9702, {s: 4}, 10070, {s: 379}, {f: 2, c: 65093},
- {s: 679}, 64103, 64098, 32227, [12232, 40643], 28331, 64082, 64061, 64069,
- 64062, 27114, 28212, 64096, 64071, 64056, 64066, 64078, 34395, 64105,
- 64052, 64099, 25581, 25802, 30799, 64084, 63856, 64077, 64097, 64072,
- 64076, {f: 2, c: 64091}, 64081, 64067, 64090, 28041, 29376, 0, 194885,
- 64086, 64080, 64049, 64059, 24034, 64063, 64101, 21373, 64055, 64095,
- 24501, 64064, 0, 64083, 0, 64085, 64104, 64068, 64089, 26202, 64053, 64075,
- 64100, 64065, 64048, 0, 64057, 64051, 27493, 64058, 27599, 64050, 25150,
- 64079, 63773, 63964, 63798, 28122, 63952, 26310, 27511, 64087, 37706, 0,
- 37636, {s: 120}, 133390, {s: 120}, 35999, 11991, [11965, 158033], {s: 5},
- 37555, 38321, 0, 0, 194812, {s: 13}, 194965, {s: 8}, 194794, 0, 26478,
- 11974, 0, 194594, {s: 13}, 13314, 0, 0, 26083, {s: 4}, 134071, {s: 10},
- 171339, 0, 194611, 24378, {s: 8}, 11945, 0, 20465, {s: 7}, 63753, {s: 7},
- 11964, 0, 0, 194732, 26435, {s: 3}, 133732, 35329, 25142, 0, 0, 21555,
- 23067, {s: 3}, 25221, 0, 0, 194819, {s: 6}, 21567, {s: 9}, 27506, {s: 4},
- 29986, 19256, 0, 0, 24063, {s: 6}, 194827, 29626, 134047, {s: 3}, 194600,
- 0, 194849, {s: 5}, 194623, {s: 16}, 194675, {f: 2, c: 11916}, 23577,
- {s: 3}, 131083, 23426, 194642, {s: 5}, 11997, [11999, 39136],
- [11998, 169599], 14221, 0, [11927, 14586], 0, 194887, 0, [11909, 20155],
- 131490, {s: 7}, 13599, 0, 194738, 0, 0, [11971, 35200], {s: 4}, 31237,
- {s: 4}, 35498, 0, 32085, 0, 28568, {s: 7}, 25591, 30246, {s: 4},
- [11978, 163767], {s: 5}, 146686, {s: 5}, 13351, 0, 0, 33067, 0, 0, 194842,
- {s: 5}, 11950, {s: 5}, 194714, {s: 3}, 194831, {s: 19}, 22305, 135741,
- 194586, 0, 64003, {s: 7}, 21534, 15240, 20839, {s: 4}, 63839, {s: 9},
- 20023, {s: 13}, [11946, 150804], 24421, 23020, 194658, 0, 24217, {s: 46},
- 13416, {s: 8}, 21200, {s: 9}, 26625, 0, 195024, 195039, {s: 5}, 153215, 0,
- 0, 11959, {s: 4}, 36534, 63775, {s: 3}, 63875, {s: 5}, 31867, 63906, 0,
- 63898, 0, [11961, 32770], 157360, {s: 4}, [11911, 132648], 0, 0, 131210,
- 194604, [11915, 13630], {s: 4}, 21589, 0, 22841, 0, 0, 23414, 194669,
- 23572, 14306, 23782, 0, 20040, 0, 0, 194742, {s: 4}, 158105, 25371, 0, 0,
- 26211, 0, 194779, 0, 0, 27126, 27014, {s: 3}, 27596, 0, 28183, 0, 0, 27818,
- {s: 3}, [11942, 20012], 0, 0, 29935, 30069, 30188, 30286, 16305, 30570,
- 30633, {s: 6}, 31571, 0, 0, 16996, {s: 3}, 194924, 0, 0, 32328, {s: 5},
- 11955, {s: 4}, 33089, 17491, 0, [11966, 33401], [11967, 64094],
- [11968, 64093], 0, 20857, 33626, {s: 3}, 17701, 0, 34292, 131248, {s: 4},
- 34429, 0, 13358, 35014, {s: 6}, 18406, {s: 8}, 36808, {s: 19}, 166279, 0,
- 0, 167447, 0, 0, 38969, {s: 6}, 39432, {s: 4}, 39903, {s: 10}, 148206,
- {s: 5}, 21385, 0, 64017, 194785, 0, 146622, 132625, 0, {f: 2, c: 19972},
- 19999, 20011, {f: 2, c: 20015}, {f: 2, c: 20032}, 20036, [11907, 20058],
- 20095, 20109, 20118, 20153, 20176, 20192, 20221, 20223, 20235, 20245,
- 20320, 20283, 20297, 20308, 20346, {f: 2, c: 20349}, 20375, 20414, 20431,
- 20477, {f: 2, c: 20480}, 20496, 20507, 20519, 20526, 20567, 20582, 20586,
- 20539, 20623, 20630, 20636, 20684, 20710, 20713, 20719, 20744, 20747,
- 20752, 20763, 20766, 20831, 20897, 20924, 0, 20974, 20980, 20993,
- [11913, 20994], 21011, 21065, 21089, 21094, 21139, 21192, 21232,
- {f: 2, c: 21258}, 21310, 21324, 21323, 21345, 21356, 21419, 21466, 21478,
- 21493, 21543, 21581, 21606, 21611, 21620, 21645, 21654, 21665, 21677,
- 21689, 21695, 21702, 21709, 21774, 21803, 21813, 21834, 21856, 0, 21896,
- 21902, 22024, {f: 2, c: 22030}, 22071, 22079, 22089, 22091, 22095, 22118,
- 22121, 22127, {f: 2, c: 22129}, 22165, 22170, {f: 2, c: 22188}, 22193,
- 22217, 22237, 22244, 22282, 22293, 22307, 22319, {f: 2, c: 22323}, 22348,
- 22384, 22412, 22428, 22456, 22502, 22509, {f: 2, c: 22517}, 22527, 22537,
- 22560, 22578, 22652, 22656, 22697, 22734, 22736, 22740, 22746, 22761,
- 22796, 22820, 22831, 22881, 22893, 22986, 22994, 23005, {f: 2, c: 23011},
- 23044, 23052, 23075, 23111, 23125, 23139, 23149, 23166, 23198, 23207,
- 23212, 23219, 23264, 23296, 23321, 23333, 23341, 23361, 23420,
- {f: 2, c: 23422}, 23434, [11919, 23587], 23595, 23600, 23651, 23657, 23676,
- 23755, 23762, 23796, 23844, 23846, 23875, 23878, 23882, 23954, 23956,
- 23961, 23968, 24024, 24032, 24056, 24064, 24082, {f: 2, c: 24084}, 24088,
- 24110, 24152, {f: 2, c: 24171}, 24232, 24234, {f: 2, c: 24254}, 0, 24274,
- 24327, 24334, {f: 2, c: 24348}, 24354, 24360, 24374, 24379, 24384,
- [12089, 24400], 24408, 24420, 24457, 24476, 24487, 24484, 24495, 24504,
- [11926, 24516], 24521, 24545, 24553, 24557, 24572, 24599, 24602, 24627,
- 24673, 24703, 24734, 24740, 24752, 24779, 24795, 24824, {f: 3, c: 24850},
- 24860, 24956, 24973, 24991, 25000, 25026, 25055, 25109, 25129, 25155,
- 25158, [11928, 25164], 25169, 25174, 25284, 25340, 25354, 25357, 25368,
- 25401, {f: 2, c: 25410}, 25445, 25460, 25469, 25476, 25479, 25488, 25502,
- 25553, 25564, 25609, 25616, 25634, 25684, 25691, 25709, 25723,
- {f: 2, c: 25790}, 25829, 25847, 25851, 25860, 25878, 25881, 25927, 25959,
- 25985, 25989, 26050, 26096, 26098, 26156, 26188, {f: 2, c: 26203}, 26209,
- 26219, 0, 26276, 26312, 26348, 26373, 26387, 26419, 26440, 26444, 26486,
- 26491, 26544, 26546, 26617, 26583, 26585, 26608, 26668, {f: 2, c: 26672},
- 26715, 26738, 26741, 26746, 26756, 26789, 26802, 26832, 26838, 26856,
- 26861, {f: 2, c: 26864}, 26876, 26897, 26899, 26933, 26939, 26967, 26979,
- 26994, {f: 2, c: 27007}, 27046, 27053, 27063, {f: 2, c: 27094}, 27137,
- 27151, 27157, 27176, 27188, 27198, 27205, {f: 2, c: 27216}, 27222, 27227,
- 27267, 27273, 27281, {f: 3, c: 27293}, 27356, 27367, 27372, 27422, 27428,
- 27445, 27462, 27478, 27488, 27522, 27582, 27617, 27633, 27664, 27699,
- [11937, 27701], 11938, 27737, 27766, 27771, 27781, 27797, 27804, 27856,
- 27860, 27862, 27872, {f: 2, c: 27883}, 27886, 27914, 27918, 27921, 27950,
- 27991, 27998, 28005, 28034, 28095, 28100, 28106, 28118, 28137, 28194,
- 28241, 28359, 28362, 28366, 28413, 28442, 28458, 28463, 28467, 28506,
- 28510, 28514, 28541, 28555, 28557, 28562, 28564, 28570, {f: 2, c: 28583},
- 28598, 28634, 28638, 0, 28729, 28732, 0, 28756, {f: 2, c: 28765}, 28772,
- [11939, 28780], 28798, 28801, 28821, 28855, {f: 2, c: 28883}, 28888, 28892,
- 28935, 28960, 28977, 29002, 29010, 29024, 29049, 29074, 0, 29131, 29139,
- 29142, 29184, 29213, 29227, 29240, 29249, 29267, {f: 2, c: 29269}, 29276,
- 29325, [11944, 29357], 29364, 29383, 29435, {f: 2, c: 29444}, 29480, 29489,
- 29507, 29548, 29564, 29571, {f: 2, c: 29573}, 29589, {f: 3, c: 29598},
- 29606, 29611, 29621, 29623, 29628, 29647, 29657, 29673, 29684, 29693,
- 29700, 29706, {f: 2, c: 29722}, 29732, 29736, 29740, {f: 3, c: 29743},
- 29753, 29764, 29767, 29771, 29773, 29777, 29783, 29798, 29803, 29809,
- 29824, {f: 3, c: 29829}, 29840, 29848, 29852, 29856, 29859, 29864, 29867,
- 29877, 29887, 29896, 29914, 29918, 30030, 30073, 30081, 30096,
- [12135, 30098], 30099, 30132, 30180, 30201, 30208, 30218, {f: 2, c: 30229},
- 30233, 30238, 30253, 30261, 30275, 30283, 30309, 30317, 30319, 30321,
- 30324, {f: 2, c: 30372}, 30405, 30412, 30444, 30460, 30516, 30518, 30556,
- {f: 2, c: 30559}, 30578, 30589, 30613, 30634, 30694, 30704, 30708, 30726,
- 30754, {f: 2, c: 30765}, 30768, 30773, 30824, 30878, 30920, 30924, 30926,
- 30948, {f: 2, c: 30944}, 30962, 30967, 30971, 31025, 0, [11949, 31035],
- 31037, 31045, {f: 2, c: 31067}, 31115, 31126, 31128, [12145, 31160], 31163,
- 31178, 31194, 31235, 31241, 31249, 31262, 31277, 31289, 31301, 31308,
- 31325, 0, 31341, 31352, 31392, 31395, 31411, {f: 2, c: 31419}, 31430,
- 31495, 31508, 31527, 31537, 31559, 31566, 31584, 31593, 31597, 31602,
- 31633, 31663, 31703, 31705, 31755, 31759, 31776, 31782, 31793, 31798,
- 31825, 31833, 31847, 31854, 31856, 31932, 31935, {f: 2, c: 31944}, 31959,
- 31961, 31965, 31979, {f: 3, c: 32007}, 32019, 32029, 32035, 32065, 32083,
- 32089, 32093, 32122, 32134, {f: 2, c: 32139}, 32204, 32235, 32241, 32249,
- 32264, 32273, 32277, 32288, 32327, 32354, 32366, 32371, 32397, 32401,
- 32408, 32580, 32591, [11947, 11954, 32594], [11953, 32595], 32609, 32657,
- 32703, 32718, 32735, 32741, 32748, {f: 2, c: 32750}, 32762, 32782, 32785,
- 32788, 32804, 32806, 32826, 32828, 32864, 32881, 32885, 32926, 32934,
- 32939, {f: 2, c: 32983}, 33046, 33048, 33082, 33098, 33100, 33153, 33156,
- 33204, 33231, 33273, 33283, 33313, 33330, 33332, 33350, 33355, 33359,
- 33422, 33454, 33463, 33470, 33478, 33534, 33603, 33617, 33621, 33670,
- 33677, 33682, 33688, 33705, {f: 2, c: 33727}, 33770, 33807, 33809, 33866,
- 33910, 33960, 33967, 33984, 33986, 34032, 34045, 34060, 34100, 34142,
- 34191, 34231, 34254, 34221, 34322, 34345, 34386, 34403, 34412, 34415,
- 34426, 34445, 34449, 34456, {f: 2, c: 34471}, 34554, 34557, 34571, 34579,
- 34585, 34590, 34600, 34622, 34673, 34696, 34713, {f: 2, c: 34732}, 34741,
- 34774, 34795, 34797, 34817, 0, 34822, 34827, 34836, 34844, 34902, 34911,
- [11970, 34916], 34968, 34986, {f: 2, c: 35005}, 35018, 35026, 35035,
- {f: 2, c: 35056}, 35078, {f: 3, c: 35096}, 35111, 35120, 35134, 35195,
- 35284, 35286, 35301, 35313, 35335, 35343, 35349, 35362, 35406, 35455,
- 35572, 35615, 35639, {f: 2, c: 35651}, 35668, 35740, 35742, 35911, 35924,
- 35955, 36004, 36057, 36065, 36088, 36094, 36123, 36201, 36204, 36228,
- 36237, 36245, 36262, 36294, 36302, 36324, 36332, 36384, 36427, 36460,
- 36464, 36474, 36498, 36526, 36531, 36561, 36564, 36601, 36631, 36662,
- 36774, [12193, 36789], [11981, 36790], 0, 36832, 36836, 36854, 36866,
- 36908, 36932, 37000, 37013, 37017, 37019, 37026, 37044, 37079, 37085,
- 37108, 37143, 37148, 37169, 37178, 37181, 37192, 37211, 37217, 37220,
- 37262, 37278, 37288, {f: 2, c: 37293}, 37298, 37308, 37360, 37367, 37371,
- 37383, 37416, 37427, 37432, 37443, 37447, 37455, 37472, 37570,
- {f: 2, c: 37579}, 37599, 37645, 37653, 37663, 37671, 37703, 37714, 0,
- 37738, 37741, 37787, 37818, 37801, 37825, 37834, 37858, 37882, 37885,
- 37903, 37940, 37951, 37973, 37995, 38002, [11986, 38264], 38310, 38313, 0,
- 38324, 38333, 38362, [11983, 11990, 38429], 38465, 38488, 38532, 38564,
- 38569, 38610, 195060, 38622, 38633, 38641, 38658, 38665, 38746, 38755,
- 38766, 38771, 38810, 38818, {f: 2, c: 38837}, 38873, 38878, 38900, 38922,
- 38926, 38942, 38947, 38955, 38974, {f: 2, c: 38994}, 39001, 39020, 39096,
- 39098, 39103, 39112, 39141, {f: 2, c: 39218}, 39232, 39245, 39260, 39263,
- 39345, {f: 2, c: 39353}, 39369, 39426, 39446, 39460, 39463,
- {f: 2, c: 39469}, 39478, 39480, 39498, 39510, {f: 2, c: 39605}, 39673,
- 39683, 39712, {f: 2, c: 39731}, 39795, 39801, 39847, 39873, 39879, 39895,
- 39911, 39915, 39927, 39930, 39933, 39947, 39975, 39978, 39990, 40001,
- 40019, 40035, 40048, 40055, 40194, 40258, 40263, 40291, 40297, 40316,
- 40318, 40333, 40369, 40387, 40391, 40406, 40415, 40427, 40436, 40469,
- 40477, 40612, 40616, 40620, 40679, 40686, 40720, 40722, 40727, 40729,
- 40751, 40759, 40761, 40769, 40773, 40791, 40808, 40817, 40821, 40848,
- 40852, 40866, 0, 13317, 194564, 22048, 24267, 11925, 0, 144954, 0, 28665,
- 28390, 29107, [11940, 64073], {s: 4}, [11980, 64102], 0, 23986, 0, 20435,
- 20697, 20720, 20931, 22134, 27220, 27905, 28112, 28226, 28377, 29668,
- 29729, 30060, 30801, 34805, 144382, 29608, 15091, 13531, 17420, 16010, 0,
- 0, 19432, 0, 16090, 15138, 0, 17786, 16531, 0, 18021, 16643, 17043, 18094,
- 13448, 140809, {f: 3, c: 63584}, 63610, 63615, {s: 23}, {f: 2, c: 8836},
- {f: 2, c: 8842}, 8713, 0, {f: 2, c: 8965}, {s: 9}, {f: 2, c: 8741},
- {s: 14}, 8802, 0, 8773, 8776, {f: 2, c: 8822}, {s: 4}, 8487, {s: 209},
- {f: 2, c: 8922}, 8533, 8984, {f: 2, c: 7742}, {f: 2, c: 504}, 470, 472,
- 474, 476, 260, 728, 317, 346, 350, 356, 377, 379, 261, 731, 318, 347, 711,
- 351, 357, 378, 733, 380, 340, 258, 313, 262, 268, 280, 270, 323, 327, 336,
- 344, 368, 354, 341, 259, 314, 263, 269, 281, 271, 273, 324, 328, 337, 345,
- 369, 355, 729, 264, 284, 292, 308, 348, 364, 265, 285, 293, 309, 349, 365,
- 625, 651, 638, 620, 622, 633, 648, 598, 627, 637, 642, 656, 635, 621, 607,
- 626, 669, 654, 609, 624, 641, 295, 661, 660, 614, 664, 450, 595, 599, 644,
- 608, 403, 616, 649, 600, 604, 606, 592, 623, 650, 612, 594, 653, 613, 674,
- 673, 597, 657, 634, 615, 865, 712, 716, 721, 8255, 783, {f: 5, c: 741}, 0,
- 0, 805, 812, 825, 796, {f: 2, c: 799}, 829, 809, 815, 734, 804, 816, 828,
- 820, {f: 2, c: 797}, {f: 2, c: 792}, 810, {f: 2, c: 826}, 794, {s: 3},
- {f: 2, c: 610}, 618, 628, 630, 632, 640, 655, 665, 668, 671, 688, 690, 695,
- 704, {f: 2, c: 736}, {s: 6}, 8862, {s: 287}, 12348, 12543, 0,
- {f: 2, c: 12310}, 9838, 9835, {f: 2, c: 10548}, 10687, 0, 12448, 0,
- {f: 2, c: 10746}, {s: 13}, 962, {f: 10, c: 9461}, {f: 2, c: 9750}, 9649,
- {f: 10, c: 12784}, 0, {f: 6, c: 12794}, {f: 15, c: 9150}, 0, 0, 10003, 0,
- 9251, 9166, {f: 4, c: 9680}, {f: 2, c: 8263}, 0, 8273, 8258,
- {f: 16, c: 12688}, {s: 13}, {f: 2, c: 9136}, {f: 12, c: 9842},
- {f: 2, c: 12441}, 8413, {s: 450}, 20296, 20319, 20330, 20332, 20494, 20504,
- 20545, 20722, 20688, 20742, 20739, 20789, 20821, 20823, 13493, 20938,
- 20962, 21079, 21196, 21206, 21243, 21276, 21347, 21405, 21522, 21631,
- 21640, 21840, 21889, 21933, 21966, 22075, 22174, 22185, 22195, 22391,
- 22396, 135963, 22479, 22500, 22628, 22665, 136302, 22738, 22752, 34369,
- 22923, 22930, 22979, 23059, 23143, 23159, 23172, 23236, 137405, 23421,
- 23443, 23570, 64060, 136884, 23674, 23695, 23711, 23715, 23722, 23760,
- 138804, 23821, 23879, 23937, 23972, 23975, 24011, 24158, 24313, 24320,
- 24322, 24355, 24381, 24404, 24445, 24589, 24596, 24600, 24629, 24647,
- 24733, 24788, 24797, 24875, 25020, 25017, 25122, 25178, 25199, 25302,
- 25468, 25573, 25721, 25796, 25808, 25897, 26013, 26170, 26146, 26155,
- 26160, 26163, 26184, 143812, {f: 2, c: 26231}, 26253, 26299, 26331, 26344,
- 26439, 26497, 26515, 26520, 26523, 26620, 26653, 26787, 26890, 26953,
- 144836, 26946, 26980, 27045, 27087, 15286, 15299, 27113, 27125, 145215,
- 27195, 145251, 27284, 27301, 15375, 27419, 27436, 27495, 27561, 27565,
- 27607, 27647, 27653, 27764, 27800, 27899, 27846, 27953, 27961, 27967,
- 27992, 28052, 28074, 28123, 28125, 28228, 28254, 28337, 28353, 28432,
- 28505, 28513, 28542, 28556, 28576, 28604, 28615, 28618, 28656, 28750,
- 28789, 28836, 28900, 28971, 28958, 28974, 29009, 29032, 29061, 29063,
- 29114, 29124, 29205, 15935, 29339, 149489, 29479, 29520, 29542, 29602,
- 29739, 29766, 29794, 29805, 29862, 29865, 29897, 29951, 29975, 16242,
- 30158, 30210, 30216, 30308, 30337, 30365, 30378, 30390, 30414, 30420,
- 30438, 30449, 30474, 30489, {f: 2, c: 30541}, 30586, 30592, 30612, 30688,
- 152718, 30787, 30830, 30896, 152846, 30893, 30976, 31004, 31022, 31028,
- 31046, 31097, 31176, 153457, 31188, 31198, 31211, 31213, 31365, 154052,
- 31438, 31485, 31506, 31533, 31547, 31599, 31745, 31795, 155041, 31853,
- 31865, 31887, 31892, 31904, 31957, 32049, 32092, 32131, 32166, 32194,
- 32296, 32663, 32731, 32821, 32823, 32970, 32992, 33011, 33120,
- {f: 2, c: 33127}, 33133, 33211, 33226, 33239, 17499, 33376, 33396, 158463,
- 33441, {f: 2, c: 33443}, 33449, 33471, 33493, 33533, 33536, 33570, 33581,
- 33594, 33607, 33661, 33703, 33743, 33745, 33761, 33793, 33798, 33887,
- 33904, 33907, 33925, 33950, 33978, 159296, 34098, 34078, 34095, 34148,
- 34170, 34188, 34210, 34251, 34285, 34303, {f: 2, c: 34308}, 34320, 159988,
- 34328, 34360, 34391, 34402, 17821, 34421, 34488, 34556, 34695, 17898,
- 34826, 34832, 35022, 161412, 35122, 35129, 35136, 35220, 35318, 35399,
- 35421, 35425, 35445, 35536, 35654, 35673, 35689, 35741, 35913, 35944,
- 36271, 36305, 36311, 36387, 36413, 36475, 164471, 18500, 36602, 36638,
- 36653, 36692, 164813, 36840, 36846, 36872, 36909, 37015, 37043, 37054,
- {f: 2, c: 37060}, 37063, 37103, 37140, 37142, {f: 2, c: 37154}, 37167,
- 37172, 37251, 37361, 37705, {f: 2, c: 37732}, 37795, 37855, 37892, 37939,
- 37962, 37987, 38001, 38286, 38303, 38316, 38326, 38347, 38352, 38355,
- 18864, 38366, 38565, 38639, 38734, 38805, 38830, 38842, 38849, 38857,
- 38875, 38998, 39143, 39256, 39427, 39617, 39619, 39630, 39638, 39682,
- 39688, 19479, 39725, 39774, 39782, 39812, 39818, 39838, 39886, 39909,
- 39928, 39971, {f: 2, c: 40015}, 40037, {f: 2, c: 40221}, 40259, 40274,
- 40330, 40342, 40384, 40364, 40380, 172432, 40423, 40455, 40606, 40623,
- 40855, 131209, 19970, 19983, 19986, 20009, 20014, 20039, 131234, 20049,
- 13318, 131236, 20073, 20125, 13356, 20156, 20163, 20168, 20203, 20186,
- 20209, 20213, 20246, 20324, 20279, 20286, 20312, 131603, {f: 2, c: 20343},
- 20354, 20357, 20454, 20402, 20421, 20427, 20434, 13418, 20466, 20499,
- 20508, 20558, 20563, 20579, 20643, 20616, {f: 2, c: 20626}, 20629, 20650,
- 131883, 20657, {f: 2, c: 20666}, 20676, 20679, 20723, 131969, 20686,
- 131953, 20692, 20705, 13458, 132089, 20759, 132170, 20832, 132361, 20851,
- 20867, 20875, 13500, 20888, 20899, 20909, 13511, 132566, 20979, 21010,
- 21014, 132943, 21077, 21084, 21100, 21111, 21124, 21122, 133127, 21144,
- 133178, 21156, {f: 2, c: 21178}, 21194, 21201, 133305, 21239, 21301, 21314,
- 133500, 133533, 21351, 21370, 21412, 21428, 133843, 21431, 21440, 133917,
- {f: 2, c: 13661}, 21461, 13667, 21492, 21540, 21544, 13678, 21571, 21602,
- 21612, 21653, 21664, 21670, 21678, 21687, 21690, 21699, 134469, 21740,
- 21743, 21745, 21747, {f: 2, c: 21760}, 21769, 21820, 21825, 13734, 21831,
- 13736, 21860, 134625, 21885, 21890, 21905, 13765, 21970, 134805, 134765,
- 21951, 21961, 21964, 21969, 21981, 13786, 21986, 134756, 21993, 22056,
- 135007, 22023, 22032, 22064, 13812, 22077, 22080, 22087, 22110, 22112,
- 22125, 13829, 22152, 22156, 22173, 22184, 22194, 22213, 22221, 22239,
- 22248, {f: 2, c: 22262}, 135681, 135765, 22313, 135803, {f: 2, c: 22341},
- 22349, 135796, 22376, 22383, {f: 3, c: 22387}, 22395, 135908, 135895,
- 22426, {f: 2, c: 22429}, 22440, 22487, 135933, 22476, 135990, 136004,
- 22494, 22512, 13898, 22520, 22523, 22525, 22532, 22558, 22567, 22585,
- 136132, 22601, 22604, 22631, {f: 2, c: 22666}, 22669, {f: 2, c: 22671},
- 22676, 22685, 22698, 22705, 136301, 22723, 22733, 22754, {f: 2, c: 22771},
- {f: 2, c: 22789}, 22797, 22804, 136663, 13969, 22845, 13977, 22854, 13974,
- 158761, 22879, 136775, {f: 2, c: 22901}, 22908, 22943, 22958, 22972, 22984,
- 22989, 23006, 23015, 23022, 136966, 137026, 14031, 23053, 23063, 23079,
- 23085, 23141, 23162, 23179, 23196, {f: 2, c: 23199}, 23202, 23217, 23221,
- 23226, 23231, 23258, 23260, 23269, 23280, 23278, 23285, 23304, 23319,
- 23348, 23372, 23378, 23400, 23407, 23425, 23428, 137667, 23446, 23468,
- {f: 2, c: 14177}, 23502, 23510, 14188, 14187, 23537, 23549, 14197, 23555,
- 23593, 138326, 23647, {f: 2, c: 23655}, 23664, 138541, 138565, 138616,
- 138594, 23688, 23690, 14273, 138657, 138652, 23712, 23714, 23719, 138642,
- 23725, 23733, 138679, 23753, 138720, 138803, 23814, 23824, 23851, 23837,
- 23840, 23857, 23865, 14312, 23905, 23914, 14324, 23920, 139038, 14333,
- 23944, 14336, 23959, 23984, 23988, 139126, 24017, 24023, 139258, 24036,
- 24041, 14383, 14390, 14400, 24095, 24126, 24137, 14428, 24150, 14433,
- {f: 2, c: 24173}, 139643, 24229, 24236, 24249, 24262, 24281, 140062, 24317,
- 24328, 140205, 24350, 24391, 24419, 24434, 24446, 24463, 24482, 24519,
- 24523, {f: 3, c: 24530}, 24546, {f: 2, c: 24558}, 24563, 14615, 24610,
- 24612, 14618, 24652, 24725, 24744, 141043, 24753, 24766, 24776, 24793,
- 24814, 24821, 24848, 24857, 24862, 24890, 14703, 24897, 24902, 24928,
- 141403, {f: 2, c: 24978}, 24983, 24997, 25005, 141483, 25045, 25053, 25077,
- 141711, 25123, 25170, 25185, 25188, 25211, 25197, 25203, 25241, 25301,
- 142008, 25341, 25347, 25360, {f: 2, c: 142159}, 25394, 25397,
- {f: 2, c: 25403}, 25409, 25412, 25422, 142150, 25433, 142365, 142246,
- 25452, 25497, 142372, 25492, 25533, {f: 2, c: 25556}, 25568,
- {f: 2, c: 25579}, 25586, 25630, 25637, 25641, 25647, 25690, 25693, 25715,
- 25725, 25735, 25745, 25759, {f: 2, c: 25803}, 25813, 25815, 142817, 25828,
- 25855, 14958, 25871, 25876, 14963, 25886, 25906, 25924, 25940, 25963,
- 25978, 25988, 25994, 26034, 26037, 26040, 26047, 26057, 26068, 15062,
- 26105, 26108, 26116, 26120, 26145, 26154, 26181, 26193, 26190, 15082,
- 143811, 143861, 143798, 26218, {f: 2, c: 26220}, 26235, 26240, 26256,
- 26258, 15118, 26285, 26289, 26293, 15130, 15132, 15063, 26369, 26386,
- 144242, 26393, 144339, 144338, 26445, 26452, 26461, 144336, 144356, 144341,
- 26484, 144346, 26514, 144351, 33635, 26640, 26563, 26568, 26578, 26587,
- 26615, 144458, 144465, 144459, 26648, 26655, 26669, 144485, 26675, 26683,
- 26686, 26693, 26697, 26700, 26709, 26711, 15223, 26731, 26734, 26748,
- 26754, 26768, 26774, 15213, {f: 3, c: 26776}, 26780, {f: 2, c: 26794},
- 26804, 26811, 26875, 144612, 144730, 26819, 26821, 26828, 26841,
- {f: 2, c: 26852}, 26860, 26871, 26883, 26887, 15239, 144788, 15245, 26950,
- 26985, 26988, 27002, 27026, 15268, 27030, 27056, 27066, 27068, 27072,
- 27089, 144953, 144967, 144952, 27107, {f: 2, c: 27118}, 27123, 15309,
- 27124, 27134, 27153, 27162, 27165, 145180, {f: 2, c: 27186}, 27199, 27209,
- 27258, 27214, 27218, 27236, 145164, 27275, 15344, 27297, 145252, 27307,
- 27325, 27334, 27348, 27344, 27357, 145407, 145383, {f: 3, c: 27377}, 27389,
- 145444, 27403, {f: 3, c: 27407}, 145469, 27415, 15398, 27439, 27466, 27480,
- 27500, 27509, [11934, 27514], 27521, 27547, 27566, 146072, 27581,
- {f: 3, c: 27591}, 27610, {f: 2, c: 27622}, 27630, 27650, 27658, 27662,
- 27702, 146559, 27725, 27739, 27757, 27780, 27785, 15555, 27796, 27799,
- 27821, 27842, 15570, 27868, 27881, 27885, 146688, 27904, 27940,
- {f: 2, c: 27942}, 27751, 27951, 27964, 27995, 28000, 28016,
- {f: 2, c: 28032}, 28042, 28045, 28049, 28056, 146752, 146938, 146937,
- 146899, 28075, 28078, 28084, 28098, 27956, 28104, 28110, 28127, 28150,
- 28214, 28190, 15633, 28210, {f: 2, c: 28232}, {f: 2, c: 28235}, 28239,
- {f: 2, c: 28243}, 28247, 28259, 15646, 28307, 28327, 28340, 28355, 28469,
- 28395, 28409, 28411, 28426, 28428, 28440, 28453, 28470, 28476, 147326,
- 28498, 28503, 28512, 28520, 28560, 28566, 28606, 28575, 28581, 28591,
- 15716, {f: 2, c: 28616}, 28649, 147606, 28668, 28672, 28682, 28707, 147715,
- 28730, 28739, 28743, 28747, 15770, 28773, 28777, 28782, 28790, 28806,
- 28823, 147910, 28831, 28849, 147966, 28908, 28874, 28881, 28931, 28934,
- 28936, 28940, 15808, 28975, 29008, 29011, 29022, 15828, 29078, 29056,
- 29083, 29088, 29090, {f: 2, c: 29102}, 148412, 29145, 29148, 29191, 15877,
- 29236, 29241, 29250, 29271, 29283, 149033, {f: 2, c: 29294}, 29304, 29311,
- 29326, 149157, 29358, 29360, 29377, 15968, 29388, 15974, 15976, 29427,
- 29434, 29447, 29458, {f: 2, c: 29464}, 16003, 29497, 29484, 29491, 29501,
- 29522, 16020, 29547, 149654, {f: 2, c: 29550}, 29553, 29569, 29578, 29588,
- 29592, 29596, 29605, 29625, 29631, 29637, 29643, 29665, 29671, 29689,
- 29715, 29690, 29697, 29779, 29760, 29763, 29778, 29789, 29825, 29832,
- 150093, 29842, 29847, 29849, 29857, 29861, 29866, 29881, 29883, 29882,
- 29910, 29912, 29931, 150358, 29946, 150383, 29984, 29988, 29994, 16215,
- 150550, {f: 2, c: 30013}, 30016, 30024, 30032, 30034, 30066, 30065, 30074,
- {f: 2, c: 30077}, 30092, 16245, 30114, 16247, 30128, 30135,
- {f: 2, c: 30143}, 30150, 30159, 30163, 30173, {f: 2, c: 30175}, 30183,
- 30190, 30193, 30211, 30232, 30215, 30223, 16302, 151054, 30227,
- {f: 2, c: 30235}, 151095, 30245, 30248, 30268, 30259, 151146, 16329, 30273,
- 151179, 30281, 30293, 16343, 30318, 30357, 30369, 30368, {f: 2, c: 30375},
- 30383, 151626, 30409, 151637, 30440, 151842, 30487, 30490, 30509, 30517,
- 151977, 16441, 152037, 152013, 30552, 152094, 30588, 152140, 16472, 30618,
- 30623, 30626, 30628, {f: 2, c: 30686}, 30692, 30698, 30700, 30715, 152622,
- 30725, 30729, 30733, 30745, 30764, 30791, 30826, 152793, 30858, 30868,
- 30884, 30877, 30879, 30907, 30933, 30950, {f: 2, c: 30969}, 30974, 152999,
- 30992, 31003, 31013, 31050, 31064, 16645, 31079, 31090, 31125, 31137,
- 31145, 31156, 31170, 31175, {f: 2, c: 31180}, 31190, 16712, 153513, 153524,
- 16719, 31242, 31253, 31259, 16739, 31288, 31303, 31318, 31321, 31324,
- 31327, 31335, 31338, 31349, 31362, 31370, 31376, 31404, 154068, 16820,
- 31417, 31422, 16831, 31436, 31464, 31476, 154340, 154339, 154353, 31549,
- 31530, {f: 2, c: 31534}, 16870, 16883, 31615, 31553, 16878, 31573, 31609,
- 31588, 31590, 31603, 154546, 16903, 31632, 31643, 16910, 31669, 31676,
- 31685, 31690, 154699, 154724, 31700, 31702, 31706, 31722, 31728, 31747,
- 31758, 31813, 31818, 31831, 31838, 31841, 31849, 31855, 155182, 155222,
- 155237, 31910, 155234, {f: 2, c: 31926}, 155352, 31940, 155330, 31949,
- 155368, 155427, 31974, 155484, 31989, 32003, 17094, 32018, 32030, 155616,
- 155604, {f: 2, c: 32061}, 32064, 32071, 155660, 155643, 17110, 32090,
- 32106, 32112, 17117, 32127, 155671, 32136, 32151, 155744, 32157, 32167,
- 32170, 32182, 32192, 32215, 32217, 32230, 17154, 155885, 64088, 32272,
- 32279, 32285, 32295, 32300, 32325, 32373, 32382, {f: 2, c: 32390}, 17195,
- 32410, 17219, 32572, 32571, 32574, 32579, 13505, 156272, 156294,
- {f: 2, c: 32611}, 32621, {f: 2, c: 32637}, 32656, 20859, 146702, 32662,
- 32668, 32685, 156674, 32707, 32719, 32739, 32754, 32778, 32776, 32790,
- 32812, 32816, 32835, 32870, 32891, 32921, 32924, 32932, 32935, 32952,
- 157310, 32965, 32981, 32998, 33037, 33013, 33019, 17390, 33077, 33054,
- 17392, 33060, 33063, 33068, 157469, 33085, 17416, 33129, 17431, 17436,
- 33157, 17442, 33176, 33202, 33217, 33219, 33238, 33243, 157917, 33252,
- 157930, 33260, 33277, 33279, 158063, 33284, 158173, 33305, 33314, 158238,
- 33340, 33353, 33349, 158296, 17526, 17530, 33367, 158348, 33372, 33379,
- 158391, 17553, 33405, 33407, 33411, 33418, 33427, {f: 2, c: 33447}, 33458,
- 33460, 33466, 33468, 33506, 33512, 33527, {f: 2, c: 33543}, 33548, 33620,
- 33563, 33565, 33584, 33596, 33604, 33623, 17598, 17620, 17587,
- {f: 2, c: 33684}, 33691, 33693, 33737, 33744, 33748, 33757, 33765, 33785,
- 33813, 158835, 33815, 33849, 33871, {f: 2, c: 33873}, {f: 2, c: 33881},
- 33884, 158941, 33893, 33912, 33916, 33921, 17677, 33943, 33958, 33982,
- 17672, {f: 2, c: 33998}, 34003, 159333, 34023, 34026, 34031, 34033, 34042,
- 34075, {f: 2, c: 34084}, 34091, 34127, 34159, 17731, 34129,
- {f: 2, c: 34145}, 159636, 34171, 34173, 34175, 34177, 34182, 34195, 34205,
- 34207, 159736, {f: 2, c: 159734}, 34236, 34247, 34250, {f: 2, c: 34264},
- 34271, 34273, 34278, 34294, 34304, 34321, 34334, 34337, 34340, 34343,
- 160013, 34361, 34364, 160057, 34368, 34387, 34390, 34423, 34439, 34441,
- {f: 2, c: 34460}, 34481, 34483, 34497, 34499, 34513, 34517, 34519, 34531,
- 34534, 17848, 34565, 34567, 34574, 34576, 34591, 34593, 34595, 34609,
- 34618, 34624, 34627, 34641, 34648, {f: 2, c: 34660}, 34674, 34684, 160731,
- 160730, 34727, 34697, 34699, 34707, 34720, 160766, 17893, 34750, 160784,
- 34753, 34766, 34783, 160841, 34787, {f: 2, c: 34789}, 34794, 34835, 34856,
- 34862, 34866, 34876, 17935, 34890, 34904, 161301, 161300, 34921, 161329,
- 34927, 34976, 35004, 35008, 161427, 35025, 35027, 17985, 35073, 161550,
- 35127, 161571, 35138, 35141, 35145, 161618, 35170, 35209, 35216, 35231,
- 35248, 35255, 35288, 35307, 18081, 35315, 35325, 35327, 18095, 35345,
- 35348, 162181, 35361, 35381, 35390, 35397, 35405, 35416, 35502, 35472,
- 35511, 35543, 35580, 162436, 35594, 35589, 35597, 35612, 35629, 18188,
- 35665, 35678, 35702, 35713, 35723, {f: 2, c: 35732}, 35897, 162739, 35901,
- 162750, 162759, 35909, 35919, 35927, 35945, 35949, 163000, 35987, 35986,
- 35993, 18276, 35995, 36054, 36053, 163232, 36081, 163344, 36105, 36110,
- 36296, 36313, 36364, 18429, 36349, 36358, 163978, 36372, 36374,
- {f: 2, c: 36385}, 36391, 164027, 18454, 36406, 36409, 36436, 36450, 36461,
- 36463, 36504, 36510, 36533, 36539, 164482, 18510, 164595, 36608, 36616,
- 36651, 36672, 36682, 36696, 164876, 36772, 36788, 164949, 36801, 36806,
- 64036, 36810, 36813, 36819, 36821, 36849, 36853, 36859, 36876, 36919,
- 165227, 36931, 36957, {f: 2, c: 165320}, 36997, 37004, 37008, 37025, 18613,
- 37040, 37046, 37059, 37064, 165591, 37084, 37087, 165626, 37110, 37106,
- 37120, 37099, {f: 2, c: 37118}, 37124, 37126, 37144, 37150, 37175, 37177,
- {f: 2, c: 37190}, 37207, 37209, 37236, 37241, 37253, 37299, 37302,
- {f: 2, c: 37315}, 166217, 166214, 37356, 37377, {f: 2, c: 37398}, 166251,
- 37442, 37450, 37462, 37473, 37477, 37480, 166280, {f: 2, c: 37500}, 37503,
- 37513, 37517, 37527, 37529, 37535, 37547, {f: 2, c: 166330}, 37554,
- {f: 2, c: 37567}, 37574, 37582, 37605, 37649, 166430, 166441, 37623, 37673,
- 166513, 166467, 37713, 37722, 37739, 37745, 37747, 37793, 166553, 166605,
- 37768, 37771, 37775, 37790, 37877, 166628, 166621, 37873, 37831, 37852,
- 37863, 37897, {f: 2, c: 37910}, 37883, 37938, 37947, 166849, 166895, 37997,
- 37999, 38265, 38278, {f: 2, c: 38284}, 167184, 167281, 38344, 167419,
- 167455, 38444, {f: 2, c: 38451}, 167478, 38460, 38497, 167561, 38530,
- 167659, 38554, 167730, 18919, 38579, 38586, 38589, 18938, 167928, 38616,
- 38618, 38621, 18948, 38676, 38691, 18985, 38710, 38721, 38727, 38743,
- 38747, 38762, 168608, 168625, 38806, 38814, {f: 2, c: 38833}, 38846, 38860,
- 38865, 38868, 38872, 38881, 38897, 38916, 38925, 38932, 38934, 19132,
- 169104, {f: 2, c: 38962}, 38949, 38983, 39014, 39083, 39085, 39088, 169423,
- 39095, {f: 2, c: 39099}, 39106, 39111, 39115, 39137, 39139, 39146,
- {f: 2, c: 39152}, 39155, 39176, 19259, 169712, {f: 2, c: 39190}, 169753,
- {f: 3, c: 39194}, 169808, 39217, {f: 3, c: 39226}, 39233, 39238, 39246,
- 39264, 39331, 39334, 39357, 39359, 39363, 39380, 39385, 39390, 170182,
- 39408, 39417, 39420, 39434, 39441, 39450, 39456, 39473, 39492, 39500,
- 39512, 19394, 39599, 19402, 39607, 19410, 39609, 170610, 39622, 39632,
- 39634, 39637, 39648, 39653, 39657, 39692, 39696, 39698, 39702, 39708,
- 39723, 39741, 19488, 39755, 39779, 39781, {f: 2, c: 39787},
- {f: 2, c: 39798}, 39846, 39852, 171483, 39858, 39864, 39870, 39923, 39896,
- 39901, 39914, 39919, 39918, 171541, 171658, 171593, 39958,
- {f: 3, c: 39960}, 39965, 39970, 39977, 171716, 39985, 39991, 40005, 40028,
- 171753, {f: 2, c: 40009}, 171739, 40020, 40024, 40027, 40029, 40031,
- {f: 3, c: 40041}, {f: 2, c: 40045}, 40050, 40053, 40058, 40166, 40178,
- 40203, [171982, 171991], 40209, {f: 2, c: 40215}, 172079, 19652, 172058,
- 40242, 19665, 40266, 40287, 40290, 172281, 172162, 40307, {f: 2, c: 40310},
- 40324, 40345, 40353, 40383, 40373, 40377, 40381, 40393, 40410, 40416,
- 40419, 19719, 40458, 40450, 40461, 40476, 40571, 139800, 40576, 40581,
- 40603, 172940, 40637, 173111, 40671, 40703, 40706, 19831, 40707, 40762,
- 40765, 40774, 40787, 40789, 40792, 173553, 40797, 173570, 40809, 40813,
- 40816, 173746, 11948, 13844, 14509, 15820, 16348, 17854, 17936, 19326,
- 19512, 19681, 19980, {f: 2, c: 20003}, 20089, 20211, 20236, 20249, 20267,
- 20270, 20273, 20356, 20382, 20407, 20484, 20492, 20556, 20575, 20578,
- 20599, 20622, 20638, 20642, 20675, 20712, 20721, 20734, 20743,
- {f: 3, c: 20748}, 20787, 20792, 20852, 20868, 20920, 20922, 20936, 20943,
- 20945, {f: 2, c: 20947}, 20952, 20959, 20997, 21030, 21032, 21035,
- {f: 2, c: 21041}, 21045, 21052, 21082, 21088, 21102, {f: 2, c: 21112},
- 21130, 21132, 21217, 21225, 21233, 21251, 21265, 21279, 21293, 21298,
- 21309, 21349, 21357, 21369, 21374, 21396, 21401, 21418, 21423, 21434,
- 21441, {f: 2, c: 21444}, 21472, 21523, 21546, 21553, {f: 2, c: 21556},
- 21580, 21671, 21674, 21681, 21691, 21710, 21738, 21756, 21765, 21768,
- 21781, 21799, 21802, 21814, 21841, 21862, 21903, 21906, 21908, 21924,
- 21938, 21955, 21958, 21971, 21979, 21996, 21998, 22001, 22006, 22008,
- 22021, 22029, {f: 2, c: 22033}, 22060, 22069, 22073, 22093, 22100, 22149,
- 22175, 22182, 22199, 22220, 22223, 22233, 22241, 22251, 22253, 22257,
- 22279, 22284, {f: 2, c: 22298}, 22301, 22316, 22318, {f: 2, c: 22333},
- 22367, 22379, 22381, 22394, 22403, 22423, 22446, 22485, 22503, 22541,
- 22566, 22605, 22607, 22623, 22637, 22655, 22657, 22680, 22716, 22815,
- 22819, 22873, 22905, 22935, 22959, 22963, 23007, 23025, 23032, 23218,
- 23224, 23274, 23286, 23323, 23325, 23329, 23352, 23479, 23511, 23520,
- 23583, 23594, 23596, 23606, 23641, 23644, 23661, 23773, 23809, 23860,
- 23869, 23897, 23934, 23939, 24007, 24057, 24104, 24114, 24117, 24155,
- 24168, 24170, 24183, 24192, 24203, 24243, 24253, 24273, {f: 2, c: 24276},
- 24397, 24492, 24554, 24583, 24649, 24660, 24679, 24763, 24772, 24829,
- 24842, 24854, 24874, 24886, 24926, 24932, 24955, 24957, 24959, 24989,
- 25016, 25052, 25058, 25061, 25064, 25092, 25095, 25137, 25145, 25149,
- 25210, 25232, 25256, 25306, 25332, 25366, 25386, 25398, 25414, 25419,
- 25427, 25457, 25461, 25471, 25474, 25482, {f: 2, c: 25518}, 25578,
- {f: 2, c: 25592}, 25618, 25624, 25632, 25636, 25642, 25653, 25661, 25663,
- 25682, 25695, 25716, 25744, {f: 2, c: 25752}, 25772, 25779, 25837, 25840,
- 25883, 25887, 25902, 25929, 25952, 26002, 26005, 26036, 26046, 26056,
- 26062, 26064, 26079, 26238, {f: 2, c: 26251}, 26291, 26304, 26319, 26405,
- 26421, 26453, 26496, 26511, 26513, 26532, 26545, 26549, 26558, 26664,
- 26758, 26859, 26869, 26903, 26931, 26936, 26971, 26981, 27048, 27051,
- 27055, 27109, 27121, 27210, 27221, 27239, 27249, 27311, {f: 2, c: 27336},
- 27395, 27451, 27455, {f: 2, c: 27517}, 27568, 27639, 27641, 27652, 27657,
- 27661, 27692, 27722, 27730, 27732, 27769, 27820, 27828, 27858, 28001,
- 28028, 28089, 28144, 28229, 28275, 28283, 28285, 28297, 28348,
- {f: 2, c: 28378}, 28454, 28457, 28464, 28551, 28573, 28590, 28599, 28685,
- 28704, 28745, 28824, 28848, {f: 2, c: 28885}, 28997, 29106, 29172, 29207,
- 29215, 29251, {f: 2, c: 29263}, 29274, 29280, 29288, 29303, 29316, 29385,
- 29413, 29428, 29442, 29451, 29470, 29474, {f: 2, c: 29498}, 29517, 29528,
- 29543, 29810, 29871, 29919, 29924, 29940, 29947, 29974, 29985, 30015,
- 30046, 30105, 30116, 30145, 30148, 30156, 30167, 30172, 30177, 30191,
- 30212, 30220, 30237, 30258, 30264, 30277, 30282, 30303, 30381, 30397,
- 30425, 30443, 30448, 30457, 30464, 30478, 30498, 30504, 30511, 30521,
- 30526, 30533, 30538, 30543, 30558, 30564, 30567, 30572, 30596,
- {f: 2, c: 30604}, 30614, 30631, 30639, 30647, 30654, 30665, 30673, 30681,
- 30705, 30775, 30812, 30846, 30872, 30881, 30897, 30899, 30921, 30931,
- 30988, 31007, {f: 2, c: 31015}, 31039, 31042, 31060, 31083, 31100, 31147,
- 31172, 31210, 31234, 31244, 31280, 31290, 31300, 31360, 31366, 31380,
- 31413, 31421, 31486, 31531, 31607, 31648, 31660, 31664, 31720, 31730,
- 31736, 31740, 31742, 31753, 31784, 31791, 31810, {f: 2, c: 31826},
- {f: 3, c: 31835}, 31858, 31869, 31879, 31902, 31930, 31943, 31955, 31962,
- 32060, 32077, 32130, 32133, 32141, 32145, 32158, 32179, 32185, 32208,
- 32229, {f: 2, c: 32245}, 32303, 32310, 32324, 32367, 32376, 32385, 32573,
- 32603, 32605, 32613, 32625, {f: 2, c: 32639}, 32651, 32674,
- {f: 3, c: 32765}, 32775, 32781, 32798, 32825, 32904, 32910, 32975, 32980,
- 33005, 33008, 33015, 33018, 33022, 33027, 33047, 33072, 33111, 33135,
- 33139, 33163, 33168, 33179, 33182, 33227, 33237, {f: 2, c: 33245}, 33249,
- 33263, 33270, 33280, 33291, {f: 2, c: 33299}, 33306, 33338, 33348, 33389,
- 33412, 33417, 33425, 33450, 33456, 33488, 33514, 33519, 33526, 33622,
- 33656, 33784, 33788, 33880, 33939, 33969, 33981, 34043, 34118, 34134,
- 34141, 34181, 34200, 34370, 34374, 34496, 34580, 34594, 34606, 34617,
- 34653, 34683, 34700, 34702, {f: 2, c: 34711}, 34718, 34723, 34734, 34751,
- 34761, 34778, 34840, 34843, 34861, 34874, 34885, 34891, 34894, 34901,
- 34906, 34926, {f: 3, c: 34970}, 35021, 35040, 35055, {f: 2, c: 35086},
- 35110, 35125, 35162, 35164, 35179, 35184, 35196, 35237, 35253, 35260,
- 35285, 35401, 35415, 35431, 35454, 35462, 35478, 35510, 35529, 35537,
- 35549, 35564, 35573, 35590, 35599, 35601, 35653, 35666, 35693, 35704,
- 35708, 35710, 35717, 35743, 35915, 35923, 35963, 36026, 36037, 36041,
- 36050, 36076, 36085, 36087, 36097, 36099, 36119, 36124, 36206, 36241,
- 36255, 36267, 36274, 36309, 36327, {f: 2, c: 36337}, 36340, 36353, 36363,
- 36390, 36401, {f: 2, c: 36416}, 36429, 36431, 36444, 36449, 36457, 36465,
- 36469, 36471, 36489, 36496, 36501, 36506, 36519, 36521, 36525, 36584,
- 36592, 36615, 36632, 36645, 36647, 36652, 36661, 36666, 36675, 36679,
- 36689, 36693, {f: 3, c: 36768}, 36773, 36868, 36891, 36911, 36940, 36955,
- 36976, 36980, 36985, 37003, 37016, 37024, 37042, 37053, 37065, 37104,
- 37125, 37157, 37210, 37223, 37242, 37258, 37265, 37269, 37296, 37307,
- 37309, 37314, 37317, 37376, 37385, 37411, 37494, 37518, 37551,
- {f: 2, c: 37563}, 37569, 37571, 37573, 37576, 37652, 37683, 37686, 37720,
- 37759, 37762, 37770, 37819, 37836, 37862, 37881, 37890, {f: 2, c: 37901},
- 37934, 37964, 38280, 38305, 38335, 38342, 38345, {f: 2, c: 38353}, 38368,
- 38372, 38374, 38436, 38449, 38456, 38461, 38484, 38516, 38523, 38527,
- 38529, 38531, 38537, 38550, 38574, 38659, 38683, {f: 2, c: 38689}, 38696,
- 38705, 38759, 38774, 38781, 38783, 38809, 38815, 38828, 38841, 38861,
- 38880, 38895, 38919, 38950, 38958, {f: 2, c: 39010}, 39092, 39109, 39170,
- 39185, 39189, 39221, 39240, 39252, 39262, 39393, 39436, 39440, 39459,
- 39489, 39505, {f: 2, c: 39613}, 39681, 39689, 39691, {f: 2, c: 39693},
- 39705, 39733, 39752, 39765, 39784, 39808, 39814, 39824, 39837, 39856,
- 39871, 39880, 39935, 39938, 39964, 39989, 40004, 40022, 40033, 40040,
- 40240, 40253, 40298, 40315, 40421, 40425, 40435, 40570, {f: 3, c: 40578},
- 40624, 40676, 40688, 40690, 40713, 40719, 40724, 40731, 40738, 40742,
- {f: 2, c: 40746}, 40756, 40794, 40815, 40862, 40869, 131317, 151044,
- 151538, 163187, 194581, 194630, 194713, 194726, 194789, 195038, 13790,
- {s: 4}, 172722, 0, 0, 131416, {s: 4}, 132529, 0, 0, 132844, {s: 6}, 134488,
- {s: 21}, 154060, {s: 9}, 14756, 14776, 142914, 0, 0, 14940, 0, 0, 143339,
- 0, 0, 162228, 0, 15044, 15051, {s: 5}, 14981, {s: 8}, 15347, 27384, {s: 5},
- 15665, {s: 9}, 147531, 0, 15936, 14497, {s: 34}, 158878, {s: 12}, 18207,
- 162876, {s: 4}, 18462, {s: 71}, 39709, 39724, 20482, 20958, 21255, 23532,
- 63784, 26142, 63785, 28746, 64021, 21857, 27706, 31328, 156492, 34819,
- 38315, 38741, 171581, 173594],
- 'Adobe-Korea1': [{f: 95, c: 32}, 8361, 8208, 169, 0, 0, [12288, 12644],
- {f: 2, c: 12289}, 12539, 8229, [8230, 8943], 168, 12291, {f: 2, c: 8211},
- 8214, 65340, 65374, {f: 2, c: 8216}, {f: 2, c: 8220}, {f: 2, c: 12308},
- {f: 10, c: 12296}, 177, 215, 247, 8800, {f: 2, c: 8804}, 8734, 8756, 176,
- {f: 2, c: 8242}, 8451, 8491, {f: 2, c: 65504}, 65509, 9794, 9792, 8736,
- 8869, 8978, 8706, 8711, 8801, 8786, 167, 8251, 9734, 9733, 9675, 9679,
- 9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, 9660, 8594,
- {f: 2, c: 8592}, {f: 2, c: 8595}, 12307, 171, 187, 8730, 8765, 8733, 8757,
- {f: 2, c: 8747}, 8712, 8715, {f: 2, c: 8838}, {f: 2, c: 8834}, 8746, 8745,
- {f: 2, c: 8743}, 65506, 8658, 8660, 8704, 8707, 180, 732, 711, 728, 733,
- 730, 729, 184, 731, 161, 191, 8758, 8750, 8721, 8719, 164, 8457, 8240,
- 9665, 9664, 9655, 9654, 9828, {f: 2, c: 9824}, 9829, 9831, 9827, 9673,
- 9672, 9635, {f: 2, c: 9680}, 9618, {f: 2, c: 9636}, 9640, 9639, 9638, 9641,
- 9832, 9743, 9742, 9756, 9758, 182, {f: 2, c: 8224}, 8597, 8599, 8601, 8598,
- 8600, 9837, {f: 2, c: 9833}, 9836, 12927, 12828, 8470, 13255, 8482, 13250,
- 13272, 8481, {f: 59, c: 65281}, 65510, {f: 33, c: 65341}, 65507,
- {f: 51, c: 12593}, {f: 42, c: 12645}, {f: 10, c: 8560}, {f: 10, c: 8544},
- {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945}, {f: 7, c: 963}, 9472,
- 9474, 9484, 9488, 9496, 9492, 9500, 9516, 9508, 9524, 9532, 9473, 9475,
- 9487, 9491, 9499, 9495, 9507, 9523, 9515, 9531, 9547, 9504, 9519, 9512,
- 9527, 9535, 9501, 9520, 9509, 9528, 9538, 9490, 9489, 9498, 9497, 9494,
- 9493, 9486, 9485, {f: 2, c: 9502}, {f: 2, c: 9505}, {f: 2, c: 9510},
- {f: 2, c: 9513}, {f: 2, c: 9517}, {f: 2, c: 9521}, {f: 2, c: 9525},
- {f: 2, c: 9529}, {f: 2, c: 9533}, {f: 2, c: 9536}, {f: 8, c: 9539},
- {f: 3, c: 13205}, 8467, 13208, 13252, {f: 4, c: 13219}, {f: 10, c: 13209},
- 13258, {f: 3, c: 13197}, 13263, {f: 2, c: 13192}, 13256, {f: 2, c: 13223},
- {f: 10, c: 13232}, {f: 5, c: 13184}, {f: 6, c: 13242}, {f: 5, c: 13200},
- 8486, {f: 2, c: 13248}, {f: 3, c: 13194}, 13270, 13253, {f: 3, c: 13229},
- 13275, {f: 4, c: 13225}, 13277, 13264, 13267, 13251, 13257, 13276, 13254,
- 198, 208, 170, 294, 306, 319, 321, 216, 338, 186, 222, 358, 330,
- {f: 28, c: 12896}, {f: 26, c: 9424}, {f: 15, c: 9312}, 189,
- {f: 2, c: 8531}, 188, 190, {f: 4, c: 8539}, 230, 273, 240, 295, 305, 307,
- 312, 320, 322, 248, 339, 223, 254, 359, 331, 329, {f: 28, c: 12800},
- {f: 26, c: 9372}, {f: 15, c: 9332}, 185, {f: 2, c: 178}, 8308, 8319,
- {f: 4, c: 8321}, {f: 83, c: 12353}, {f: 86, c: 12449}, {f: 6, c: 1040},
- 1025, {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, {f: 2, c: 44032}, 44036,
- {f: 4, c: 44039}, {f: 8, c: 44048}, {f: 5, c: 44057}, 44064, 44068,
- {f: 2, c: 44076}, {f: 3, c: 44079}, {f: 2, c: 44088}, 44092, 44096, 44107,
- 44109, 44116, 44120, 44124, {f: 2, c: 44144}, 44148, {f: 2, c: 44151},
- 44154, {f: 2, c: 44160}, {f: 4, c: 44163}, {f: 4, c: 44169}, 44176, 44180,
- {f: 2, c: 44188}, {f: 3, c: 44191}, {f: 3, c: 44200}, 44204,
- {f: 2, c: 44207}, {f: 2, c: 44216}, {f: 3, c: 44219}, 44225, 44228, 44232,
- 44236, 44245, 44247, {f: 2, c: 44256}, 44260, {f: 2, c: 44263}, 44266,
- 44268, {f: 3, c: 44271}, 44275, {f: 2, c: 44277}, {f: 2, c: 44284}, 44288,
- 44292, 44294, {f: 2, c: 44300}, 44303, 44305, 44312, 44316, 44320, 44329,
- {f: 2, c: 44332}, {f: 2, c: 44340}, 44344, 44348, {f: 2, c: 44356}, 44359,
- 44361, 44368, 44372, 44376, 44385, 44387, {f: 2, c: 44396}, 44400,
- {f: 4, c: 44403}, {f: 3, c: 44411}, 44415, {f: 2, c: 44417},
- {f: 2, c: 44424}, 44428, 44432, {f: 2, c: 44444}, 44452, 44471,
- {f: 2, c: 44480}, 44484, 44488, {f: 2, c: 44496}, 44499, 44508, 44512,
- 44516, {f: 2, c: 44536}, 44540, {f: 3, c: 44543}, {f: 2, c: 44552}, 44555,
- 44557, 44564, {f: 2, c: 44592}, 44596, {f: 2, c: 44599}, 44602,
- {f: 2, c: 44608}, 44611, {f: 2, c: 44613}, 44618, {f: 3, c: 44620}, 44624,
- 44628, 44630, {f: 2, c: 44636}, {f: 3, c: 44639}, 44645, {f: 2, c: 44648},
- 44652, 44656, {f: 2, c: 44664}, {f: 3, c: 44667}, {f: 2, c: 44676}, 44684,
- {f: 3, c: 44732}, 44736, 44740, {f: 2, c: 44748}, {f: 3, c: 44751},
- {f: 2, c: 44760}, 44764, 44776, 44779, 44781, 44788, 44792, 44796,
- {f: 2, c: 44807}, 44813, 44816, {f: 2, c: 44844}, 44848, 44850, 44852,
- {f: 2, c: 44860}, 44863, {f: 3, c: 44865}, {f: 2, c: 44872}, 44880,
- {f: 2, c: 44892}, {f: 2, c: 44900}, 44921, 44928, 44932, 44936,
- {f: 2, c: 44944}, 44949, 44956, {f: 2, c: 44984}, 44988, 44992,
- {f: 3, c: 44999}, 45003, {f: 2, c: 45005}, 45012, 45020, {f: 2, c: 45032},
- {f: 2, c: 45040}, 45044, 45048, {f: 2, c: 45056}, 45060, 45068, 45072,
- 45076, {f: 2, c: 45084}, 45096, {f: 2, c: 45124}, 45128, 45130, 45132,
- 45134, {f: 3, c: 45139}, 45143, 45145, 45149, {f: 2, c: 45180}, 45184,
- 45188, {f: 2, c: 45196}, 45199, 45201, {f: 3, c: 45208}, 45212,
- {f: 4, c: 45215}, {f: 2, c: 45224}, {f: 5, c: 45227}, 45233,
- {f: 3, c: 45235}, 45240, 45244, {f: 2, c: 45252}, {f: 3, c: 45255},
- {f: 2, c: 45264}, 45268, 45272, 45280, 45285, {f: 2, c: 45320},
- {f: 2, c: 45323}, 45328, {f: 2, c: 45330}, {f: 2, c: 45336},
- {f: 3, c: 45339}, {f: 3, c: 45347}, 45352, 45356, {f: 2, c: 45364},
- {f: 3, c: 45367}, {f: 2, c: 45376}, 45380, 45384, {f: 2, c: 45392},
- {f: 2, c: 45396}, 45400, 45404, 45408, {f: 2, c: 45432}, 45436, 45440,
- 45442, {f: 2, c: 45448}, 45451, 45453, {f: 3, c: 45458}, 45464, 45468,
- 45480, 45516, 45520, 45524, {f: 2, c: 45532}, 45535, {f: 2, c: 45544},
- 45548, 45552, 45561, 45563, 45565, {f: 2, c: 45572}, 45576,
- {f: 2, c: 45579}, {f: 2, c: 45588}, 45591, 45593, 45600, 45620, 45628,
- 45656, 45660, 45664, {f: 2, c: 45672}, {f: 2, c: 45684}, 45692,
- {f: 2, c: 45700}, 45705, {f: 2, c: 45712}, 45716, {f: 3, c: 45720},
- {f: 2, c: 45728}, 45731, {f: 2, c: 45733}, 45738, 45740, 45744, 45748,
- {f: 2, c: 45768}, 45772, 45776, 45778, {f: 2, c: 45784}, 45787, 45789,
- 45794, {f: 3, c: 45796}, 45800, {f: 5, c: 45803}, {f: 3, c: 45811},
- {f: 5, c: 45815}, {f: 3, c: 45823}, 45828, 45832, {f: 2, c: 45840},
- {f: 3, c: 45843}, 45852, {f: 3, c: 45908}, 45912, {f: 2, c: 45915},
- {f: 2, c: 45918}, {f: 2, c: 45924}, 45927, 45929, 45931, 45934,
- {f: 2, c: 45936}, 45940, 45944, {f: 2, c: 45952}, {f: 3, c: 45955}, 45964,
- 45968, 45972, {f: 2, c: 45984}, 45992, 45996, {f: 2, c: 46020}, 46024,
- {f: 2, c: 46027}, 46030, 46032, {f: 2, c: 46036}, 46039, 46041, 46043,
- 46045, 46048, 46052, 46056, 46076, 46096, 46104, 46108, 46112,
- {f: 2, c: 46120}, 46123, 46132, {f: 2, c: 46160}, 46164, 46168,
- {f: 2, c: 46176}, 46179, 46181, 46188, 46208, 46216, 46237, 46244, 46248,
- 46252, 46261, 46263, 46265, 46272, 46276, 46280, 46288, 46293,
- {f: 2, c: 46300}, 46304, {f: 2, c: 46307}, 46310, {f: 2, c: 46316}, 46319,
- 46321, 46328, {f: 2, c: 46356}, 46360, {f: 2, c: 46363}, {f: 2, c: 46372},
- {f: 4, c: 46375}, {f: 2, c: 46384}, 46388, 46392, {f: 2, c: 46400},
- {f: 3, c: 46403}, {f: 3, c: 46411}, 46416, 46420, {f: 2, c: 46428},
- {f: 3, c: 46431}, {f: 2, c: 46496}, 46500, 46504, {f: 2, c: 46506},
- {f: 2, c: 46512}, {f: 3, c: 46515}, {f: 3, c: 46523}, 46528, 46532,
- {f: 2, c: 46540}, {f: 3, c: 46543}, 46552, 46572, {f: 2, c: 46608}, 46612,
- 46616, 46629, 46636, 46644, 46664, 46692, 46696, {f: 2, c: 46748}, 46752,
- 46756, {f: 2, c: 46763}, 46769, 46804, 46832, 46836, 46840,
- {f: 2, c: 46848}, 46853, {f: 2, c: 46888}, 46892, {f: 2, c: 46895},
- {f: 2, c: 46904}, 46907, 46916, 46920, 46924, {f: 2, c: 46932}, 46944,
- 46948, 46952, {f: 2, c: 46960}, 46963, 46965, {f: 2, c: 46972}, 46976,
- 46980, {f: 2, c: 46988}, {f: 4, c: 46991}, {f: 4, c: 46998}, 47004, 47008,
- {f: 2, c: 47016}, {f: 3, c: 47019}, {f: 2, c: 47028}, 47032, 47047, 47049,
- {f: 2, c: 47084}, 47088, 47092, {f: 2, c: 47100}, {f: 3, c: 47103},
- {f: 3, c: 47111}, 47116, 47120, {f: 2, c: 47128}, 47131, 47133,
- {f: 2, c: 47140}, 47144, 47148, {f: 2, c: 47156}, {f: 3, c: 47159}, 47168,
- 47172, 47185, 47187, {f: 2, c: 47196}, 47200, 47204, {f: 2, c: 47212},
- 47215, 47217, 47224, 47228, 47245, 47272, 47280, 47284, 47288,
- {f: 2, c: 47296}, 47299, 47301, 47308, 47312, 47316, 47325, 47327, 47329,
- {f: 2, c: 47336}, 47340, 47344, {f: 2, c: 47352}, 47355, 47357, 47364,
- 47384, 47392, {f: 2, c: 47420}, 47424, 47428, 47436, 47439, 47441,
- {f: 2, c: 47448}, 47452, 47456, {f: 2, c: 47464}, 47467, 47469,
- {f: 2, c: 47476}, 47480, 47484, {f: 2, c: 47492}, 47495, {f: 2, c: 47497},
- {f: 2, c: 47501}, {f: 2, c: 47532}, 47536, 47540, {f: 2, c: 47548}, 47551,
- 47553, {f: 2, c: 47560}, 47564, {f: 5, c: 47566}, {f: 2, c: 47576}, 47579,
- {f: 2, c: 47581}, 47585, {f: 3, c: 47587}, 47592, 47596, {f: 2, c: 47604},
- {f: 4, c: 47607}, {f: 2, c: 47616}, 47624, 47637, {f: 2, c: 47672}, 47676,
- 47680, 47682, {f: 2, c: 47688}, 47691, {f: 2, c: 47693}, {f: 3, c: 47699},
- 47704, 47708, {f: 2, c: 47716}, {f: 3, c: 47719}, {f: 2, c: 47728}, 47732,
- 47736, {f: 3, c: 47747}, 47751, 47756, {f: 2, c: 47784}, {f: 2, c: 47787},
- 47792, 47794, {f: 2, c: 47800}, 47803, 47805, 47812, 47816,
- {f: 2, c: 47832}, 47868, 47872, 47876, 47885, 47887, 47889, 47896, 47900,
- 47904, 47913, 47915, {f: 3, c: 47924}, 47928, {f: 4, c: 47931},
- {f: 2, c: 47940}, 47943, 47945, 47949, {f: 2, c: 47951}, 47956, 47960,
- 47969, 47971, 47980, 48008, 48012, 48016, 48036, 48040, 48044, 48052,
- 48055, 48064, 48068, 48072, 48080, 48083, {f: 2, c: 48120}, 48124,
- {f: 2, c: 48127}, 48130, {f: 2, c: 48136}, {f: 3, c: 48139}, 48143, 48145,
- {f: 5, c: 48148}, {f: 5, c: 48155}, {f: 2, c: 48164}, 48167, 48169, 48173,
- {f: 2, c: 48176}, 48180, 48184, {f: 2, c: 48192}, {f: 3, c: 48195}, 48201,
- {f: 2, c: 48204}, 48208, 48221, {f: 2, c: 48260}, 48264, {f: 2, c: 48267},
- 48270, {f: 2, c: 48276}, 48279, {f: 2, c: 48281}, {f: 2, c: 48288}, 48292,
- {f: 2, c: 48295}, {f: 2, c: 48304}, {f: 3, c: 48307}, {f: 2, c: 48316},
- 48320, 48324, 48333, {f: 3, c: 48335}, 48341, 48344, 48348,
- {f: 3, c: 48372}, 48376, 48380, {f: 2, c: 48388}, 48391, 48393, 48400,
- 48404, 48420, 48428, 48448, {f: 2, c: 48456}, 48460, 48464,
- {f: 2, c: 48472}, 48484, 48488, {f: 2, c: 48512}, 48516, {f: 4, c: 48519},
- {f: 2, c: 48528}, 48531, 48533, {f: 2, c: 48537}, 48540, 48548, 48560,
- 48568, {f: 2, c: 48596}, 48600, 48604, 48617, 48624, 48628, 48632, 48640,
- 48643, 48645, {f: 2, c: 48652}, 48656, 48660, {f: 2, c: 48668}, 48671,
- {f: 2, c: 48708}, 48712, 48716, 48718, {f: 2, c: 48724}, 48727,
- {f: 3, c: 48729}, {f: 2, c: 48736}, 48740, 48744, 48746, {f: 2, c: 48752},
- {f: 3, c: 48755}, {f: 3, c: 48763}, 48768, 48772, {f: 2, c: 48780},
- {f: 3, c: 48783}, {f: 2, c: 48792}, 48808, {f: 2, c: 48848}, 48852,
- {f: 2, c: 48855}, 48864, {f: 3, c: 48867}, 48876, 48897, {f: 2, c: 48904},
- {f: 2, c: 48920}, {f: 3, c: 48923}, {f: 2, c: 48960}, 48964, 48968,
- {f: 2, c: 48976}, 48981, 49044, 49072, 49093, {f: 2, c: 49100}, 49104,
- 49108, 49116, 49119, 49121, 49212, 49233, 49240, 49244, 49248,
- {f: 2, c: 49256}, {f: 2, c: 49296}, 49300, 49304, {f: 2, c: 49312}, 49315,
- 49317, {f: 2, c: 49324}, {f: 2, c: 49327}, {f: 4, c: 49331},
- {f: 2, c: 49340}, {f: 3, c: 49343}, 49349, {f: 2, c: 49352}, 49356, 49360,
- {f: 2, c: 49368}, {f: 3, c: 49371}, {f: 2, c: 49380}, 49384, 49388,
- {f: 2, c: 49396}, 49399, 49401, 49408, 49412, 49416, 49424, 49429,
- {f: 5, c: 49436}, {f: 2, c: 49443}, {f: 2, c: 49446}, {f: 2, c: 49452},
- {f: 3, c: 49455}, 49462, {f: 2, c: 49464}, 49468, 49472, {f: 2, c: 49480},
- {f: 3, c: 49483}, {f: 2, c: 49492}, 49496, 49500, {f: 2, c: 49508},
- {f: 3, c: 49511}, 49520, 49524, 49528, 49541, {f: 3, c: 49548}, 49552,
- 49556, 49558, {f: 2, c: 49564}, 49567, 49569, 49573, {f: 2, c: 49576},
- 49580, 49584, 49597, 49604, 49608, 49612, 49620, {f: 2, c: 49623}, 49632,
- 49636, 49640, {f: 2, c: 49648}, 49651, {f: 2, c: 49660}, 49664, 49668,
- {f: 2, c: 49676}, 49679, 49681, {f: 2, c: 49688}, 49692, {f: 2, c: 49695},
- {f: 2, c: 49704}, 49707, 49709, 49711, {f: 2, c: 49713}, 49716, 49736,
- {f: 2, c: 49744}, 49748, 49752, 49760, 49765, {f: 2, c: 49772}, 49776,
- 49780, {f: 2, c: 49788}, 49791, 49793, {f: 2, c: 49800}, 49808, 49816,
- 49819, 49821, {f: 2, c: 49828}, 49832, {f: 2, c: 49836}, {f: 2, c: 49844},
- 49847, 49849, {f: 2, c: 49884}, 49888, {f: 2, c: 49891}, {f: 3, c: 49899},
- 49903, 49905, 49910, {f: 2, c: 49912}, {f: 2, c: 49915}, 49920,
- {f: 2, c: 49928}, {f: 2, c: 49932}, {f: 3, c: 49939}, 49944, 49948,
- {f: 2, c: 49956}, {f: 2, c: 49960}, 49989, {f: 2, c: 50024}, 50028, 50032,
- 50034, {f: 2, c: 50040}, {f: 2, c: 50044}, 50052, 50056, 50060, 50112,
- {f: 2, c: 50136}, 50140, {f: 2, c: 50143}, 50146, {f: 2, c: 50152}, 50157,
- {f: 2, c: 50164}, 50168, 50184, 50192, 50212, 50220, 50224, 50228,
- {f: 2, c: 50236}, 50248, {f: 2, c: 50276}, 50280, 50284, {f: 2, c: 50292},
- 50297, 50304, 50324, 50332, 50360, 50364, 50409, {f: 2, c: 50416}, 50420,
- 50424, 50426, {f: 3, c: 50431}, 50444, 50448, 50452, 50460,
- {f: 2, c: 50472}, 50476, 50480, {f: 2, c: 50488}, 50491, 50493,
- {f: 2, c: 50500}, {f: 3, c: 50504}, {f: 3, c: 50508}, {f: 3, c: 50515},
- {f: 3, c: 50519}, {f: 2, c: 50525}, {f: 2, c: 50528}, 50532, 50536,
- {f: 2, c: 50544}, {f: 3, c: 50547}, {f: 2, c: 50556}, 50560, 50564, 50567,
- {f: 2, c: 50572}, 50575, 50577, 50581, {f: 2, c: 50583}, 50588, 50592,
- 50601, {f: 2, c: 50612}, {f: 2, c: 50616}, {f: 4, c: 50619},
- {f: 7, c: 50628}, 50636, 50638, {f: 2, c: 50640}, 50644, 50648,
- {f: 2, c: 50656}, 50659, 50661, {f: 3, c: 50668}, 50672, 50676,
- {f: 2, c: 50678}, {f: 6, c: 50684}, {f: 4, c: 50693}, 50700, 50704,
- {f: 2, c: 50712}, {f: 2, c: 50715}, {f: 2, c: 50724}, 50728,
- {f: 3, c: 50732}, 50736, {f: 3, c: 50739}, 50743, 50745, 50747,
- {f: 2, c: 50752}, 50756, 50760, {f: 2, c: 50768}, {f: 3, c: 50771},
- {f: 2, c: 50780}, 50784, 50796, 50799, 50801, {f: 2, c: 50808}, 50812,
- 50816, {f: 2, c: 50824}, 50827, 50829, {f: 2, c: 50836}, 50840, 50844,
- {f: 2, c: 50852}, 50855, 50857, {f: 2, c: 50864}, 50868, {f: 3, c: 50872},
- {f: 2, c: 50880}, 50883, 50885, {f: 2, c: 50892}, 50896, 50900,
- {f: 2, c: 50908}, {f: 2, c: 50912}, {f: 2, c: 50920}, 50924, 50928,
- {f: 2, c: 50936}, 50941, {f: 2, c: 50948}, 50952, 50956, {f: 2, c: 50964},
- 50967, 50969, {f: 2, c: 50976}, 50980, 50984, {f: 2, c: 50992}, 50995,
- 50997, 50999, {f: 2, c: 51004}, 51008, 51012, 51018, {f: 2, c: 51020},
- 51023, {f: 8, c: 51025}, 51036, 51040, 51048, 51051, {f: 2, c: 51060},
- 51064, {f: 3, c: 51068}, {f: 3, c: 51075}, {f: 4, c: 51079}, 51086,
- {f: 2, c: 51088}, 51092, {f: 3, c: 51094}, 51098, {f: 2, c: 51104},
- {f: 4, c: 51107}, {f: 2, c: 51116}, 51120, 51124, {f: 2, c: 51132},
- {f: 3, c: 51135}, {f: 2, c: 51144}, 51148, 51150, 51152, 51160, 51165,
- 51172, 51176, 51180, {f: 2, c: 51200}, 51204, 51208, 51210,
- {f: 2, c: 51216}, 51219, {f: 2, c: 51221}, {f: 2, c: 51228}, 51232, 51236,
- {f: 2, c: 51244}, 51247, 51249, 51256, 51260, 51264, {f: 2, c: 51272},
- {f: 2, c: 51276}, 51284, {f: 2, c: 51312}, 51316, 51320, 51322,
- {f: 2, c: 51328}, 51331, {f: 3, c: 51333}, {f: 3, c: 51339}, 51348, 51357,
- 51359, 51361, 51368, {f: 2, c: 51388}, 51396, 51400, 51404,
- {f: 2, c: 51412}, 51415, 51417, {f: 2, c: 51424}, 51428, 51445,
- {f: 2, c: 51452}, 51456, {f: 3, c: 51460}, {f: 2, c: 51468}, 51471, 51473,
- 51480, 51500, 51508, {f: 2, c: 51536}, 51540, 51544, {f: 2, c: 51552},
- 51555, 51564, 51568, 51572, 51580, {f: 2, c: 51592}, 51596, 51600,
- {f: 2, c: 51608}, 51611, 51613, {f: 2, c: 51648}, 51652, {f: 2, c: 51655},
- 51658, {f: 2, c: 51664}, 51667, {f: 2, c: 51669}, {f: 2, c: 51673},
- {f: 2, c: 51676}, 51680, 51682, 51684, 51687, {f: 2, c: 51692},
- {f: 3, c: 51695}, {f: 2, c: 51704}, 51708, 51712, {f: 2, c: 51720},
- {f: 3, c: 51723}, 51732, 51736, 51753, {f: 2, c: 51788}, 51792, 51796,
- {f: 2, c: 51804}, {f: 3, c: 51807}, 51816, 51837, 51844, 51864,
- {f: 2, c: 51900}, 51904, 51908, {f: 2, c: 51916}, 51919, 51921, 51923,
- {f: 2, c: 51928}, 51936, 51948, 51956, 51976, 51984, 51988, 51992,
- {f: 2, c: 52000}, 52033, {f: 2, c: 52040}, 52044, 52048, {f: 2, c: 52056},
- 52061, 52068, {f: 2, c: 52088}, 52124, 52152, 52180, 52196, 52199, 52201,
- {f: 2, c: 52236}, 52240, 52244, {f: 2, c: 52252}, {f: 2, c: 52257},
- {f: 3, c: 52263}, 52268, 52270, 52272, {f: 2, c: 52280}, {f: 4, c: 52283},
- {f: 2, c: 52292}, 52296, 52300, {f: 2, c: 52308}, {f: 3, c: 52311}, 52320,
- 52324, 52326, 52328, 52336, 52341, {f: 2, c: 52376}, 52380, 52384,
- {f: 2, c: 52392}, {f: 3, c: 52395}, {f: 2, c: 52404}, 52408, 52412,
- {f: 2, c: 52420}, 52423, 52425, 52432, 52436, 52452, 52460, 52464, 52481,
- {f: 2, c: 52488}, 52492, 52496, {f: 2, c: 52504}, 52507, 52509, 52516,
- 52520, 52524, 52537, 52572, 52576, 52580, {f: 2, c: 52588}, 52591, 52593,
- 52600, 52616, {f: 2, c: 52628}, 52632, 52636, {f: 2, c: 52644}, 52647,
- 52649, 52656, 52676, 52684, 52688, 52712, 52716, 52720, {f: 2, c: 52728},
- 52731, 52733, 52740, 52744, 52748, 52756, 52761, {f: 2, c: 52768}, 52772,
- 52776, {f: 2, c: 52784}, 52787, 52789, {f: 2, c: 52824}, 52828,
- {f: 3, c: 52831}, {f: 2, c: 52840}, 52843, 52845, {f: 2, c: 52852}, 52856,
- 52860, {f: 2, c: 52868}, 52871, 52873, {f: 2, c: 52880}, 52884, 52888,
- {f: 2, c: 52896}, {f: 3, c: 52899}, {f: 2, c: 52908}, 52929,
- {f: 2, c: 52964}, 52968, {f: 2, c: 52971}, {f: 2, c: 52980},
- {f: 3, c: 52983}, {f: 2, c: 52992}, 52996, 53000, {f: 2, c: 53008}, 53011,
- 53013, 53020, 53024, 53028, {f: 2, c: 53036}, {f: 3, c: 53039}, 53048,
- {f: 2, c: 53076}, 53080, 53084, {f: 2, c: 53092}, 53095, 53097,
- {f: 2, c: 53104}, 53108, 53112, 53120, 53125, 53132, 53153, 53160, 53168,
- 53188, {f: 2, c: 53216}, 53220, 53224, {f: 2, c: 53232}, 53235, 53237,
- 53244, 53248, 53252, 53265, 53272, 53293, {f: 2, c: 53300}, 53304, 53308,
- {f: 2, c: 53316}, 53319, 53321, 53328, 53332, 53336, 53344,
- {f: 2, c: 53356}, 53360, 53364, {f: 2, c: 53372}, 53377, {f: 2, c: 53412},
- 53416, 53420, {f: 2, c: 53428}, 53431, 53433, {f: 2, c: 53440}, 53444,
- {f: 2, c: 53448}, {f: 2, c: 53456}, {f: 3, c: 53459}, {f: 2, c: 53468},
- 53472, 53476, {f: 2, c: 53484}, {f: 3, c: 53487}, 53496, 53517,
- {f: 2, c: 53552}, 53556, 53560, 53562, {f: 2, c: 53568}, {f: 3, c: 53571},
- {f: 2, c: 53580}, 53584, 53588, {f: 2, c: 53596}, 53599, 53601, 53608,
- 53612, 53628, 53636, 53640, {f: 2, c: 53664}, 53668, 53672,
- {f: 2, c: 53680}, 53683, 53685, 53690, 53692, 53696, 53720, 53748, 53752,
- 53767, 53769, 53776, {f: 2, c: 53804}, 53808, 53812, {f: 2, c: 53820},
- 53823, 53825, 53832, 53852, 53860, {f: 2, c: 53888}, 53892, 53896,
- {f: 2, c: 53904}, 53909, 53916, 53920, 53924, 53932, 53937,
- {f: 2, c: 53944}, 53948, {f: 2, c: 53951}, 53954, {f: 2, c: 53960}, 53963,
- 53972, 53976, 53980, {f: 2, c: 53988}, {f: 2, c: 54000}, 54004, 54008,
- {f: 2, c: 54016}, 54019, 54021, {f: 3, c: 54028}, 54032, 54036, 54038,
- {f: 2, c: 54044}, {f: 3, c: 54047}, 54053, {f: 2, c: 54056}, 54060, 54064,
- {f: 2, c: 54072}, {f: 3, c: 54075}, {f: 2, c: 54084}, {f: 2, c: 54140},
- 54144, 54148, {f: 2, c: 54156}, {f: 3, c: 54159}, {f: 2, c: 54168}, 54172,
- 54176, {f: 2, c: 54184}, 54187, 54189, 54196, 54200, 54204,
- {f: 2, c: 54212}, {f: 2, c: 54216}, 54224, 54232, 54241, 54243,
- {f: 2, c: 54252}, 54256, 54260, {f: 2, c: 54268}, 54271, 54273, 54280,
- 54301, 54336, 54340, 54364, 54368, 54372, 54381, 54383, {f: 2, c: 54392},
- 54396, {f: 2, c: 54399}, 54402, {f: 2, c: 54408}, 54411, 54413, 54420,
- 54441, 54476, 54480, 54484, 54492, 54495, 54504, 54508, 54512, 54520,
- 54523, 54525, 54532, 54536, 54540, {f: 2, c: 54548}, 54551,
- {f: 2, c: 54588}, 54592, 54596, {f: 2, c: 54604}, 54607, 54609,
- {f: 2, c: 54616}, 54620, 54624, 54629, {f: 2, c: 54632}, 54635, 54637,
- {f: 2, c: 54644}, 54648, 54652, {f: 2, c: 54660}, {f: 3, c: 54663}, 54672,
- 54693, {f: 2, c: 54728}, 54732, 54736, 54738, {f: 2, c: 54744}, 54747,
- 54749, {f: 2, c: 54756}, 54760, 54764, {f: 2, c: 54772}, 54775, 54777,
- {f: 2, c: 54784}, 54788, 54792, {f: 2, c: 54800}, {f: 3, c: 54803}, 54812,
- 54816, 54820, 54829, {f: 2, c: 54840}, 54844, 54848, 54853,
- {f: 2, c: 54856}, 54859, 54861, 54865, {f: 2, c: 54868}, 54872, 54876,
- 54887, 54889, {f: 2, c: 54896}, 54900, 54915, 54917, {f: 2, c: 54924},
- 54928, 54932, 54941, 54943, 54945, 54952, 54956, 54960, 54969, 54971,
- {f: 2, c: 54980}, 54984, 54988, 54993, 54996, 54999, 55001, 55008, 55012,
- 55016, 55024, 55029, {f: 2, c: 55036}, 55040, 55044, 55057,
- {f: 2, c: 55064}, 55068, 55072, {f: 2, c: 55080}, 55083, 55085,
- {f: 2, c: 55092}, 55096, 55100, 55108, 55111, 55113, {f: 2, c: 55120},
- 55124, {f: 4, c: 55126}, {f: 2, c: 55136}, 55139, 55141, 55145, 55148,
- 55152, 55156, {f: 2, c: 55164}, 55169, {f: 2, c: 55176}, 55180, 55184,
- {f: 2, c: 55192}, 55195, 55197, 20285, 20339, 20551, 20729, 21152, 21487,
- 21621, 21733, 22025, 23233, 23478, 26247, {f: 2, c: 26550}, 26607, 27468,
- 29634, 30146, 31292, 33499, 33540, 34903, 34952, 35382, [36040, 63747],
- 36303, 36603, 36838, 39381, 21051, 21364, 21508, 24682, 24932, 27580,
- 29647, 33050, 35258, [12179, 35282], 38307, 20355, 21002, 22718, 22904,
- 23014, [12082, 24178], 24185, 25031, 25536, 26438, 26604, 26751, 28567,
- 30286, 30475, 30965, 31240, 31487, 31777, 32925, [12169, 33390], 33393,
- 35563, 38291, 20075, 21917, 26359, 28212, 30883, 31469, 33883, 35088,
- 34638, 38824, 21208, 22350, 22570, 23884, 24863, 25022, 25121, 25954,
- 26577, 27204, 28187, [12130, 29976], 30131, 30435, 30640, 32058, 37039,
- {f: 2, c: 37969}, 40853, 21283, 23724, 30002, 32987, 37440, 38296, 21083,
- 22536, 23004, 23713, 23831, 24247, 24378, 24394, 24951, 27743, 30074,
- 30086, 31968, 32115, 32177, 32652, 33108, 33313, 34193, 35137, 35611,
- 37628, [38477, 64009], 40007, 20171, 20215, 20491, 20977, 22607, 24887,
- 24894, 24936, 25913, 27114, 28433, 30117, 30342, 30422, 31623, 33445,
- 33995, 37799, 38283, 21888, 23458, 22353, 31923, 32697, 37301, 20520,
- 21435, 23621, 24040, 25298, 25454, 25818, 25831, 28192, 28844, 31067,
- 36317, 36382, 36989, 37445, 37624, 20094, 20214, 20581, [12081, 24062],
- 24314, 24838, 26967, 33137, 34388, 36423, 37749, 39467, 20062, 20625,
- 26480, 26688, 20745, 21133, 21138, 27298, 30652, 37392, 40660, 21163,
- 24623, 36850, 20552, 25001, 25581, 25802, 26684, 27268, 28608, 33160,
- 35233, 38548, 22533, 29309, [12125, 29356], 29956, 32121, 32365, 32937,
- [12178, 35211, 64010], 35700, 36963, 40273, 25225, 27770, 28500, 32080,
- 32570, 35363, 20860, 24906, 31645, 35609, 37463, 37772, 20140, 20435,
- 20510, 20670, 20742, 21185, 21197, 21375, 22384, 22659, 24218, 24465,
- 24950, 25004, 25806, 25964, 26223, 26299, [26356, 63745], 26775, 28039,
- 28805, 28913, 29855, 29861, 29898, 30169, 30828, 30956, 31455, 31478,
- 32069, 32147, 32789, 32831, 33051, 33686, 35686, 36629, 36885, 37857,
- 38915, 38968, 39514, 39912, 20418, 21843, 22586, [22865, 63753], 23395,
- 23622, 24760, 25106, 26690, 26800, 26856, 28330, 30028, 30328, 30926,
- 31293, 31995, 32363, 32380, 35336, 35489, 35903, 38542, 40388, 21476,
- 21481, 21578, 21617, 22266, 22993, 23396, 23611, 24235, 25335, 25911,
- 25925, 25970, 26272, 26543, 27073, 27837, 30204, 30352, 30590, 31295,
- 32660, 32771, 32929, 33167, 33510, 33533, 33776, 34241, 34865, 34996,
- 35493, 36764, 37678, 38599, 39015, [12220, 39640], [12238, 40723], 21741,
- 26011, 26354, 26767, 31296, [12181, 35895], 40288, 22256, 22372, 23825,
- 26118, 26801, 26829, 28414, 29736, 34974, 39908, 27752, [12219, 39592],
- 20379, 20844, 20849, 21151, 23380, [12079, 24037], 24656, 24685, 25329,
- 25511, 25915, 29657, 31354, 34467, 36002, 38799, [20018, 63749], 23521,
- [12093, 25096], 26524, [12128, 29916], 31185, 33747, 35463, 35506, 36328,
- 36942, 37707, 38982, [24275, 64011], 27112, 34303, 37101, 20896, 23448,
- 23532, 24931, 26874, 27454, 28748, 29743, 29912, 31649, 32592, 33733,
- 35264, 36011, 38364, 39208, 21038, 24669, 25324, 36866, 20362, 20809,
- 21281, 22745, 24291, 26336, 27960, 28826, 29378, 29654, 31568, 33009,
- 37979, 21350, 25499, 32619, 20054, 20608, 22602, 22750, 24618, 24871,
- 25296, 27088, 39745, 23439, 32024, 32945, 36703, 20132, 20689, 21676,
- 21932, 23308, 23968, 24039, 25898, 25934, 26657, 27211, 29409, 30350,
- 30703, 32094, 32761, 33184, 34126, 34527, 36611, 36686, 37066, 39171,
- 39509, 39851, 19992, 20037, 20061, 20167, 20465, 20855, 21246, 21312,
- [12061, 21475], [21477, 63750], 21646, 22036, 22389, 22434, 23495, 23943,
- 24272, 25084, 25304, 25937, 26552, 26601, 27083, 27472, 27590, 27628,
- 27714, 28317, 28792, 29399, 29590, 29699, 30655, 30697, 31350, 32127,
- 32777, [12165, 33276], 33285, 33290, 33503, 34914, 35635, 36092, 36544,
- 36881, 37041, 37476, 37558, 39378, 39493, 40169, 40407,
- [12244, 40860, 63751, 63752], 22283, 23616, 33738, 38816, 38827, 40628,
- 21531, 31384, 32676, 35033, 36557, 37089, 22528, 23624, 25496, 31391,
- 23470, [12088, 24339], 31353, 31406, 33422, 36524, 20518, 21048, 21240,
- 21367, 22280, 25331, 25458, 27402, 28099, 30519, 21413, 29527, 34152,
- 36470, 38357, 26426, 27331, 28528, 35437, 36556, 39243, 26231, 27512,
- 36020, [12225, 39740], 21483, 22317, 22862, 25542, 27131, 29674, 30789,
- 31418, 31429, 31998, 33909, 35215, 36211, 36917, 38312, 21243, 22343,
- 30023, 31584, 33740, 37406, 27224, 20811, 21067, 21127, 25119, 26840,
- 26997, 38553, 20677, 21156, 21220, 25027, [12100, 26020], 26681, 27135,
- 29822, 31563, 33465, 33771, 35250, 35641, 36817, 39241, 20170, 22935,
- 25810, 26129, 27278, 29748, 31105, 31165, 33449, {f: 2, c: 34942}, 35167,
- 37670, 20235, 21450, 24613, 25201, 27762, 32026, 32102, 20120, 20834,
- 30684, 32943, 20225, 20238, 20854, 20864, 21980, 22120, 22331, 22522,
- 22524, 22804, 22855, 22931, 23492, 23696, 23822, [12080, 24049], 24190,
- 24524, 25216, 26071, 26083, {f: 2, c: 26398}, 26462, 26827, 26820, 27231,
- 27450, 27683, 27773, 27778, 28103, 29592, 29734, 29738, 29826, 29859,
- 30072, 30079, 30849, 30959, 31041, {f: 2, c: 31047}, 31098, 31637, 32000,
- 32186, 32648, 32774, 32813, 32908, 35352, 35663, [35912, 63744], 36215,
- 37665, 37668, 39138, 39249, {f: 2, c: 39438}, 39525, 40594, 32202, 20342,
- 21513, 25326, 26708, [12198, 37329, 63754], 21931, 20794, 23068, 25062,
- [25295, 63835], 25343, 37027, [35582, 63837], 26262, 29014, 38627, 25423,
- 25466, 21335, 26511, 26976, 28275, 30007, 32013, 34930, 22218, 23064,
- 20035, 20839, [22856, 63756], 26608, 32784, [12069, 22899, 63873],
- [24180, 63886], [25754, 63889], [31178, 63893], [24565, 63907], 24684,
- 25288, [25467, 63908], [23527, 63839, 63914], 23511, 21162, 22900, 24361,
- [24594, 63840], 29785, 39377, 28611, 33215, 36786, 24817, 33126,
- [23615, 63933], 23273, 35365, [26491, 63944], [32016, 63951], 33021, 23612,
- [27877, 63971], [21311, 63979], [28346, 63980], 22810, [33590, 63998],
- [20025, 63838], 20150, 20294, 21934, 22296, 22727, 24406, 26039, 26086,
- 27264, 27573, 28237, 30701, 31471, 31774, 32222, 34507, 34962, 37170,
- 37723, 25787, 28606, 29562, 30136, 36948, 21846, 22349, 25018, 25812,
- 26311, 28129, 28251, 28525, 28601, 30192, 32835, 33213, 34113, 35203,
- 35527, 35674, 37663, 27795, 30035, 31572, 36367, 36957, 21776, 22530,
- 22616, 24162, 25095, 25758, 26848, 30070, [31958, 64003], 34739, 40680,
- 20195, 22408, 22382, [12068, 22823], 23565, 23729, 24118, 24453, 25140,
- 25825, 29619, 33274, 34955, 36024, 38538, 40667, [23429, 64004], 24503,
- 24755, 20498, [12049, 20992], 21040, 22294, 22581, 22615, 23566, 23648,
- 23798, 23947, [24230, 64001], 24466, 24764, 25361, 25481, 25623, 26691,
- 26873, 27330, 28120, 28193, 28372, 28644, 29182, 30428, 30585, 31153,
- 31291, 33796, 35241, 36077, 36339, 36424, 36867, 36884, 36947, 37117,
- 37709, 38518, 38876, 27602, 28678, 29272, 29346, 29544, 30563, 31167,
- 31716, 32411, [35712, 63834], 22697, 24775, 25958, 26109, 26302, 27788,
- 28958, 29129, 35930, 38931, 20077, 31361, 20189, 20908, 20941, 21205,
- 21516, 24999, 26481, 26704, 26847, [27934, 64005], 28540, 30140, 30643,
- 31461, 33012, 33891, 37509, 20828, [12099, 26007], 26460, 26515, 30168,
- 31431, 33651, [12182, 35910], 36887, 38957, 23663, 33216, 33434, 36929,
- 36975, 37389, 24471, 23965, 27225, 29128, 30331, 31561, 34276, 35588,
- 37159, 39472, [21895, 63755], [25078, 63757], [30313, 63758],
- [32645, 63759], [34367, 63760], [34746, 63761], [35064, 63762],
- [37007, 63763], [27931, 63765], [28889, 63766], [29662, 63767], 32097,
- [33853, 63768], [37226, 63769], [39409, 63770], [20098, 63771],
- [21365, 63772], [27396, 63773], 27410, 28734, [29211, 63774],
- [34349, 63775], [40478, 63776], 21068, 36771, [23888, 63777], 25829, 25900,
- 27414, [28651, 63778], 31811, 32412, [34253, 63779], [35172, 63780], 35261,
- [25289, 63781], [33240, 63782], [34847, 63783], [24266, 63784],
- [26391, 63785], [28010, 63786], [29436, 63787], 29701, 29807, 34690,
- [37086, 63788], [20358, 63789], 23821, 24480, 33802, [20919, 63790],
- [25504, 63861], [30053, 63862], [20142, 63863], 20486, [20841, 63864],
- [20937, 63865], [26753, 63866], 27153, 31918, 31921, [31975, 63867],
- [33391, 63868], [35538, 63869], 36635, [37327, 63870], 20406, 20791,
- [21237, 63871], [21570, 63872], [24300, 63874], 24942, 25150,
- [26053, 63875], 27354, [28670, 63876], [31018, 63877], 34268, 34851,
- [38317, 63878], 39522, [39530, 63879], [40599, 63880], [40654, 63881],
- [12050, 21147, 63882], [26310, 63883], [27511, 63884], 28701, 31019,
- [36706, 63885], 38722, [24976, 63887], [25088, 63888], 25891,
- [28451, 63890], [29001, 63891], [29833, 63892], [32244, 63894],
- [32879, 63895], [34030, 63897], [36646, 63896], [36899, 63898],
- [37706, 63899], 20925, [21015, 63900], [21155, 63901], 27916,
- [28872, 63903], [35010, 63904], [24265, 63906], 25986, [27566, 63909],
- 28610, [31806, 63910], [29557, 63911], [20196, 63912], 20278,
- [22265, 63913], 23738, [23994, 63915], [24604, 63916], [29618, 63917],
- 31533, [32666, 63919], 32718, [32838, 63920], 36894, [37428, 63921],
- [38646, 63922], [38728, 63923], [38936, 63924], 40801, [20363, 63925],
- 28583, [31150, 63926], [37300, 63927], [38583, 63928], [21214, 63791],
- 25736, [25796, 63792], [27347, 63793], 28510, 28696, [29200, 63794],
- [30439, 63795], [12156, 32769, 63796], [34310, 63797], [34396, 63798],
- [36335, 63799], 36613, [38706, 63800], [39791, 63801], [40442, 63802],
- [12228, 40565], [30860, 63803], [31103, 63804], [32160, 63805],
- [33737, 63806], [37636, 63807], [12229, 40575, 63808], 40595,
- [35542, 63809], [22751, 63810], [24324, 63811], 26407, 28711, 29903,
- [31840, 63812], [32894, 63813], 20769, 28712, [29282, 63814],
- [30922, 63815], [36034, 63816], 36058, 36084, [38647, 63817],
- [20102, 63930], [20698, 63931], [23534, 63932], 24278, [26009, 63934],
- [29134, 63936], [30274, 63937], 30637, 32842, [34044, 63938],
- [36988, 63939], 39719, [12243, 40845, 63940], [22744, 63818], 23105,
- [23650, 63819], [27155, 63820], [28122, 63821], [28431, 63822], 30267,
- [32047, 63823], [32311, 63824], 34078, 35128, 37860, [38475, 63825],
- [21129, 63943], 26066, [26611, 63945], 27060, [27969, 63946],
- [28316, 63947], 28687, [29705, 63948], 29792, [30041, 63949], 30244,
- [30827, 63950], 35628, [39006, 63952], [20845, 63953], [25134, 63954],
- [38520, 63955], 20374, [20523, 63956], [23833, 63957], [28138, 63958],
- 32184, [36650, 63959], [24459, 63960], [24900, 63961], [26647, 63962],
- [38534, 63964], [21202, 63826], [32907, 63827], [20956, 63828],
- [20940, 63829], 26974, [31260, 63830], [32190, 63831], [33777, 63832],
- [38517, 63833], 20442, [21033, 63965], 21400, [21519, 63966], 21774,
- [23653, 63967], 24743, [26446, 63969], [26792, 63970], 28012, 29313, 29432,
- [29702, 63972], 29827, [30178, 63973], 31852, [32633, 63974], 32696, 33673,
- [35023, 63975], [35041, 63976], [12197, 37324, 63977], 37328,
- [38626, 63978], 39881, [21533, 63981], 28542, [29136, 63982],
- [29848, 63983], [34298, 63984], 36522, [38563, 63985], [40023, 63986],
- [40607, 63987], [26519, 63988], [28107, 63989], 29747, [33256, 63990],
- 38678, 30764, [12148, 31435, 63991], [31520, 63992], [31890, 63993], 25705,
- 29802, 30194, 30908, 30952, [12218, 39340], 39764, [12231, 40635], 23518,
- 24149, 28448, 33180, 33707, 37000, 19975, 21325, 23081, 24018, 24398,
- 24930, 25405, 26217, 26364, 28415, 28459, 28771, 30622, 33836, 34067,
- 34875, 36627, 39237, 39995, 21788, 25273, 26411, 27819, 33545, 35178,
- 38778, 20129, 22916, {f: 2, c: 24536}, 26395, 32178, 32596, 33426, 33579,
- 33725, 36638, 37017, 22475, 22969, 23186, 23504, 26151, 26522, 26757,
- 27599, 29028, 32629, 36023, 36067, 36993, 39749, 33032, 35978, 38476,
- 39488, [12230, 40613], 23391, 27667, 29467, 30450, 30431, 33804, 20906,
- 35219, 20813, 20885, 21193, 26825, 27796, 30468, 30496, 32191, 32236,
- [12207, 38754], 40629, 28357, 34065, 20901, 21517, 21629, 26126, 26269,
- 26919, 28319, [12139, 30399], 30609, 33559, 33986, 34719, 37225, 37528,
- 40180, 34946, 20398, 20882, 21215, 22982, 24125, 24917, {f: 2, c: 25720},
- 26286, 26576, 27169, 27597, [12113, 27611], 29279, 29281, 29761, 30520,
- [12141, 30683], 32791, 33468, 33541, 35584, 35624, 35980, [12106, 26408],
- 27792, 29287, [12140, 30446], 30566, 31302, 40361, 27519, 27794, 22818,
- 26406, 33945, 21359, 22675, 22937, 24287, 25551, 26164, 26483, 28218,
- 29483, 31447, 33495, 37672, 21209, 24043, 25006, 25035, 25098, 25287,
- 25771, [12102, 26080], 26969, 27494, [12111, 27595], 28961, 29687, 30045,
- 32326, 33310, 33538, 34154, 35491, 36031, 38695, 40289, 22696, 40664,
- 20497, 21006, 21563, 21839, [12098, 25991], 27766, {f: 2, c: 32010}, 32862,
- 34442, [12200, 38272], 38639, 21247, 27797, 29289, 21619, 23194, 23614,
- 23883, 24396, 24494, 26410, 26806, 26979, 28220, 28228, 30473,
- [12150, 31859], 32654, 34183, 35598, 36855, 38753, 40692, 23735, 24758,
- 24845, 25003, 25935, {f: 2, c: 26107}, 27665, 27887, 29599, 29641, 32225,
- 38292, 23494, 34588, 35600, 21085, 21338, 25293, 25615, 25778, 26420,
- 27192, 27850, 29632, 29854, 31636, 31893, 32283, 33162, 33334, 34180,
- 36843, 38649, 39361, 20276, 21322, 21453, 21467, 25292, 25644, 25856,
- 26001, 27075, 27886, 28504, 29677, 30036, 30242, 30436, 30460, 30928,
- [30971, 63844], 31020, 32070, 33324, 34784, 36820, 38930, 39151, 21187,
- 25300, 25765, 28196, 28497, 30332, 36299, 37297, 37474, 39662, 39747,
- 20515, 20621, 22346, 22952, 23592, 24135, 24439, 25151, 25918,
- [12101, 26041], 26049, 26121, 26507, 27036, 28354, 30917, 32033, 32938,
- 33152, 33323, 33459, 33953, 34444, 35370, 35607, 37030, 38450, 40848,
- 20493, 20467, 22521, 24472, 25308, 25490, 26479, 28227, 28953, 30403,
- 32972, 32986, {f: 2, c: 35060}, 35097, 36064, 36649, 37197, 38506, 20271,
- 20336, 24091, 26575, 26658, [12137, 30333], 30334, 39748, 24161, 27146,
- 29033, 29140, 30058, 32321, 34115, 34281, 39132, 20240, 31567, 32624,
- 38309, 20961, 24070, 26805, 27710, 27726, 27867, 29359, 31684, 33539,
- 27861, 29754, 20731, 21128, 22721, 25816, 27287, 29863, 30294, 30887,
- 34327, 38370, 38713, 21342, 24321, 35722, 36776, 36783, 37002, 21029,
- 30629, 40009, 40712, 19993, 20482, 20853, 23643, 24183, 26142, 26170,
- 26564, 26821, 28851, 29953, 30149, 31177, 31453, 36647, 39200, 39432,
- 20445, 22561, 22577, 23542, 26222, 27493, 27921, 28282, 28541, 29668,
- 29995, 33769, 35036, 35091, 35676, 36628, 20239, 20693, 21264,
- [12056, 21340], 23443, [24489, 63846], 26381, 31119, 33145, 33583, 34068,
- 35079, 35206, 36665, [36667, 64007], 39333, 39954, 26412, 20086, 20472,
- 22857, 23553, {f: 2, c: 23791}, 25447, 26834, 28925, 29090, 29739, 32299,
- 34028, 34562, 36898, 37586, 40179, [19981, 63847], 20184, 20463, 20613,
- 21078, 21103, 21542, 21648, 22496, 22827, 23142, 23386, 23413, 23500,
- 24220, 25206, 25975, 26023, 28014, 28325, [12119, 29238], 31526, 31807,
- [12152, 32566], {f: 2, c: 33104}, 33178, 33344, 33433, 33705, 35331, 36000,
- 36070, 36091, 36212, 36282, 37096, 37340, [12201, 38428], 38468, 39385,
- 40167, [21271, 63843], 20998, 21545, 22132, 22707, 22868, 22894, 24575,
- 24996, 25198, 26128, 27774, 28954, 30406, 31881, 31966, 32027, 33452,
- 36033, 38640, 20315, 24343, 24447, 25282, 23849, 26379, 26842, 30844,
- 32323, 40300, 19989, 20633, [12052, 21269], 21290, 21329, 22915, 23138,
- 24199, 24754, 24970, 25161, 25209, 26000, 26503, 27047, [12112, 27604],
- {f: 3, c: 27606}, 27832, 29749, 30202, 30738, 30865, 31189, 31192, 31875,
- 32203, 32737, 32933, 33086, 33218, 33778, 34586, 35048, 35513, 35692,
- 36027, 37145, [12206, 38750], [12214, 39131], [12240, 40763], 22188, 23338,
- 24428, 25996, 27315, 27567, 27996, 28657, 28693, 29277, 29613, 36007,
- 36051, 38971, 24977, 27703, 32856, 39425, 20045, 20107, 20123, 20181,
- 20282, 20284, 20351, 20447, 20735, 21490, 21496, 21766, 21987, 22235,
- [12064, 22763], 22882, 23057, 23531, 23546, 23556, 24051, 24107, 24473,
- 24605, 25448, 26012, 26031, 26614, 26619, 26797, 27515, 27801, 27863,
- 28195, 28681, 29509, 30722, 31038, 31040, 31072, 31169, 31721, 32023,
- 32114, 32902, 33293, 33678, 34001, 34503, 35039, 35408, 35422, 35613,
- 36060, 36198, 36781, 37034, 39164, 39391, 40605, 21066, 26388, 20632,
- 21034, [12077, 23665], 25955, 27733, 29642, 29987, 30109, 31639, 33948,
- 37240, 38704, 20087, 25746, [27578, 63856], 29022, 34217, 19977, 26441,
- 26862, 28183, 33439, 34072, 34923, 25591, 28545, 37394, 39087, 19978,
- 20663, 20687, 20767, 21830, 21930, 22039, 23360, 23577, 23776, 24120,
- 24202, 24224, 24258, 24819, 26705, 27233, 28248, 29245, 29248,
- [29376, 63994], 30456, 31077, 31665, 32724, 35059, 35316, 35443, 35937,
- 36062, 38684, [22622, 63852], 29885, 36093, 21959, 31329, [32034, 63850],
- [12170, 33394], 29298, [12131, 29983], 29989, 31513, 22661, 22779, 23996,
- 24207, 24246, 24464, 24661, 25234, 25471, 25933, 26257, 26329, 26360,
- 26646, 26866, 29312, 29790, 31598, 32110, 32214, 32626, 32997, 33298,
- 34223, 35199, 35475, 36893, 37604, [12233, 40653], [12239, 40736],
- [12067, 22805], 22893, 24109, 24796, 26132, 26227, 26512, 27728, 28101,
- 28511, [12143, 30707], 30889, 33990, 37323, 37675, 20185, 20682, 20808,
- 21892, 23307, 23459, 25159, 25982, 26059, 28210, 29053, 29697, 29764,
- 29831, 29887, 30316, 31146, 32218, 32341, 32680, 33146, 33203, 33337,
- 34330, 34796, 35445, 36323, 36984, 37521, 37925, 39245, 39854, 21352,
- 23633, 26964, 27844, 27945, 28203, [12166, 33292], 34203, 35131, 35373,
- [35498, 63855, 63905], 38634, 40807, 21089, 26297, 27570, 32406, 34814,
- 36109, 38275, 38493, 25885, 28041, 29166, 22478, 22995, 23468, 24615,
- 24826, 25104, 26143, 26207, 29481, 29689, 30427, [30465, 63853], 31596,
- 32854, 32882, 33125, 35488, 37266, 19990, 21218, 27506, 27927, 31237,
- 31545, 32048, 36016, 21484, 22063, 22609, 23477, [12073, 23567], 23569,
- 24034, 25152, 25475, 25620, 26157, 26803, 27836, 28040, 28335, 28703,
- 28836, 29138, 29990, 30095, 30094, 30233, 31505, 31712, 31787, 32032,
- 32057, 34092, 34157, 34311, 35380, 36877, 36961, 37045, 37559, 38902,
- 39479, 20439, 23660, 26463, 28049, 31903, 32396, 35606, 36118, 36895,
- 23403, 24061, 25613, 33984, 36956, 39137, [29575, 63841, 63963], 23435,
- 24730, 26494, 28126, 35359, 35494, 36865, 38924, 21047, 28753, 30862,
- 37782, 34928, 37335, 20462, 21463, 22013, 22234, 22402, 22781, 23234,
- 23432, 23723, 23744, 24101, 24833, 25101, [12095, 25163], 25480, 25628,
- 25910, [25976, 63849], 27193, 27530, [12116, 27700], 27929, 28465, 29159,
- 29417, 29560, 29703, 29874, 30246, 30561, 31168, 31319, 31466, 31929,
- 32143, 32172, 32353, 32670, 33065, 33585, 33936, 34010, 34282, 34966,
- 35504, 35728, 36664, 36930, 36995, 37228, 37526, 37561, 38539,
- {f: 2, c: 38567}, 38614, 38656, 38920, [12216, 39318], 39635, 39706, 21460,
- 22654, 22809, 23408, 23487, 28113, 28506, 29087, 29729, 29881, 32901,
- 33789, 24033, 24455, 24490, 24642, 26092, 26642, 26991, 27219, 27529,
- 27957, 28147, 29667, 30462, 30636, 31565, 32020, 33059, 33308, 33600,
- 34036, 34147, 35426, 35524, 37255, 37662, 38918, 39348, 25100, 34899,
- 36848, 37477, 23815, 23847, 23913, 29791, 33181, 34664, 28629,
- [25342, 63859], 32722, 35126, 35186, 19998, 20056, 20711, 21213, 21319,
- 25215, 26119, 32361, 34821, 38494, 20365, 21273, 22070, 22987, 23204,
- [12075, 23608], 23630, 23629, 24066, 24337, 24643, 26045, 26159, 26178,
- 26558, 26612, 29468, [12142, 30690], [12144, 31034], 32709, 33940, 33997,
- 35222, 35430, 35433, 35553, [12183, 35925], 35962, 22516, 23508, 24335,
- 24687, 25325, 26893, 27542, 28252, 29060, 31698, 34645, [35672, 63996],
- 36606, [12215, 39135], 39166, 20280, 20353, 20449, 21627, 23072, 23480,
- 24892, 26032, 26216, 29180, 30003, 31070, 32051, 33102, [12162, 33251],
- 33688, 34218, 34254, 34563, 35338, [12189, 36523], [12191, 36763], 36805,
- 22833, 23460, 23526, 24713, 23529, 23563, [12092, 24515], 27777, 28145,
- 28683, 29978, 33455, 35574, [20160, 63997], [12055, 21313], 38617,
- [12114, 27663], 20126, 20420, 20818, 21854, 23077, 23784, 25105,
- [12123, 29273], 33469, 33706, 34558, 34905, 35357, 38463, 38597, 39187,
- 40201, 40285, 22538, 23731, 23997, 24132, [24801, 63929], 24853, 25569,
- [27138, 63764, 63836, 63935], 28197, 37122, 37716, 38990, 39952, 40823,
- 23433, 23736, 25353, 26191, 26696, 30524, 38593, 38797, 38996, 39839,
- 26017, 35585, 36555, 38332, 21813, 23721, 24022, 24245, 26263, 30284,
- 33780, 38343, 22739, 25276, 29390, 40232, 20208, 22830, 24591, 26171,
- 27523, 31207, 40230, 21395, 21696, 22467, 23830, 24859, 26326, 28079,
- 30861, 33406, 38552, 38724, 21380, 25212, 25494, 28082, 32266, 33099,
- 38989, 27387, 32588, 40367, 40474, 20063, 20539, 20918, 22812, 24825,
- 25590, 26928, 29242, 32822, 37326, 24369, 32004, [33509, 63860], 33903,
- 33979, 34277, 36493, 20335, 22756, 23363, 24665, 25562, 25880, 25965,
- 26264, 26954, 27171, 27915, 28673, 29036, 30162, 30221, 31155, 31344,
- [12154, 32650], 35140, 35731, 37312, 38525, 39178, 22276, 24481, 26044,
- 28417, 30208, 31142, 35486, 39341, [12226, 39770], 40812, 20740, 25014,
- 25233, 27277, 33222, 20547, 22576, 24422, 28937, [12180, 35328], 35578,
- 23420, 34326, 20474, 20796, 22196, 22852, 25513, 28153, 23978, 26989,
- 20870, 20104, 20313, 22914, 27487, 27741, 29877, 30998, 33287, 33349,
- 33593, 36671, 36701, 39192, 20134, 22495, 24441, [26131, 63968], 30123,
- 32377, 35695, 36870, 39515, 22181, 22567, 23032, 23071, 23476, 24310,
- 25424, 25403, 26941, 27783, 27839, 28046, 28051, 28149, 28436, 28895,
- 28982, 29017, 29123, 29141, 30799, 30831, 31605, 32227, 32303, 34893,
- 36575, 37467, 40182, 24709, 28037, 29105, 38321, 21421, 26579, 28814,
- 28976, 29744, 33398, 33490, 38331, 39653, 40573, 26308, 29121,
- [33865, 63854], 22603, 23992, 24433, 26144, 26254, 27001, 27054, 27704,
- 27891, 28214, 28481, 28634, 28699, 28719, 29008, 29151, 29552, 29787,
- 29908, 30408, 31310, 32403, 33521, 35424, 36814, 37704, 38681, 20034,
- 20522, 21000, 21473, 26355, 27757, 28618, 29450, 30591, 31330, 33454,
- 34269, 34306, 35028, 35427, 35709, 35947, 37555, 38675, 38928, 20116,
- 20237, 20425, 20658, 21320, 21566, 21555, 21978, 22626, 22714, 22887,
- 23067, 23524, 24735, 25034, 25942, 26111, 26212, 26791, 27738, 28595,
- 28879, 29100, 29522, 31613, 34568, 35492, 39986, 40711, 23627, 27779,
- 29508, [12127, 29577], 37434, 28331, 29797, 30239, 31337, 32277, 34314,
- 20800, 22725, 25793, 29934, 29973, 30320, 32705, 37013, 38605, 39252,
- 28198, [12129, 29926], {f: 2, c: 31401}, 33253, 34521, 34680, 35355, 23113,
- 23436, 23451, 26785, 26880, 28003, 29609, 29715, 29740, 30871, 32233,
- 32747, 33048, 33109, 33694, 35916, [38446, 63942], 38929, [12104, 26352],
- 24448, 26106, 26505, 27754, 29579, 20525, 23043, 27498, 30702, 22806,
- 23916, 24013, 29477, 30031, 20709, 20985, 22575, 22829, 22934, 23002,
- 23525, 23970, 25303, 25622, 25747, 25854, 26332, 27208, 29183, 29796,
- 31368, 31407, 32327, 32350, 32768, 33136, 34799, 35201, 35616, 36953,
- 36992, 39250, 24958, 27442, 28020, 32287, 35109, 36785, 20433, 20653,
- 20887, 21191, 22471, 22665, 23481, 24248, 24898, 27029, 28044, 28263,
- 28342, 29076, 29794, [12132, 29992], 29996, 32883, 33592, 33993, 36362,
- 37780, 37854, 20110, 20305, 20598, 20778, [12060, 21448], 21451, 21491,
- 23431, 23507, 23588, 24858, 24962, 26100, [12124, 29275], 29591, 29760,
- 30402, 31056, 31121, 31161, 32006, [12155, 32701], 33419, 34261, 34398,
- 36802, 36935, 37109, 37354, 38533, [12204, 38632], 38633, 21206, 24423,
- 26093, 26161, 26671, 29020, 31286, 37057, 38922, 20113, 27218, 27550,
- 28560, 29065, 32792, 33464, 34131, 36939, 38549, 38642, 38907, 34074,
- 39729, 20112, 29066, 38596, 20803, 21407, 21729, 22291, 22290, 22435,
- 23195, 23236, 23491, 24616, 24895, 25588, 27781, 27961, 28274, 28304,
- 29232, 29503, 29783, 33489, 34945, 36677, 36960, 38498, 39000, 40219,
- [12105, 26376], 36234, 37470, 20301, 20553, 20702, 21361, 22285, 22996,
- 23041, 23561, 24944, 26256, 28205, 29234, 29771, 32239, 32963, 33806,
- 33894, 34111, 34655, 34907, 35096, 35586, 36949, [12209, 38859], 39759,
- 20083, 20369, 20754, 20842, 21807, 21929, 23418, 23461, {f: 2, c: 24188},
- 24254, 24736, 24799, {f: 2, c: 24840}, 25540, 25912, 26377, 26580, 26586,
- {f: 2, c: 26977}, 27833, 27943, 28216, 28641, {f: 2, c: 29494}, 29788,
- 30001, 30290, 32173, 33278, 33848, 35029, 35480, 35547, 35565, 36400,
- 36418, 36938, 36926, 36986, [12195, 37193], 37321, 37742, 22537, 27603,
- [12161, 32905], 32946, 20801, 22891, 23609, 28516, 29607, 32996, 36103,
- 37399, 38287, [12160, 32895], 25102, 28700, 32104, 34701, 22432, 24681,
- 24903, 27575, 35518, 37504, 38577, [12036, 20057], 21535, 28139, 34093,
- 38512, [12211, 38899], 39150, 25558, 27875, [12194, 37009], 20957, 25033,
- 33210, 40441, 20381, 20506, 20736, 23452, 24847, 25087, 25836, 26885,
- 27589, 30097, 30691, 32681, 33380, 34191, 34811, [12176, 34915], 35516,
- 35696, 37291, [12038, 20108], 20197, 20234, 22839, 23016, 24050, 24347,
- 24411, 24609, 29246, 29669, [30064, 63842], 30157, 31227, [12157, 32780],
- [12159, 32819], 32900, 33505, 33617, 36029, 36019, 36999, 39156, 39180,
- 28727, 30410, 32714, 32716, 32764, 35610, [12040, 20154], 20161, 20995,
- 21360, [21693, 63902], 22240, 23035, 23493, 24341, 24525, 28270, 32106,
- 33589, 34451, 35469, 38765, 38775, [12032, 19968], 20314, 20350, 22777,
- [12103, 26085], 28322, 36920, 37808, 39353, 20219, 22764, 22922, 23001,
- 24641, 31252, 33615, 36035, [12042, 20837], 21316, 20173, 21097, 23381,
- 33471, 20180, [21050, 63999], 21672, 22985, 23039, [12070, 23376], 23383,
- 23388, 24675, 24904, 28363, [28825, 63995], 29038, 29574, 29943, 30133,
- 30913, 32043, 32773, [12163, 33258], 33576, 34071, 34249, 35566, 36039,
- 38604, 20316, 21242, 22204, 26027, 26152, 28796, 28856, 29237, 32189,
- 33421, 37196, 38592, 40306, 23409, 26855, 27544, 28538, 30430, 23697,
- 26283, 28507, 31668, 31786, 34870, 38620, 19976, 20183, 21280, 22580,
- 22715, 22767, 22892, 23559, 24115, 24196, 24373, 25484, 26290, 26454,
- 27167, 27299, 27404, 28479, 29254, 29520, 29835, 31456, 31911, 33144,
- 33247, 33255, 33674, 33900, 34083, 34196, 34255, 35037, 36115, 37292,
- [12199, 38263], 38556, 20877, 21705, 22312, 23472, 25165, 26448, 26685,
- 26771, 28221, 28371, 28797, 32289, 35009, 36001, 36617, 40779, 40782,
- 29229, 31631, 35533, 37658, 20295, 20302, 20786, 21632, 22992, 24213,
- 25269, 26485, 26990, 27159, 27822, 28186, 29401, 29482, 30141, 31672,
- 32053, 33511, 33785, 33879, 34295, 35419, 36015, 36487, 36889, 37048,
- 38606, 40799, 21219, 21514, 23265, 23490, 25688, 25973, 28404, 29380,
- 30340, 31309, 31515, 31821, 32318, 32735, 33659, 35627, 36042,
- [12186, 36196], 36321, 36447, 36842, 36857, 36969, 37841, 20291, 20346,
- 20659, 20840, 20856, 21069, 21098, 22625, 22652, 22880, 23560, 23637,
- 24283, 24731, 25136, 26643, 27583, 27656, 28593, 29006, 29728,
- [12133, 30000], 30008, 30033, 30322, 31564, 31627, 31661, 31686, 32399,
- 35438, 36670, 36681, 37439, 37523, 37666, 37931, 38651, 39002, 39019,
- 39198, [20999, 64000], 25130, 25240, 27993, 30308, 31434, 31680, 32118,
- 21344, 23742, 24215, 28472, 28857, 31896, 38673, 39822, 40670, 25509,
- 25722, 34678, 19969, 20117, 20141, 20572, 20597, 21576, 22979, 23450,
- 24128, 24237, 24311, 24449, 24773, 25402, 25919, 25972, 26060, 26230,
- 26232, 26622, 26984, 27273, 27491, 27712, 28096, 28136, 28191, 28254,
- 28702, 28833, 29582, 29693, 30010, 30555, 30855, 31118, 31243, 31357,
- 31934, 32142, 33351, 35330, 35562, 35998, 37165, 37194, 37336, 37478,
- 37580, 37664, 38662, 38742, 38748, 38914, [12237, 40718], 21046, 21137,
- 21884, 22564, 24093, 24351, 24716, 25552, 26799, 28639, 31085, 31532,
- 33229, 34234, 35069, 35576, 36420, 37261, 38500, 38555, 38717, 38988,
- [12241, 40778], 20430, 20806, 20939, 21161, 22066, 24340, 24427, 25514,
- 25805, 26089, 26177, 26362, 26361, 26397, 26781, 26839, 27133, 28437,
- 28526, 29031, 29157, [12118, 29226], 29866, 30522, 31062, 31066, 31199,
- 31264, 31381, 31895, 31967, 32068, 32368, 32903, 34299, 34468, 35412,
- 35519, 36249, 36481, 36896, 36973, 37347, 38459, 38613, [12227, 40165],
- 26063, 31751, [12188, 36275], 37827, 23384, 23562, 21330, 25305, 29469,
- 20519, 23447, 24478, 24752, 24939, 26837, 28121, 29742, 31278, 32066,
- 32156, 32305, 33131, 36394, 36405, 37758, 37912, 20304, 22352, 24038,
- 24231, 25387, 32618, 20027, 20303, 20367, 20570, 23005, 32964, 21610,
- 21608, 22014, 22863, 23449, 24030, 24282, 26205, 26417, 26609, 26666,
- 27880, 27954, 28234, 28557, 28855, 29664, 30087, 31820, 32002, 32044,
- 32162, [12168, 33311], 34523, 35387, 35461, [12187, 36208], 36490, 36659,
- 36913, 37198, 37202, 37956, 39376, [12149, 31481], 31909, 20426, 20737,
- 20934, 22472, 23535, 23803, 26201, 27197, 27994, 28310, 28652, 28940,
- 30063, 31459, 34850, 36897, 36981, 38603, 39423, 33537, 20013, 20210,
- 34886, 37325, 21373, 27355, 26987, 27713, 33914, 22686, 24974, 26366,
- 25327, 28893, 29969, 30151, 32338, 33976, 35657, 36104, 20043, 21482,
- 21675, 22320, 22336, 24535, 25345, 25351, 25711, [12096, 25903], 26088,
- 26234, 26525, 26547, [12108, 27490], 27744, 27802, 28460, 30693, 30757,
- 31049, 31063, 32025, 32930, 33026, [12164, 33267], 33437, 33463, 34584,
- 35468, 36100, 36286, 36978, 30452, 31257, 31287, 32340, 32887, 21767,
- 21972, 22645, 25391, 25634, 26185, 26187, 26733, 27035, 27524, 27941,
- 28337, 29645, 29800, 29857, 30043, 30137, 30433, 30494, 30603, 31206,
- 32265, 32285, 33275, 34095, 34967, 35386, 36049, 36587,
- [12192, 36784, 63857], 36914, 37805, 38499, 38515, 38663, 20356, 21489,
- 23018, 23241, 24089, 26702, 29894, 30142, 31209, 31378, 33187, 34541,
- 36074, 36300, 36845, 26015, 26389, 22519, 28503, 32221, 36655, 37878,
- 38598, 24501, 25074, 28548, 19988, 20376, 20511, 21449, 21983, 23919,
- 24046, 27425, 27492, 30923, 31642, 36425, [12190, 36554, 63746], 36974,
- 25417, 25662, 30528, 31364, 37679, 38015, 40810, 25776, 28591, 29158,
- 29864, 29914, 31428, 31762, 32386, 31922, 32408, 35738, 36106, 38013,
- 39184, 39244, 21049, 23519, 25830, 26413, 32046, 20717, [21443, 63851],
- 22649, {f: 2, c: 24920}, 25082, 26028, 31449, 35730, 35734, 20489, 20513,
- 21109, 21809, 23100, 24288, 24432, 24884, 25950, 26124, 26166, 26274,
- 27085, 28356, 28466, 29462, 30241, 31379, 33081, 33369, 33750, 33980,
- 20661, 22512, 23488, 23528, 24425, 25505, 30758, 32181, 33756, 34081,
- 37319, 37365, 20874, 26613, 31574, 36012, 20932, 22971, 24765, 34389,
- 20508, 21076, 23610, 24957, 25114, [25299, 64002], 25842, 26021, 28364,
- 30240, 33034, 36448, 38495, 38587, 20191, 21315, 21912, 22825, 24029,
- 25797, 27849, 28154, 29588, 31359, [12167, 33307], 34214, 36068, 36368,
- 36983, 37351, 38369, 38433, 38854, 20984, 21746, 21894, 24505, 25764,
- 28552, 32180, 36639, 36685, 37941, 20681, 23574, 27838, 28155, 29979,
- 30651, 31805, 31844, 35449, 35522, 22558, 22974, 24086, 25463, 29266,
- 30090, 30571, 35548, 36028, 36626, 24307, 26228, 28152, 32893, 33729,
- 35531, [12205, 38737], 39894, 21059, 26367, 28053, 28399, 32224, 35558,
- 36910, 36958, 39636, 21021, 21119, 21736, 24980, 25220, 25307, 26786,
- 26898, 26970, 27189, 28818, 28966, 30813, 30977, 30990, 31186, 31245,
- 32918, [12171, 33400], 33493, 33609, 34121, 35970, 36229, 37218, 37259,
- 37294, 20419, 22225, 29165, 30679, 34560, 35320, [12072, 23544], 24534,
- 26449, 37032, 21474, 22618, 23541, 24740, 24961, 25696, 32317, 32880,
- 34085, 37507, 25774, 20652, 23828, 26368, 22684, 25277, 25512, 26894,
- 27000, 27166, 28267, 30394, 31179, 33467, 33833, 35535, 36264, 36861,
- 37138, 37195, 37276, 37648, 37656, 37786, 38619, 39478, 39949, 19985,
- 30044, 31069, 31482, 31569, 31689, 32302, 33988, 36441, 36468, 36600,
- 36880, 26149, 26943, 29763, 20986, 26414, 40668, 20805, 24544, 27798,
- 34802, 34909, 34935, 24756, 33205, 33795, 36101, 21462, 21561, 22068,
- 23094, 23601, 28810, 32736, 32858, 33030, 33261, 36259, 37257, 39519,
- 40434, 20596, 20164, 21408, 24827, 28204, 23652, 20360, 20516, 21988,
- 23769, 24159, 24677, 26772, 27835, 28100, 29118, 30164, 30196, 30305,
- 31258, 31305, 32199, 32251, 32622, 33268, 34473, 36636, 38601, 39347,
- [12242, 40786], 21063, 21189, 39149, 35242, 19971, 26578, 28422, 20405,
- 23522, 26517, [27784, 63858], 28024, 29723, 30759, 37341, 37756, 34756,
- 31204, 31281, 24555, 20182, 21668, 21822, 22702, 22949, 24816, 25171,
- 25302, 26422, 26965, 33333, 38464, 39345, 39389, 20524, 21331, 21828,
- 22396, 25176, 25826, 26219, 26589, 28609, 28655, 29730, 29752, 35351,
- 37944, 21585, 22022, 22374, 24392, 24986, 27470, 28760, 28845, 32187,
- 35477, 22890, 33067, 25506, 30472, 32829, 36010, 22612, 25645, 27067,
- 23445, 24081, 28271, 34153, 20812, 21488, 22826, 24608, 24907, 27526,
- 27760, 27888, 31518, 32974, 33492, 36294, 37040, 39089, 25799, 28580,
- 25745, 25860, 20814, 21520, [12063, 22303], 35342, 24927, 26742, 30171,
- 31570, 32113, 36890, 22534, 27084, 33151, 35114, 36864, 38969, 20600,
- 22871, 22956, 25237, 36879, 39722, 24925, 29305, 38358, 22369, 23110,
- 24052, 25226, 25773, 25850, 26487, 27874, 27966, 29228, 29750, 30772,
- 32631, 33453, 36315, 38935, 21028, 22338, 26495, 29256, 29923, 36009,
- 36774, 37393, 38442, [12043, 20843], 21485, 25420, 20329, 21764, 24726,
- 25943, 27803, 28031, 29260, 29437, 31255, 35207, [12185, 35997], 24429,
- 28558, 28921, 33192, 24846, [20415, 63845], 20559, 25153, [12122, 29255],
- 31687, 32232, 32745, 36941, 38829, 39449, 36022, 22378, 24179, 26544,
- 33805, 35413, 21536, 23318, 24163, 24290, 24330, 25987, 32954, 34109,
- 38281, 38491, 20296, 21253, 21261, 21263, 21638, 21754, 22275, 24067,
- 24598, 25243, 25265, 25429, 27873, 28006, 30129, 30770, 32990, 33071,
- 33502, 33889, 33970, 34957, 35090, 36875, 37610, 39165, 39825, 24133,
- [26292, 64006], 26333, 28689, 29190, 20469, 21117, 24426, 24915, 26451,
- 27161, 28418, 29922, 31080, 34920, 35961, 39111, 39108, 39491, 21697,
- 31263, 26963, 35575, 35914, [12213, 39080], 39342, 24444, 25259, 30130,
- [12138, 30382], 34987, 36991, 38466, 21305, 24380, 24517, [27852, 63848],
- 29644, 30050, [12134, 30091], 31558, 33534, 39325, 20047, 36924, 19979,
- 20309, 21414, 22799, 24264, 26160, 27827, 29781, 33655, 34662, 36032,
- 36944, 38686, 39957, 22737, 23416, 34384, 35604, 40372, 23506, 24680,
- 24717, 26097, 27735, 28450, 28579, 28698, 32597, 32752, {f: 2, c: 38289},
- 38480, 38867, 21106, 36676, 20989, 21547, 21688, 21859, 21898, 27323,
- 28085, 32216, 33382, 37532, 38519, 40569, 21512, 21704, 30418, 34532,
- 38308, 38356, 38492, 20130, 20233, 23022, 23270, 24055, 24658, 25239,
- 26477, 26689, 27782, 28207, 32568, 32923, 33322, 38917, 20133, 20565,
- 21683, 22419, 22874, 23401, 23475, 25032, 26999, 28023, 28707, 34809,
- 35299, 35442, 35559, 36994, 39405, 39608, 21182, 26680, 20502, 24184,
- 26447, 33607, [12175, 34892, 64008], 20139, 21521, 22190, 29670, 37141,
- 38911, 39177, 39255, [12217, 39321], 22099, 22687, 34395, 35377, 25010,
- 27382, 29563, 36562, 27463, 38570, 39511, 22869, 29184, 36203,
- [12208, 38761], 20436, 23796, 24358, 25080, 26203, 27883, 28843,
- [12126, 29572], 29625, 29694, 30505, 30541, 32067, 32098, 32291, 33335,
- 34898, 36066, 37449, 39023, 23377, [12147, 31348], [12174, 34880],
- [12212, 38913], 23244, 20448, 21332, 22846, 23805, 25406, 28025, 29433,
- 33029, 33031, 33698, 37583, 38960, 20136, 20804, 21009, 22411, 24418,
- 27842, 28366, 28677, 28752, 28847, 29074, 29673, [29801, 63918], 33610,
- 34722, 34913, 36872, 37026, 37795, 39336, 20846, 24407, 24800, 24935,
- 26291, 34137, 36426, 37295, 38795, 20046, 20114, 21628, 22741, 22778,
- 22909, 23733, 24359, [12094, 25142], 25160, 26122, 26215, 27627, 28009,
- 28111, 28246, 28408, 28564, 28640, 28649, 28765, 29392, 29733, 29786,
- 29920, 30355, 31068, 31946, 32286, 32993, 33446, 33899, 33983, 34382,
- 34399, 34676, 35703, 35946, 37804, 38912, 39013, 24785, 25110, 37239,
- 23130, 26127, 28151, 28222, 29759, 39746, 24573, 24794, 31503, 21700,
- 24344, 27742, 27859, 27946, 28888, 32005, 34425, 35340, 40251, 21270,
- 21644, 23301, 27194, [12117, 28779], 30069, 31117, [12146, 31166], 33457,
- 33775, 35441, 35649, 36008, 38772, 25844, 25899, {f: 2, c: 30906}, 31339,
- 20024, 21914, 22864, 23462, 24187, 24739, 25563, 27489, 26213, 26707,
- 28185, 29029, 29872, 32008, 36996, 39529, 39973, 27963, [28369, 63748],
- 29502, 35905, 38346, 20976, 24140, 24488, 24653, 24822, 24880, 24908,
- {f: 2, c: 26179}, 27045, 27841, 28255, 28361, 28514, 29004, 29852, 30343,
- 31681, 31783, 33618, 34647, 36945, 38541, [12232, 40643], 21295, 22238,
- 24315, 24458, 24674, 24724, 25079, 26214, 26371, 27292, 28142, 28590,
- 28784, 29546, 32362, 33214, 33588, 34516, 35496, 36036, 21123, 29554,
- 23446, 27243, 37892, 21742, 22150, 23389, 25928, 25989, 26313, 26783,
- 28045, 28102, [12120, 29243], 32948, 37237, 39501, 20399, 20505, 21402,
- 21518, 21564, 21897, 21957, 24127, 24460, 26429, 29030, 29661, 36869,
- 21211, 21235, 22628, 22734, 28932, 29071, 29179, 34224, 35347,
- [26248, 63941], 34216, 21927, 26244, 29002, 33841, 21321, 21913, 27585,
- 24409, 24509, 25582, 26249, 28999, 35569, 36637, 40638, 20241, 25658,
- 28875, 30054, 34407, 24676, 35662, 40440, 20807, 20982, 21256, 27958,
- 33016, [12234, 40657], 26133, 27427, 28824, 30165, 21507, 23673, 32007,
- 35350, [12107, 27424], 27453, 27462, 21560, 24688, 27965, 32725, 33288,
- 20694, 20958, 21916, 22123, 22221, 23020, 23305, 24076, 24985, 24984,
- 25137, 26206, 26342, 29081, {f: 2, c: 29113}, 29351, 31143, 31232, 32690,
- 35440, {s: 163}, {f: 4, c: 12310}, {s: 14}, 8223, 8219, {f: 2, c: 8314},
- {s: 7}, 8316, 0, {f: 2, c: 8317}, {s: 23}, 700, {s: 44}, 8942, 8759,
- {s: 20}, {f: 10, c: 10122}, {s: 36}, {f: 26, c: 9398}, {s: 61},
- {f: 2, c: 8826}, {f: 2, c: 8910}, {f: 2, c: 8832}, {f: 4, c: 8816}, 0,
- 8842, 0, 8843, {f: 2, c: 8822}, 8825, {f: 2, c: 8922}, {s: 5}, 8773, 8771,
- 8776, 0, 8868, {s: 78}, 8244, {s: 11}, 9839, {s: 4}, 8258, {s: 4}, 10045,
- 0, 0, 8226, {s: 4}, {f: 2, c: 8249}, {s: 16}, 10010, 10006, 0, 9711,
- {s: 3}, 10070, 0, 9676, {s: 24}, 9775, {s: 6}, 12320, 0, {f: 10, c: 10102},
- {s: 17}, 12306, 12342, {s: 13}, 8710, 0, 8735, 0, {f: 2, c: 8741}, 0, 8787,
- 8785, {f: 2, c: 8806}, 8723, {f: 3, c: 8853}, 0, 8980, 0, 0, 8802, 0, 9649,
- 0, 8738, 8784, 0, 0, 8867, 0, 0, {f: 2, c: 8814}, 8837, 8836, 8713, 8716,
- {f: 2, c: 8891}, 8794, 8966, {s: 6}, 12958, 0, 8252, {s: 11}, 9702, {s: 3},
- 9663, 9653, 9657, 9667, {s: 4}, 9674, 12849, 12857, 13259, {f: 5, c: 9327},
- {s: 18}, 8656, 8655, 8653, {s: 37}, 8657, 8659, {s: 8}, 8626, 8625, 0,
- 8628, 8624, 8627, {s: 14}, 8636, 8640, {s: 10}, {f: 2, c: 8644}, {s: 144},
- {f: 5, c: 9347}, {s: 33}, 12948, {s: 15}, 12965, {s: 93}, 8672, 8674, 8673,
- 8675, {s: 4}, 8678, 8680, 8679, 8681, {s: 20}, 9757, 9759, {s: 76}, 12944,
- {f: 6, c: 12938}, {s: 15}, {f: 2, c: 12318}, 8246, 0, 8245, {s: 3}, 12540,
- 0, 0, {f: 2, c: 44034}, {f: 2, c: 44037}, {f: 5, c: 44043}, 44056,
- {f: 2, c: 44062}, {f: 3, c: 44065}, {f: 7, c: 44069}, 44078,
- {f: 6, c: 44082}, {f: 2, c: 44090}, {f: 3, c: 44093}, {f: 10, c: 44097},
- 44108, {f: 6, c: 44110}, {f: 3, c: 44117}, {f: 3, c: 44121},
- {f: 19, c: 44125}, {f: 2, c: 44146}, {f: 2, c: 44149}, 44153,
- {f: 5, c: 44155}, 44162, {f: 2, c: 44167}, {f: 3, c: 44173},
- {f: 3, c: 44177}, {f: 7, c: 44181}, 44190, {f: 6, c: 44194}, 44203,
- {f: 2, c: 44205}, {f: 7, c: 44209}, 44218, {f: 3, c: 44222},
- {f: 2, c: 44226}, {f: 3, c: 44229}, {f: 3, c: 44233}, {f: 8, c: 44237},
- 44246, {f: 8, c: 44248}, {f: 2, c: 44258}, {f: 2, c: 44261}, 44265, 44267,
- {f: 2, c: 44269}, 44274, 44276, {f: 5, c: 44279}, {f: 2, c: 44286},
- {f: 3, c: 44289}, 44293, {f: 5, c: 44295}, 44302, 44304, {f: 6, c: 44306},
- {f: 3, c: 44313}, {f: 3, c: 44317}, {f: 8, c: 44321}, {f: 2, c: 44330},
- {f: 6, c: 44334}, {f: 2, c: 44342}, {f: 3, c: 44345}, {f: 7, c: 44349},
- 44358, 44360, {f: 6, c: 44362}, {f: 3, c: 44369}, {f: 3, c: 44373},
- {f: 8, c: 44377}, 44386, {f: 8, c: 44388}, {f: 2, c: 44398},
- {f: 2, c: 44401}, {f: 4, c: 44407}, 44414, 44416, {f: 5, c: 44419},
- {f: 2, c: 44426}, {f: 3, c: 44429}, {f: 11, c: 44433}, {f: 6, c: 44446},
- {f: 18, c: 44453}, {f: 8, c: 44472}, {f: 2, c: 44482}, {f: 3, c: 44485},
- {f: 7, c: 44489}, 44498, {f: 8, c: 44500}, {f: 3, c: 44509},
- {f: 3, c: 44513}, {f: 19, c: 44517}, {f: 2, c: 44538}, {f: 2, c: 44541},
- {f: 6, c: 44546}, 44554, 44556, {f: 6, c: 44558}, {f: 27, c: 44565},
- {f: 2, c: 44594}, {f: 2, c: 44597}, 44601, {f: 5, c: 44603}, 44610, 44612,
- {f: 3, c: 44615}, 44619, 44623, {f: 3, c: 44625}, 44629, {f: 5, c: 44631},
- 44638, {f: 3, c: 44642}, {f: 2, c: 44646}, {f: 2, c: 44650},
- {f: 3, c: 44653}, {f: 7, c: 44657}, 44666, {f: 6, c: 44670},
- {f: 6, c: 44678}, {f: 47, c: 44685}, 44735, {f: 3, c: 44737},
- {f: 7, c: 44741}, 44750, {f: 6, c: 44754}, {f: 2, c: 44762},
- {f: 11, c: 44765}, {f: 2, c: 44777}, 44780, {f: 6, c: 44782},
- {f: 3, c: 44789}, {f: 3, c: 44793}, {f: 10, c: 44797}, {f: 4, c: 44809},
- {f: 2, c: 44814}, {f: 27, c: 44817}, {f: 2, c: 44846}, 44849, 44851,
- {f: 7, c: 44853}, 44862, 44864, {f: 4, c: 44868}, {f: 6, c: 44874},
- {f: 11, c: 44881}, {f: 6, c: 44894}, {f: 19, c: 44902}, {f: 6, c: 44922},
- {f: 3, c: 44929}, {f: 3, c: 44933}, {f: 7, c: 44937}, {f: 3, c: 44946},
- {f: 6, c: 44950}, {f: 27, c: 44957}, {f: 2, c: 44986}, {f: 3, c: 44989},
- {f: 6, c: 44993}, 45002, 45004, {f: 5, c: 45007}, {f: 7, c: 45013},
- {f: 11, c: 45021}, {f: 6, c: 45034}, {f: 2, c: 45042}, {f: 3, c: 45045},
- {f: 7, c: 45049}, {f: 2, c: 45058}, {f: 7, c: 45061}, {f: 3, c: 45069},
- {f: 3, c: 45073}, {f: 7, c: 45077}, {f: 10, c: 45086}, {f: 27, c: 45097},
- {f: 2, c: 45126}, 45129, 45131, 45133, {f: 4, c: 45135}, 45142, 45144,
- {f: 3, c: 45146}, {f: 30, c: 45150}, {f: 2, c: 45182}, {f: 3, c: 45185},
- {f: 7, c: 45189}, 45198, 45200, {f: 6, c: 45202}, 45211, {f: 2, c: 45213},
- {f: 5, c: 45219}, 45226, 45232, 45234, {f: 2, c: 45238}, {f: 3, c: 45241},
- {f: 7, c: 45245}, 45254, {f: 6, c: 45258}, {f: 2, c: 45266},
- {f: 3, c: 45269}, {f: 7, c: 45273}, {f: 4, c: 45281}, {f: 34, c: 45286},
- 45322, {f: 3, c: 45325}, 45329, {f: 4, c: 45332}, 45338, {f: 5, c: 45342},
- {f: 2, c: 45350}, {f: 3, c: 45353}, {f: 7, c: 45357}, 45366,
- {f: 6, c: 45370}, {f: 2, c: 45378}, {f: 3, c: 45381}, {f: 7, c: 45385},
- {f: 2, c: 45394}, {f: 2, c: 45398}, {f: 3, c: 45401}, {f: 3, c: 45405},
- {f: 23, c: 45409}, {f: 2, c: 45434}, {f: 3, c: 45437}, 45441,
- {f: 5, c: 45443}, 45450, 45452, {f: 4, c: 45454}, {f: 3, c: 45461},
- {f: 3, c: 45465}, {f: 11, c: 45469}, {f: 35, c: 45481}, {f: 3, c: 45517},
- {f: 3, c: 45521}, {f: 7, c: 45525}, 45534, {f: 8, c: 45536},
- {f: 2, c: 45546}, {f: 3, c: 45549}, {f: 8, c: 45553}, 45562, 45564,
- {f: 6, c: 45566}, {f: 2, c: 45574}, {f: 2, c: 45577}, {f: 7, c: 45581},
- 45590, 45592, {f: 6, c: 45594}, {f: 19, c: 45601}, {f: 7, c: 45621},
- {f: 27, c: 45629}, {f: 3, c: 45657}, {f: 3, c: 45661}, {f: 7, c: 45665},
- {f: 10, c: 45674}, {f: 6, c: 45686}, {f: 7, c: 45693}, {f: 3, c: 45702},
- {f: 6, c: 45706}, {f: 2, c: 45714}, {f: 3, c: 45717}, {f: 5, c: 45723},
- 45730, 45732, {f: 3, c: 45735}, 45739, {f: 3, c: 45741}, {f: 3, c: 45745},
- {f: 19, c: 45749}, {f: 2, c: 45770}, {f: 3, c: 45773}, 45777,
- {f: 5, c: 45779}, 45786, 45788, {f: 4, c: 45790}, 45795, 45799,
- {f: 2, c: 45801}, {f: 3, c: 45808}, 45814, {f: 3, c: 45820},
- {f: 2, c: 45826}, {f: 3, c: 45829}, {f: 7, c: 45833}, 45842,
- {f: 6, c: 45846}, {f: 55, c: 45853}, 45911, {f: 2, c: 45913}, 45917,
- {f: 4, c: 45920}, 45926, 45928, 45930, {f: 2, c: 45932}, 45935,
- {f: 2, c: 45938}, {f: 3, c: 45941}, {f: 7, c: 45945}, 45954,
- {f: 6, c: 45958}, {f: 3, c: 45965}, {f: 3, c: 45969}, {f: 11, c: 45973},
- {f: 6, c: 45986}, {f: 3, c: 45993}, {f: 23, c: 45997}, {f: 2, c: 46022},
- {f: 2, c: 46025}, 46029, 46031, {f: 3, c: 46033}, 46038, 46040, 46042,
- 46044, {f: 2, c: 46046}, {f: 3, c: 46049}, {f: 3, c: 46053},
- {f: 19, c: 46057}, {f: 19, c: 46077}, {f: 7, c: 46097}, {f: 3, c: 46105},
- {f: 3, c: 46109}, {f: 7, c: 46113}, 46122, {f: 8, c: 46124},
- {f: 27, c: 46133}, {f: 2, c: 46162}, {f: 3, c: 46165}, {f: 7, c: 46169},
- 46178, 46180, {f: 6, c: 46182}, {f: 19, c: 46189}, {f: 7, c: 46209},
- {f: 20, c: 46217}, {f: 6, c: 46238}, {f: 3, c: 46245}, {f: 3, c: 46249},
- {f: 8, c: 46253}, 46262, 46264, {f: 6, c: 46266}, {f: 3, c: 46273},
- {f: 3, c: 46277}, {f: 7, c: 46281}, {f: 4, c: 46289}, {f: 6, c: 46294},
- {f: 2, c: 46302}, {f: 2, c: 46305}, 46309, {f: 5, c: 46311}, 46318, 46320,
- {f: 6, c: 46322}, {f: 27, c: 46329}, {f: 2, c: 46358}, {f: 2, c: 46361},
- {f: 7, c: 46365}, 46374, {f: 5, c: 46379}, {f: 2, c: 46386},
- {f: 3, c: 46389}, {f: 7, c: 46393}, 46402, {f: 5, c: 46406},
- {f: 2, c: 46414}, {f: 3, c: 46417}, {f: 7, c: 46421}, 46430,
- {f: 62, c: 46434}, {f: 2, c: 46498}, {f: 3, c: 46501}, 46505,
- {f: 4, c: 46508}, 46514, {f: 5, c: 46518}, {f: 2, c: 46526},
- {f: 3, c: 46529}, {f: 7, c: 46533}, 46542, {f: 6, c: 46546},
- {f: 19, c: 46553}, {f: 35, c: 46573}, {f: 2, c: 46610}, {f: 3, c: 46613},
- {f: 12, c: 46617}, {f: 6, c: 46630}, {f: 7, c: 46637}, {f: 19, c: 46645},
- {f: 27, c: 46665}, {f: 3, c: 46693}, {f: 51, c: 46697}, {f: 2, c: 46750},
- {f: 3, c: 46753}, {f: 6, c: 46757}, {f: 4, c: 46765}, {f: 34, c: 46770},
- {f: 27, c: 46805}, {f: 3, c: 46833}, {f: 3, c: 46837}, {f: 7, c: 46841},
- {f: 3, c: 46850}, {f: 34, c: 46854}, {f: 2, c: 46890}, {f: 2, c: 46893},
- {f: 7, c: 46897}, 46906, {f: 8, c: 46908}, {f: 3, c: 46917},
- {f: 3, c: 46921}, {f: 7, c: 46925}, {f: 10, c: 46934}, {f: 3, c: 46945},
- {f: 3, c: 46949}, {f: 7, c: 46953}, 46962, 46964, {f: 6, c: 46966},
- {f: 2, c: 46974}, {f: 3, c: 46977}, {f: 7, c: 46981}, 46990,
- {f: 3, c: 46995}, {f: 2, c: 47002}, {f: 3, c: 47005}, {f: 7, c: 47009},
- 47018, {f: 6, c: 47022}, {f: 2, c: 47030}, {f: 14, c: 47033}, 47048,
- {f: 34, c: 47050}, {f: 2, c: 47086}, {f: 3, c: 47089}, {f: 7, c: 47093},
- 47102, {f: 5, c: 47106}, {f: 2, c: 47114}, {f: 3, c: 47117},
- {f: 7, c: 47121}, 47130, 47132, {f: 6, c: 47134}, {f: 2, c: 47142},
- {f: 3, c: 47145}, {f: 7, c: 47149}, 47158, {f: 6, c: 47162},
- {f: 3, c: 47169}, {f: 12, c: 47173}, 47186, {f: 8, c: 47188},
- {f: 2, c: 47198}, {f: 3, c: 47201}, {f: 7, c: 47205}, 47214, 47216,
- {f: 6, c: 47218}, {f: 3, c: 47225}, {f: 16, c: 47229}, {f: 26, c: 47246},
- {f: 7, c: 47273}, {f: 3, c: 47281}, {f: 3, c: 47285}, {f: 7, c: 47289},
- 47298, 47300, {f: 6, c: 47302}, {f: 3, c: 47309}, {f: 3, c: 47313},
- {f: 8, c: 47317}, 47326, 47328, {f: 6, c: 47330}, {f: 2, c: 47338},
- {f: 3, c: 47341}, {f: 7, c: 47345}, 47354, 47356, {f: 6, c: 47358},
- {f: 19, c: 47365}, {f: 7, c: 47385}, {f: 27, c: 47393}, {f: 2, c: 47422},
- {f: 3, c: 47425}, {f: 7, c: 47429}, {f: 2, c: 47437}, 47440,
- {f: 6, c: 47442}, {f: 2, c: 47450}, {f: 3, c: 47453}, {f: 7, c: 47457},
- 47466, 47468, {f: 6, c: 47470}, {f: 2, c: 47478}, {f: 3, c: 47481},
- {f: 7, c: 47485}, 47494, 47496, {f: 2, c: 47499}, {f: 29, c: 47503},
- {f: 2, c: 47534}, {f: 3, c: 47537}, {f: 7, c: 47541}, 47550, 47552,
- {f: 6, c: 47554}, {f: 2, c: 47562}, 47565, {f: 5, c: 47571}, 47578, 47580,
- {f: 2, c: 47583}, 47586, {f: 2, c: 47590}, {f: 3, c: 47593},
- {f: 7, c: 47597}, 47606, {f: 5, c: 47611}, {f: 6, c: 47618},
- {f: 12, c: 47625}, {f: 34, c: 47638}, {f: 2, c: 47674}, {f: 3, c: 47677},
- 47681, {f: 5, c: 47683}, 47690, 47692, {f: 4, c: 47695}, {f: 2, c: 47702},
- {f: 3, c: 47705}, {f: 7, c: 47709}, 47718, {f: 6, c: 47722},
- {f: 2, c: 47730}, {f: 3, c: 47733}, {f: 10, c: 47737}, 47750,
- {f: 4, c: 47752}, {f: 27, c: 47757}, 47786, {f: 3, c: 47789}, 47793,
- {f: 5, c: 47795}, 47802, 47804, {f: 6, c: 47806}, {f: 3, c: 47813},
- {f: 15, c: 47817}, {f: 34, c: 47834}, {f: 3, c: 47869}, {f: 3, c: 47873},
- {f: 8, c: 47877}, 47886, 47888, {f: 6, c: 47890}, {f: 3, c: 47897},
- {f: 3, c: 47901}, {f: 8, c: 47905}, 47914, {f: 8, c: 47916}, 47927,
- {f: 2, c: 47929}, {f: 5, c: 47935}, 47942, 47944, {f: 3, c: 47946}, 47950,
- {f: 3, c: 47953}, {f: 3, c: 47957}, {f: 8, c: 47961}, 47970,
- {f: 8, c: 47972}, {f: 27, c: 47981}, {f: 3, c: 48009}, {f: 3, c: 48013},
- {f: 19, c: 48017}, {f: 3, c: 48037}, {f: 3, c: 48041}, {f: 7, c: 48045},
- {f: 2, c: 48053}, {f: 8, c: 48056}, {f: 3, c: 48065}, {f: 3, c: 48069},
- {f: 7, c: 48073}, {f: 2, c: 48081}, {f: 36, c: 48084}, {f: 2, c: 48122},
- {f: 2, c: 48125}, 48129, {f: 5, c: 48131}, 48138, 48142, 48144,
- {f: 2, c: 48146}, {f: 2, c: 48153}, {f: 4, c: 48160}, 48166, 48168,
- {f: 3, c: 48170}, {f: 2, c: 48174}, {f: 2, c: 48178}, {f: 3, c: 48181},
- {f: 7, c: 48185}, 48194, {f: 3, c: 48198}, {f: 2, c: 48202},
- {f: 2, c: 48206}, {f: 12, c: 48209}, {f: 38, c: 48222}, {f: 2, c: 48262},
- {f: 2, c: 48265}, 48269, {f: 5, c: 48271}, 48278, 48280, {f: 5, c: 48283},
- {f: 2, c: 48290}, {f: 2, c: 48293}, {f: 7, c: 48297}, 48306,
- {f: 6, c: 48310}, {f: 2, c: 48318}, {f: 3, c: 48321}, {f: 8, c: 48325},
- 48334, {f: 3, c: 48338}, {f: 2, c: 48342}, {f: 3, c: 48345},
- {f: 23, c: 48349}, 48375, {f: 3, c: 48377}, {f: 7, c: 48381}, 48390, 48392,
- {f: 6, c: 48394}, {f: 3, c: 48401}, {f: 15, c: 48405}, {f: 7, c: 48421},
- {f: 19, c: 48429}, {f: 7, c: 48449}, {f: 2, c: 48458}, {f: 3, c: 48461},
- {f: 7, c: 48465}, {f: 10, c: 48474}, {f: 3, c: 48485}, {f: 23, c: 48489},
- {f: 2, c: 48514}, {f: 2, c: 48517}, {f: 5, c: 48523}, 48530, 48532,
- {f: 3, c: 48534}, 48539, {f: 7, c: 48541}, {f: 11, c: 48549},
- {f: 7, c: 48561}, {f: 27, c: 48569}, {f: 2, c: 48598}, {f: 3, c: 48601},
- {f: 12, c: 48605}, {f: 6, c: 48618}, {f: 3, c: 48625}, {f: 3, c: 48629},
- {f: 7, c: 48633}, {f: 2, c: 48641}, 48644, {f: 6, c: 48646},
- {f: 2, c: 48654}, {f: 3, c: 48657}, {f: 7, c: 48661}, 48670,
- {f: 36, c: 48672}, {f: 2, c: 48710}, {f: 3, c: 48713}, 48717,
- {f: 5, c: 48719}, 48726, 48728, {f: 4, c: 48732}, {f: 2, c: 48738},
- {f: 3, c: 48741}, 48745, {f: 5, c: 48747}, 48754, {f: 5, c: 48758},
- {f: 2, c: 48766}, {f: 3, c: 48769}, {f: 7, c: 48773}, 48782,
- {f: 6, c: 48786}, {f: 14, c: 48794}, {f: 39, c: 48809}, {f: 2, c: 48850},
- {f: 2, c: 48853}, {f: 7, c: 48857}, {f: 2, c: 48865}, {f: 6, c: 48870},
- {f: 20, c: 48877}, {f: 6, c: 48898}, {f: 14, c: 48906}, 48922,
- {f: 34, c: 48926}, {f: 2, c: 48962}, {f: 3, c: 48965}, {f: 7, c: 48969},
- {f: 3, c: 48978}, {f: 62, c: 48982}, {f: 27, c: 49045}, {f: 20, c: 49073},
- {f: 6, c: 49094}, {f: 2, c: 49102}, {f: 3, c: 49105}, {f: 7, c: 49109},
- {f: 2, c: 49117}, 49120, {f: 90, c: 49122}, {f: 20, c: 49213},
- {f: 6, c: 49234}, {f: 3, c: 49241}, {f: 3, c: 49245}, {f: 7, c: 49249},
- {f: 38, c: 49258}, {f: 2, c: 49298}, {f: 3, c: 49301}, {f: 7, c: 49305},
- 49314, 49316, {f: 6, c: 49318}, 49326, {f: 2, c: 49329}, {f: 5, c: 49335},
- 49342, {f: 3, c: 49346}, {f: 2, c: 49350}, {f: 2, c: 49354},
- {f: 3, c: 49357}, {f: 7, c: 49361}, 49370, {f: 6, c: 49374},
- {f: 2, c: 49382}, {f: 3, c: 49385}, {f: 7, c: 49389}, 49398, 49400,
- {f: 6, c: 49402}, {f: 3, c: 49409}, {f: 3, c: 49413}, {f: 7, c: 49417},
- {f: 4, c: 49425}, {f: 6, c: 49430}, {f: 2, c: 49441}, 49445,
- {f: 4, c: 49448}, 49454, {f: 4, c: 49458}, 49463, {f: 2, c: 49466},
- {f: 3, c: 49469}, {f: 7, c: 49473}, 49482, {f: 6, c: 49486},
- {f: 2, c: 49494}, {f: 3, c: 49497}, {f: 7, c: 49501}, 49510,
- {f: 6, c: 49514}, {f: 3, c: 49521}, {f: 3, c: 49525}, {f: 12, c: 49529},
- {f: 6, c: 49542}, 49551, {f: 3, c: 49553}, 49557, {f: 5, c: 49559}, 49566,
- 49568, {f: 3, c: 49570}, {f: 2, c: 49574}, {f: 2, c: 49578},
- {f: 3, c: 49581}, {f: 12, c: 49585}, {f: 6, c: 49598}, {f: 3, c: 49605},
- {f: 3, c: 49609}, {f: 7, c: 49613}, {f: 2, c: 49621}, {f: 7, c: 49625},
- {f: 3, c: 49633}, {f: 3, c: 49637}, {f: 7, c: 49641}, 49650,
- {f: 8, c: 49652}, {f: 2, c: 49662}, {f: 3, c: 49665}, {f: 7, c: 49669},
- 49678, 49680, {f: 6, c: 49682}, {f: 2, c: 49690}, {f: 2, c: 49693},
- {f: 7, c: 49697}, 49706, 49708, 49710, 49712, 49715, {f: 19, c: 49717},
- {f: 7, c: 49737}, {f: 2, c: 49746}, {f: 3, c: 49749}, {f: 7, c: 49753},
- {f: 4, c: 49761}, {f: 6, c: 49766}, {f: 2, c: 49774}, {f: 3, c: 49777},
- {f: 7, c: 49781}, 49790, 49792, {f: 6, c: 49794}, {f: 6, c: 49802},
- {f: 7, c: 49809}, {f: 2, c: 49817}, 49820, {f: 6, c: 49822},
- {f: 2, c: 49830}, {f: 3, c: 49833}, {f: 6, c: 49838}, 49846, 49848,
- {f: 34, c: 49850}, {f: 2, c: 49886}, {f: 2, c: 49889}, {f: 6, c: 49893},
- 49902, 49904, {f: 4, c: 49906}, 49911, 49914, {f: 3, c: 49917},
- {f: 7, c: 49921}, {f: 2, c: 49930}, {f: 5, c: 49934}, {f: 2, c: 49942},
- {f: 3, c: 49945}, {f: 7, c: 49949}, {f: 2, c: 49958}, {f: 27, c: 49962},
- {f: 34, c: 49990}, {f: 2, c: 50026}, {f: 3, c: 50029}, 50033,
- {f: 5, c: 50035}, {f: 2, c: 50042}, {f: 6, c: 50046}, {f: 3, c: 50053},
- {f: 3, c: 50057}, {f: 51, c: 50061}, {f: 23, c: 50113}, {f: 2, c: 50138},
- {f: 2, c: 50141}, 50145, {f: 5, c: 50147}, {f: 3, c: 50154},
- {f: 6, c: 50158}, {f: 2, c: 50166}, {f: 15, c: 50169}, {f: 7, c: 50185},
- {f: 19, c: 50193}, {f: 7, c: 50213}, {f: 3, c: 50221}, {f: 3, c: 50225},
- {f: 7, c: 50229}, {f: 10, c: 50238}, {f: 27, c: 50249}, {f: 2, c: 50278},
- {f: 3, c: 50281}, {f: 7, c: 50285}, {f: 3, c: 50294}, {f: 6, c: 50298},
- {f: 19, c: 50305}, {f: 7, c: 50325}, {f: 27, c: 50333}, {f: 3, c: 50361},
- {f: 44, c: 50365}, {f: 6, c: 50410}, {f: 2, c: 50418}, {f: 3, c: 50421},
- 50425, {f: 4, c: 50427}, {f: 10, c: 50434}, {f: 3, c: 50445},
- {f: 3, c: 50449}, {f: 7, c: 50453}, {f: 11, c: 50461}, {f: 2, c: 50474},
- {f: 3, c: 50477}, {f: 7, c: 50481}, 50490, 50492, {f: 6, c: 50494},
- {f: 2, c: 50502}, 50507, {f: 4, c: 50511}, 50518, {f: 3, c: 50522}, 50527,
- {f: 2, c: 50530}, {f: 3, c: 50533}, {f: 7, c: 50537}, 50546,
- {f: 6, c: 50550}, {f: 2, c: 50558}, {f: 3, c: 50561}, {f: 2, c: 50565},
- {f: 4, c: 50568}, 50574, 50576, {f: 3, c: 50578}, 50582, {f: 3, c: 50585},
- {f: 3, c: 50589}, {f: 8, c: 50593}, {f: 10, c: 50602}, {f: 2, c: 50614},
- 50618, {f: 5, c: 50623}, 50635, 50637, 50639, {f: 2, c: 50642},
- {f: 3, c: 50645}, {f: 7, c: 50649}, 50658, 50660, {f: 6, c: 50662}, 50671,
- {f: 3, c: 50673}, 50677, {f: 4, c: 50680}, {f: 3, c: 50690},
- {f: 3, c: 50697}, {f: 3, c: 50701}, {f: 7, c: 50705}, 50714,
- {f: 7, c: 50717}, {f: 2, c: 50726}, {f: 3, c: 50729}, 50735,
- {f: 2, c: 50737}, 50742, 50744, 50746, {f: 4, c: 50748}, {f: 2, c: 50754},
- {f: 3, c: 50757}, {f: 7, c: 50761}, 50770, {f: 6, c: 50774},
- {f: 2, c: 50782}, {f: 11, c: 50785}, {f: 2, c: 50797}, 50800,
- {f: 6, c: 50802}, {f: 2, c: 50810}, {f: 3, c: 50813}, {f: 7, c: 50817},
- 50826, 50828, {f: 6, c: 50830}, {f: 2, c: 50838}, {f: 3, c: 50841},
- {f: 7, c: 50845}, 50854, 50856, {f: 6, c: 50858}, {f: 2, c: 50866},
- {f: 3, c: 50869}, {f: 5, c: 50875}, 50882, 50884, {f: 6, c: 50886},
- {f: 2, c: 50894}, {f: 3, c: 50897}, {f: 7, c: 50901}, {f: 2, c: 50910},
- {f: 6, c: 50914}, {f: 2, c: 50922}, {f: 3, c: 50925}, {f: 7, c: 50929},
- {f: 3, c: 50938}, {f: 6, c: 50942}, {f: 2, c: 50950}, {f: 3, c: 50953},
- {f: 7, c: 50957}, 50966, 50968, {f: 6, c: 50970}, {f: 2, c: 50978},
- {f: 3, c: 50981}, {f: 7, c: 50985}, 50994, 50996, 50998, {f: 4, c: 51000},
- {f: 2, c: 51006}, {f: 3, c: 51009}, {f: 5, c: 51013}, 51019, 51022, 51024,
- {f: 3, c: 51033}, {f: 3, c: 51037}, {f: 7, c: 51041}, {f: 2, c: 51049},
- {f: 8, c: 51052}, {f: 2, c: 51062}, {f: 3, c: 51065}, {f: 4, c: 51071},
- 51078, {f: 3, c: 51083}, 51087, {f: 2, c: 51090}, 51093, 51097,
- {f: 5, c: 51099}, 51106, {f: 5, c: 51111}, {f: 2, c: 51118},
- {f: 3, c: 51121}, {f: 7, c: 51125}, 51134, {f: 6, c: 51138},
- {f: 2, c: 51146}, 51149, 51151, {f: 7, c: 51153}, {f: 4, c: 51161},
- {f: 6, c: 51166}, {f: 3, c: 51173}, {f: 3, c: 51177}, {f: 19, c: 51181},
- {f: 2, c: 51202}, {f: 3, c: 51205}, 51209, {f: 5, c: 51211}, 51218, 51220,
- {f: 5, c: 51223}, {f: 2, c: 51230}, {f: 3, c: 51233}, {f: 7, c: 51237},
- 51246, 51248, {f: 6, c: 51250}, {f: 3, c: 51257}, {f: 3, c: 51261},
- {f: 7, c: 51265}, {f: 2, c: 51274}, {f: 6, c: 51278}, {f: 27, c: 51285},
- {f: 2, c: 51314}, {f: 3, c: 51317}, 51321, {f: 5, c: 51323}, 51330, 51332,
- {f: 3, c: 51336}, {f: 6, c: 51342}, {f: 8, c: 51349}, 51358, 51360,
- {f: 6, c: 51362}, {f: 19, c: 51369}, {f: 6, c: 51390}, {f: 3, c: 51397},
- {f: 3, c: 51401}, {f: 7, c: 51405}, 51414, 51416, {f: 6, c: 51418},
- {f: 2, c: 51426}, {f: 16, c: 51429}, {f: 6, c: 51446}, {f: 2, c: 51454},
- {f: 3, c: 51457}, {f: 5, c: 51463}, 51470, 51472, {f: 6, c: 51474},
- {f: 19, c: 51481}, {f: 7, c: 51501}, {f: 27, c: 51509}, {f: 2, c: 51538},
- {f: 3, c: 51541}, {f: 7, c: 51545}, 51554, {f: 8, c: 51556},
- {f: 3, c: 51565}, {f: 3, c: 51569}, {f: 7, c: 51573}, {f: 11, c: 51581},
- {f: 2, c: 51594}, {f: 3, c: 51597}, {f: 7, c: 51601}, 51610, 51612,
- {f: 34, c: 51614}, {f: 2, c: 51650}, {f: 2, c: 51653}, 51657,
- {f: 5, c: 51659}, 51666, 51668, {f: 2, c: 51671}, 51675, {f: 2, c: 51678},
- 51681, 51683, {f: 2, c: 51685}, {f: 4, c: 51688}, 51694, {f: 6, c: 51698},
- {f: 2, c: 51706}, {f: 3, c: 51709}, {f: 7, c: 51713}, 51722,
- {f: 6, c: 51726}, {f: 3, c: 51733}, {f: 16, c: 51737}, {f: 34, c: 51754},
- {f: 2, c: 51790}, {f: 3, c: 51793}, {f: 7, c: 51797}, 51806,
- {f: 6, c: 51810}, {f: 20, c: 51817}, {f: 6, c: 51838}, {f: 19, c: 51845},
- {f: 35, c: 51865}, {f: 2, c: 51902}, {f: 3, c: 51905}, {f: 7, c: 51909},
- 51918, 51920, 51922, {f: 4, c: 51924}, {f: 6, c: 51930}, {f: 11, c: 51937},
- {f: 7, c: 51949}, {f: 19, c: 51957}, {f: 7, c: 51977}, {f: 3, c: 51985},
- {f: 3, c: 51989}, {f: 7, c: 51993}, {f: 31, c: 52002}, {f: 6, c: 52034},
- {f: 2, c: 52042}, {f: 3, c: 52045}, {f: 7, c: 52049}, {f: 3, c: 52058},
- {f: 6, c: 52062}, {f: 19, c: 52069}, {f: 34, c: 52090}, {f: 27, c: 52125},
- {f: 27, c: 52153}, {f: 15, c: 52181}, {f: 2, c: 52197}, 52200,
- {f: 34, c: 52202}, {f: 2, c: 52238}, {f: 3, c: 52241}, {f: 7, c: 52245},
- {f: 3, c: 52254}, {f: 4, c: 52259}, {f: 2, c: 52266}, 52269, 52271,
- {f: 7, c: 52273}, 52282, {f: 5, c: 52287}, {f: 2, c: 52294},
- {f: 3, c: 52297}, {f: 7, c: 52301}, 52310, {f: 6, c: 52314},
- {f: 3, c: 52321}, 52325, 52327, {f: 7, c: 52329}, {f: 4, c: 52337},
- {f: 34, c: 52342}, {f: 2, c: 52378}, {f: 3, c: 52381}, {f: 7, c: 52385},
- 52394, {f: 6, c: 52398}, {f: 2, c: 52406}, {f: 3, c: 52409},
- {f: 7, c: 52413}, 52422, 52424, {f: 6, c: 52426}, {f: 3, c: 52433},
- {f: 15, c: 52437}, {f: 7, c: 52453}, {f: 3, c: 52461}, {f: 16, c: 52465},
- {f: 6, c: 52482}, {f: 2, c: 52490}, {f: 3, c: 52493}, {f: 7, c: 52497},
- 52506, 52508, {f: 6, c: 52510}, {f: 3, c: 52517}, {f: 3, c: 52521},
- {f: 12, c: 52525}, {f: 34, c: 52538}, {f: 3, c: 52573}, {f: 3, c: 52577},
- {f: 7, c: 52581}, 52590, 52592, {f: 6, c: 52594}, {f: 15, c: 52601},
- {f: 11, c: 52617}, {f: 2, c: 52630}, {f: 3, c: 52633}, {f: 7, c: 52637},
- 52646, 52648, {f: 6, c: 52650}, {f: 19, c: 52657}, {f: 7, c: 52677},
- {f: 3, c: 52685}, {f: 23, c: 52689}, {f: 3, c: 52713}, {f: 3, c: 52717},
- {f: 7, c: 52721}, 52730, 52732, {f: 6, c: 52734}, {f: 3, c: 52741},
- {f: 3, c: 52745}, {f: 7, c: 52749}, {f: 4, c: 52757}, {f: 6, c: 52762},
- {f: 2, c: 52770}, {f: 3, c: 52773}, {f: 7, c: 52777}, 52786, 52788,
- {f: 34, c: 52790}, {f: 2, c: 52826}, {f: 2, c: 52829}, {f: 6, c: 52834},
- 52842, 52844, {f: 6, c: 52846}, {f: 2, c: 52854}, {f: 3, c: 52857},
- {f: 7, c: 52861}, 52870, 52872, {f: 6, c: 52874}, {f: 2, c: 52882},
- {f: 3, c: 52885}, {f: 7, c: 52889}, 52898, {f: 6, c: 52902},
- {f: 19, c: 52910}, {f: 34, c: 52930}, {f: 2, c: 52966}, {f: 2, c: 52969},
- {f: 7, c: 52973}, 52982, {f: 6, c: 52986}, {f: 2, c: 52994},
- {f: 3, c: 52997}, {f: 7, c: 53001}, 53010, 53012, {f: 6, c: 53014},
- {f: 3, c: 53021}, {f: 3, c: 53025}, {f: 7, c: 53029}, 53038,
- {f: 6, c: 53042}, {f: 27, c: 53049}, {f: 2, c: 53078}, {f: 3, c: 53081},
- {f: 7, c: 53085}, 53094, 53096, {f: 6, c: 53098}, {f: 2, c: 53106},
- {f: 3, c: 53109}, {f: 7, c: 53113}, {f: 4, c: 53121}, {f: 6, c: 53126},
- {f: 20, c: 53133}, {f: 6, c: 53154}, {f: 7, c: 53161}, {f: 19, c: 53169},
- {f: 27, c: 53189}, {f: 2, c: 53218}, {f: 3, c: 53221}, {f: 7, c: 53225},
- 53234, 53236, {f: 6, c: 53238}, {f: 3, c: 53245}, {f: 3, c: 53249},
- {f: 12, c: 53253}, {f: 6, c: 53266}, {f: 20, c: 53273}, {f: 6, c: 53294},
- {f: 2, c: 53302}, {f: 3, c: 53305}, {f: 7, c: 53309}, 53318, 53320,
- {f: 6, c: 53322}, {f: 3, c: 53329}, {f: 3, c: 53333}, {f: 7, c: 53337},
- {f: 11, c: 53345}, {f: 2, c: 53358}, {f: 3, c: 53361}, {f: 7, c: 53365},
- {f: 3, c: 53374}, {f: 34, c: 53378}, {f: 2, c: 53414}, {f: 3, c: 53417},
- {f: 7, c: 53421}, 53430, 53432, {f: 6, c: 53434}, {f: 2, c: 53442},
- {f: 3, c: 53445}, {f: 6, c: 53450}, 53458, {f: 6, c: 53462},
- {f: 2, c: 53470}, {f: 3, c: 53473}, {f: 7, c: 53477}, 53486,
- {f: 6, c: 53490}, {f: 20, c: 53497}, {f: 34, c: 53518}, {f: 2, c: 53554},
- {f: 3, c: 53557}, 53561, {f: 5, c: 53563}, 53570, {f: 6, c: 53574},
- {f: 2, c: 53582}, {f: 3, c: 53585}, {f: 7, c: 53589}, 53598, 53600,
- {f: 6, c: 53602}, {f: 3, c: 53609}, {f: 15, c: 53613}, {f: 7, c: 53629},
- {f: 3, c: 53637}, {f: 23, c: 53641}, {f: 2, c: 53666}, {f: 3, c: 53669},
- {f: 7, c: 53673}, 53682, 53684, {f: 4, c: 53686}, 53691, {f: 3, c: 53693},
- {f: 23, c: 53697}, {f: 27, c: 53721}, {f: 3, c: 53749}, {f: 14, c: 53753},
- 53768, {f: 6, c: 53770}, {f: 27, c: 53777}, {f: 2, c: 53806},
- {f: 3, c: 53809}, {f: 7, c: 53813}, 53822, 53824, {f: 6, c: 53826},
- {f: 19, c: 53833}, {f: 7, c: 53853}, {f: 27, c: 53861}, {f: 2, c: 53890},
- {f: 3, c: 53893}, {f: 7, c: 53897}, {f: 3, c: 53906}, {f: 6, c: 53910},
- {f: 3, c: 53917}, {f: 3, c: 53921}, {f: 7, c: 53925}, {f: 4, c: 53933},
- {f: 6, c: 53938}, {f: 2, c: 53946}, {f: 2, c: 53949}, 53953,
- {f: 5, c: 53955}, 53962, {f: 8, c: 53964}, {f: 3, c: 53973},
- {f: 3, c: 53977}, {f: 7, c: 53981}, {f: 10, c: 53990}, {f: 2, c: 54002},
- {f: 3, c: 54005}, {f: 7, c: 54009}, 54018, 54020, {f: 6, c: 54022}, 54031,
- {f: 3, c: 54033}, 54037, {f: 5, c: 54039}, 54046, {f: 3, c: 54050},
- {f: 2, c: 54054}, {f: 2, c: 54058}, {f: 3, c: 54061}, {f: 7, c: 54065},
- 54074, {f: 6, c: 54078}, {f: 54, c: 54086}, {f: 2, c: 54142},
- {f: 3, c: 54145}, {f: 7, c: 54149}, 54158, {f: 6, c: 54162},
- {f: 2, c: 54170}, {f: 3, c: 54173}, {f: 7, c: 54177}, 54186, 54188,
- {f: 6, c: 54190}, {f: 3, c: 54197}, {f: 3, c: 54201}, {f: 7, c: 54205},
- {f: 2, c: 54214}, {f: 6, c: 54218}, {f: 7, c: 54225}, {f: 8, c: 54233},
- 54242, {f: 8, c: 54244}, {f: 2, c: 54254}, {f: 3, c: 54257},
- {f: 7, c: 54261}, 54270, 54272, {f: 6, c: 54274}, {f: 20, c: 54281},
- {f: 34, c: 54302}, {f: 3, c: 54337}, {f: 23, c: 54341}, {f: 3, c: 54365},
- {f: 3, c: 54369}, {f: 8, c: 54373}, 54382, {f: 8, c: 54384},
- {f: 2, c: 54394}, {f: 2, c: 54397}, 54401, {f: 5, c: 54403}, 54410, 54412,
- {f: 6, c: 54414}, {f: 20, c: 54421}, {f: 34, c: 54442}, {f: 3, c: 54477},
- {f: 3, c: 54481}, {f: 7, c: 54485}, {f: 2, c: 54493}, {f: 8, c: 54496},
- {f: 3, c: 54505}, {f: 3, c: 54509}, {f: 7, c: 54513}, {f: 2, c: 54521},
- 54524, {f: 6, c: 54526}, {f: 3, c: 54533}, {f: 3, c: 54537},
- {f: 7, c: 54541}, 54550, {f: 36, c: 54552}, {f: 2, c: 54590},
- {f: 3, c: 54593}, {f: 7, c: 54597}, 54606, 54608, {f: 6, c: 54610},
- {f: 2, c: 54618}, {f: 3, c: 54621}, {f: 4, c: 54625}, {f: 2, c: 54630},
- 54634, 54636, {f: 6, c: 54638}, {f: 2, c: 54646}, {f: 3, c: 54649},
- {f: 7, c: 54653}, 54662, {f: 6, c: 54666}, {f: 20, c: 54673},
- {f: 34, c: 54694}, {f: 2, c: 54730}, {f: 3, c: 54733}, 54737,
- {f: 5, c: 54739}, 54746, 54748, {f: 6, c: 54750}, {f: 2, c: 54758},
- {f: 3, c: 54761}, {f: 7, c: 54765}, 54774, 54776, {f: 6, c: 54778},
- {f: 2, c: 54786}, {f: 3, c: 54789}, {f: 7, c: 54793}, 54802,
- {f: 6, c: 54806}, {f: 3, c: 54813}, {f: 3, c: 54817}, {f: 8, c: 54821},
- {f: 10, c: 54830}, {f: 2, c: 54842}, {f: 3, c: 54845}, {f: 4, c: 54849},
- {f: 2, c: 54854}, 54858, 54860, {f: 3, c: 54862}, {f: 2, c: 54866},
- {f: 2, c: 54870}, {f: 3, c: 54873}, {f: 10, c: 54877}, 54888,
- {f: 6, c: 54890}, {f: 2, c: 54898}, {f: 14, c: 54901}, 54916,
- {f: 6, c: 54918}, {f: 2, c: 54926}, {f: 3, c: 54929}, {f: 8, c: 54933},
- 54942, 54944, {f: 6, c: 54946}, {f: 3, c: 54953}, {f: 3, c: 54957},
- {f: 8, c: 54961}, 54970, {f: 8, c: 54972}, {f: 2, c: 54982},
- {f: 3, c: 54985}, {f: 4, c: 54989}, {f: 2, c: 54994}, {f: 2, c: 54997},
- 55000, {f: 6, c: 55002}, {f: 3, c: 55009}, {f: 3, c: 55013},
- {f: 7, c: 55017}, {f: 4, c: 55025}, {f: 6, c: 55030}, {f: 2, c: 55038},
- {f: 3, c: 55041}, {f: 12, c: 55045}, {f: 6, c: 55058}, {f: 2, c: 55066},
- {f: 3, c: 55069}, {f: 7, c: 55073}, 55082, 55084, {f: 6, c: 55086},
- {f: 2, c: 55094}, {f: 3, c: 55097}, {f: 7, c: 55101}, {f: 2, c: 55109},
- 55112, {f: 6, c: 55114}, {f: 2, c: 55122}, 55125, {f: 6, c: 55130}, 55138,
- 55140, {f: 3, c: 55142}, {f: 2, c: 55146}, {f: 3, c: 55149},
- {f: 3, c: 55153}, {f: 7, c: 55157}, {f: 3, c: 55166}, {f: 6, c: 55170},
- {f: 2, c: 55178}, {f: 3, c: 55181}, {f: 7, c: 55185}, 55194, 55196,
- {f: 6, c: 55198}],
- 'Adobe-CNS1': [{f: 95, c: 32}, {s: 3}, 12288, 65292, {f: 2, c: 12289}, 65294,
- 8226, 65307, 65306, 65311, 65281, 65072, 8230, 8229, 65104, 65380, 65106,
- 183, {f: 4, c: 65108}, 65372, 8211, 65073, 8212, {s: 4}, {f: 2, c: 65288},
- {f: 2, c: 65077}, 65371, 65373, {f: 2, c: 65079}, {f: 2, c: 12308},
- {f: 2, c: 65081}, {f: 2, c: 12304}, {f: 2, c: 65083}, {f: 2, c: 12298},
- {f: 2, c: 65085}, {f: 2, c: 12296}, {f: 2, c: 65087}, {f: 2, c: 12300},
- {f: 2, c: 65089}, {f: 2, c: 12302}, {f: 2, c: 65091}, {f: 6, c: 65113},
- {f: 2, c: 8216}, {f: 2, c: 8220}, {f: 2, c: 12317}, 8245, 8242, 65283,
- 65286, 65290, 8251, 167, 12291, 9675, 9679, 9651, 9650, 9678, 9734, 9733,
- 9671, 9670, 9633, 9632, 9661, 9660, 12963, 8453, 8254, 0, 65343, 0,
- {f: 2, c: 65097}, {f: 2, c: 65101}, {f: 2, c: 65099}, {f: 3, c: 65119},
- 65291, 65293, 215, 247, 177, 8730, 65308, 65310, 65309, {f: 2, c: 8806},
- 8800, 8734, 8786, 8801, {f: 5, c: 65122}, 8764, {f: 2, c: 8745}, 8869,
- 8736, 8735, 8895, 13266, 13265, 8747, 8750, 8757, 8756, 9792, 9794, 9793,
- 9737, 8593, 8595, 8594, 8592, {f: 2, c: 8598}, 8601, 8600, 8741, 8739, 0,
- 0, 65295, 65340, 65284, 165, 12306, {f: 2, c: 162}, 65285, 65312, 8451,
- 8457, {f: 3, c: 65129}, 13269, {f: 3, c: 13212}, 13262, 13217,
- {f: 2, c: 13198}, 13252, 176, [20825, 58834], [20827, 58835],
- [20830, 58837], [20829, 58836], 20833, 20835, 21991, [29929, 58044],
- [31950, 58191], {f: 8, c: 9601}, 9615, 9614, 9613, 9612, 9611, 9610, 9609,
- 9532, 9524, 9516, 9508, 9500, 9620, 9472, 9474, 9621, 9484, 9488, 9492,
- 9496, {f: 2, c: 9581}, 9584, 9583, 9552, 9566, 9578, 9569, {f: 2, c: 9698},
- 9701, 9700, {f: 3, c: 9585}, {f: 10, c: 65296}, {f: 10, c: 8544},
- {f: 9, c: 12321}, 0, [21316, 57443], 0, {f: 26, c: 65313},
- {f: 26, c: 65345}, {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945},
- {f: 7, c: 963}, {f: 37, c: 12549}, 729, 714, 711, 715, [9312, 63153],
- [9313, 63154], [9314, 63155], [9315, 63156], [9316, 63157], [9317, 63158],
- [9318, 63159], [9319, 63160], [9320, 63161], [9321, 63162], [9332, 63163],
- [9333, 63164], [9334, 63165], [9335, 63166], [9336, 63167], [9337, 63168],
- [9338, 63169], [9339, 63170], [9340, 63171], [9341, 63172], [8560, 63173],
- [8561, 63174], [8562, 63175], [8563, 63176], [8564, 63177], [8565, 63178],
- [8566, 63179], [8567, 63180], [8568, 63181], [8569, 63182], [12033, 20008],
- [12034, 20022, 63183], [12035, 20031, 63184], [12037, 20101, 63185],
- [12039, 20128, 63186], [12044, 20866, 63187], [12045, 20886, 63188],
- [12046, 20907, 63189], [12051, 21241, 63190], [12054, 21304, 63191],
- [12057, 21353, 63192], [12059, 21430, 63193],
- [12065, 12066, 22786, 22794, 63194], [12071, 23424, 63195],
- [12078, 24027, 63196], [12083, 24186, 63197], [12084, 24191, 63198],
- [12085, 24308], [12089, 24400, 63200], [12090, 24417, 63201],
- [12097, 25908, 63202], [12102, 26080], [12135, 30098, 63204],
- [12136, 30326], [12193, 36789, 63206], [12202, 38582], {f: 32, c: 9216},
- 9249, [12032, 19968], [12036, 20057], 19969, 19971, 20035, 20061, 20102,
- [12038, 20108], [12040, 20154], [12041, 20799], [12042, 20837],
- [12043, 20843], [12047, 20960], [12049, 20992], 20993, [12050, 21147],
- [12052, 21269], [12055, 21313], [12056, 21340], [12060, 21448], 19977,
- 19979, 19976, 19978, 20011, 20024, 20961, 20037, 20040, 20063, 20062,
- 20110, 20129, [20800, 64012], 20995, 21242, 21315, 21449, [12061, 21475],
- [12063, 22303], [12064, 22763], [12067, 22805], [12068, 22823],
- [12069, 22899], [12070, 23376], 23377, 23379, [12072, 23544],
- [12073, 23567], [12074, 23586], [12075, 23608], [12077, 23665], 24029,
- [12079, 24037], [12080, 24049], {f: 2, c: 24050}, [12081, 24062],
- [12082, 24178], [12086, 24318], [12087, 24331], [12088, 24339], 25165,
- 19985, 19984, 19981, 20013, 20016, 20025, 20043, 23609, 20104, 20113,
- 20117, 20114, 20116, 20130, 20161, 20160, 20163, {f: 2, c: 20166}, 20173,
- {f: 2, c: 20170}, 20164, 20803, 20801, 20839, {f: 2, c: 20845}, 20844,
- 20887, 20982, {f: 3, c: 20998}, 21243, {f: 2, c: 21246}, 21270, 21305,
- 21320, 21319, 21317, 21342, 21380, 21451, 21450, 21453, 22764, 22825,
- 22827, 22826, 22829, 23380, 23569, 23588, 23610, 23663, 24052, 24187,
- 24319, {f: 2, c: 24340}, [12092, 24515], [12093, 25096], [12094, 25142],
- [12095, 25163], 25166, [12096, 25903], [12098, 25991], [12099, 26007],
- [12100, 26020], [12101, 26041], [12103, 26085], [12104, 26352],
- [12105, 26376], [12106, 26408], [12107, 27424], [12108, 27490],
- [12109, 27513], [12111, 27595], [12112, 27604], [12113, 27611],
- [12114, 27663], [12116, 27700], [12117, 28779], [12118, 29226],
- [12119, 29238], [12120, 29243], [12122, 29255], [12123, 29273],
- [12124, 29275], [12125, 29356], 29579, 19993, 19990, 19989, 19988, 19992,
- 20027, 20045, 20047, 20046, 20197, 20184, {f: 4, c: 20180},
- {f: 2, c: 20195}, 20185, 20190, 20805, 20804, {f: 2, c: 20873}, 20908,
- {f: 2, c: 20985}, 20984, 21002, 21152, 21151, [21253, 57435], 21254, 21271,
- 21277, 20191, 21322, 21321, 21345, 21344, 21359, 21358, 21435, 21487,
- 21476, 21491, 21484, 21486, 21481, 21480, 21500, 21496, 21493, 21483,
- 21478, 21482, 21490, 21489, 21488, 21477, 21485, 21499, 22235, 22234,
- 22806, 22830, 22833, 22900, 22902, 23381, 23427, 23612, 24040, 24039,
- 24038, {f: 2, c: 24066}, 24179, 24188, 24321, 24344, 24343, 24517, 25098,
- {f: 2, c: 25171}, 25170, 25169, 26021, 26086, 26414, 26412,
- {f: 2, c: 26410}, 26413, 27491, 27597, 27665, 27664, 27704, 27713, 27712,
- 27710, 29359, [12126, 29572], [12127, 29577], [12128, 29916],
- [12129, 29926], [12130, 29976], [12131, 29983], [12132, 29992], 29993,
- [12133, 30000], {f: 3, c: 30001}, [12134, 30091], [12137, 30333],
- [12138, 30382], [12139, 30399], [12140, 30446], [12141, 30683],
- [12142, 30690], [12143, 30707], [12144, 31034], [12146, 31166],
- [12147, 31348], [12148, 31435], {f: 2, c: 19998}, {f: 2, c: 20050}, 20073,
- 20121, 20132, 20134, 20133, 20223, 20233, 20249, 20234, 20245, 20237,
- {f: 2, c: 20240}, 20239, 20210, 20214, 20219, 20208, 20211, 20221, 20225,
- 20235, 20809, 20807, 20806, 20808, 20840, 20849, 20877, 20912, 21015,
- {f: 2, c: 21009}, 21006, 21014, 21155, 21256, 21281, 21280,
- {f: 2, c: 21360}, 21513, 21519, 21516, 21514, 21520, 21505, 21515, 21508,
- 21521, 21517, 21512, 21507, 21518, 21510, 21522, 22240, 22238, 22237,
- 22323, 22320, 22312, 22317, 22316, 22319, 22313, {f: 2, c: 22809},
- {f: 2, c: 22839}, 22916, 22904, 22915, 22909, 22905, 22914, 22913,
- {f: 2, c: 23383}, {f: 2, c: 23431}, 23429, 23433, 23546, 23574, 23673,
- 24030, 24070, 24182, 24180, 24335, 24347, 24537, 24534, 25102,
- {f: 2, c: 25100}, 25104, 25187, 25179, 25176, 25910, 26089, 26088,
- {f: 2, c: 26092}, {f: 2, c: 26354}, 26377, 26429, 26420, 26417, 26421,
- 27425, 27492, 27515, 27670, 27741, 27735, 27737, {f: 2, c: 27743}, 27728,
- 27733, 27745, 27739, {f: 2, c: 27725}, 28784, 29279, 29277, 30334,
- [12149, 31481], [12150, 31859], [12151, 31992], [12152, 32566],
- [12154, 32650], [12155, 32701], [12156, 32769], 32771, [12157, 32780],
- [12158, 32786], [12159, 32819], [12160, 32895], [12161, 32905],
- {f: 2, c: 32907}, [12162, 33251], [12163, 33258], [12164, 33267],
- [12165, 33276], [12166, 33292], [12167, 33307], [12168, 33311],
- [12169, 33390], [12170, 33394], 33406, [12173, 34411], [12174, 34880],
- [12175, 34892], [12176, 34915], 35199, 38433, 20018, 20136, 20301, 20303,
- 20295, 20311, 20318, 20276, 20315, 20309, 20272, {f: 2, c: 20304}, 20285,
- 20282, 20280, 20291, 20308, 20284, 20294, 20323, 20316, 20320, 20271,
- 20302, 20278, 20313, 20317, 20296, 20314, 20812, 20811, 20813, 20853,
- {f: 2, c: 20918}, 21029, 21028, {f: 2, c: 21033}, 21032, 21163,
- {f: 2, c: 21161}, 21164, 21283, 21363, 21365, 21533, 21549, 21534, 21566,
- 21542, 21582, 21543, 21574, 21571, 21555, 21576, 21570, 21531, 21545,
- 21578, 21561, 21563, 21560, 21550, {f: 2, c: 21557}, 21536, 21564, 21568,
- 21553, 21547, 21535, 21548, 22250, 22256, 22244, 22251, 22346, 22353,
- 22336, 22349, 22343, 22350, 22334, 22352, 22351, 22331, 22767, 22846,
- 22941, 22930, 22952, 22942, 22947, 22937, 22934, 22925, 22948, 22931,
- 22922, 22949, 23389, 23388, {f: 2, c: 23386}, 23436, 23435, 23439, 23596,
- {f: 2, c: 23616}, 23615, 23614, {f: 2, c: 23696}, 23700, 23692, 24043,
- 24076, 24207, 24199, 24202, 24311, 24324, 24351, 24420, 24418, 24439,
- 24441, 24536, 24524, 24535, 24525, 24561, 24555, 24568, 24554, 25106,
- 25105, 25220, 25239, 25238, 25216, 25206, 25225, 25197, 25226, 25212,
- 25214, 25209, 25203, 25234, 25199, 25240, 25198, 25237, 25235, 25233,
- 25222, 25913, 25915, 25912, 26097, 26356, 26463, {f: 4, c: 26446}, 26460,
- 26454, [26462, 57801], 26441, 26438, 26464, 26451, 26455, 27493, 27599,
- 27714, 27742, 27801, 27777, {f: 2, c: 27784}, 27781, 27803, 27754, 27770,
- 27792, 27760, 27788, 27752, 27798, 27794, 27773, 27779, 27762, 27774,
- 27764, 27782, 27766, 27789, 27796, 27800, 27778, 28790, {f: 2, c: 28796},
- 28792, 29282, 29281, 29280, 29380, 29378, 29590, 29996, 29995,
- {f: 2, c: 30007}, 30338, 30447, 30691, 31169, 31168, 31167, 31350, 31995,
- 32597, 32918, 32915, 32925, 32920, 32923, 32922, 32946, 33391, 33426,
- 33419, 33421, [12178, 35211], [12179, 35282], [12180, 35328],
- [12181, 35895], [12182, 35910], [12183, 35925], [12185, 35997],
- [12186, 36196], [12187, 36208], [12188, 36275], [12189, 36523],
- [12190, 36554], [12191, 36763], [12192, 36784], 36802, 36806, 36805, 36804,
- 24033, [12194, 37009], 37026, 37034, 37030, 37027, [12195, 37193],
- [12196, 37318], [12197, 37324], 38450, 38446, 38449, 38442, 38444, 20006,
- 20054, 20083, 20107, 20123, 20126, {f: 2, c: 20139}, 20335, 20381, 20365,
- 20339, 20351, 20332, 20379, 20363, 20358, 20355, 20336, 20341, 20360,
- 20329, 20347, 20374, 20350, 20367, 20369, 20346, 20820, 20818, 20821,
- 20841, 20855, 20854, 20856, 20925, 20989, 21051, 21048, 21047, 21050,
- 21040, 21038, 21046, 21057, 21182, 21179, 21330, 21332, 21331, 21329,
- 21350, {f: 3, c: 21367}, 21462, 21460, 21463, 21619, 21621, 21654, 21624,
- 21653, 21632, 21627, 21623, 21636, 21650, 21638, 21628, 21648, 21617,
- 21622, 21644, 21658, 21602, 21608, 21643, 21629, 21646, 22266, 22403,
- 22391, 22378, 22377, 22369, 22374, 22372, 22396, 22812, 22857,
- {f: 2, c: 22855}, 22852, 22868, 22974, 22971, 22996, 22969, 22958, 22993,
- 22982, 22992, 22989, 22987, 22995, 22986, 22959, 22963, 22994, 22981,
- 23391, 23396, 23395, 23447, 23450, 23448, 23452, 23449, 23451, 23578,
- 23624, {f: 2, c: 23621}, 23735, 23713, 23736, 23721, 23723, 23729, 23731,
- 24088, 24090, 24086, 24085, 24091, 24081, 24184, 24218, 24215, 24220,
- {f: 2, c: 24213}, 24310, {f: 2, c: 24358}, 24361, {f: 2, c: 24448}, 24447,
- 24444, 24541, 24544, 24573, 24565, 24575, 24591, 24596, 24623, 24629,
- 24598, 24618, 24597, 24609, 24615, 24617, 24619, 24603, 25110, 25109,
- 25151, 25150, 25152, 25215, 25289, 25292, 25284, 25279, 25282, 25273,
- 25298, 25307, 25259, {f: 2, c: 25299}, 25291, 25288, 25256, 25277, 25276,
- [25296, 60582], 25305, 25287, 25293, 25269, 25306, 25265, 25304,
- {f: 2, c: 25302}, 25286, 25260, [25294, 61010], 25918, 26023, 26044, 26106,
- 26132, 26131, 26124, 26118, 26114, 26126, 26112, 26127, 26133, 26122,
- 26119, 26381, 26379, 26477, 26507, 26517, 26481, 26524, 26483, 26487,
- 26503, 26525, 26519, {f: 2, c: 26479}, 26495, 26505, 26494, 26512, 26485,
- 26522, 26515, 26492, 26474, 26482, 27427, {f: 2, c: 27494}, 27519, 27667,
- 27675, 27875, 27880, 27891, 27825, 27852, 27877, 27827, {f: 2, c: 27837},
- 27836, 27874, 27819, 27861, 27859, 27832, 27844, 27833, 27841, 27822,
- 27863, 27845, 27889, 27839, 27835, 27873, 27867, 27850, 27820, 27887,
- 27868, 27862, 27872, 28821, 28814, 28818, 28810, 28825, {f: 2, c: 29228},
- 29240, 29256, 29287, 29289, 29376, 29390, 29401, 29399, 29392, 29609,
- 29608, 29599, 29611, 29605, 30013, 30109, {f: 2, c: 30105}, 30340, 30402,
- 30450, 30452, 30693, 30717, 31038, {f: 2, c: 31040}, 31177, 31176, 31354,
- 31353, 31482, 31998, 32596, 32652, 32651, [32773, 58236], 32954, 32933,
- 32930, 32945, 32929, 32939, 32937, 32948, 32938, 32943, 33253, 33278,
- 33293, 33459, 33437, 33433, 33453, 33469, 33439, 33465, 33457, 33452,
- 33445, 33455, 33464, 33443, 33456, 33470, 33463, 34382, 34417, 21021,
- 34920, 36555, 36814, 36820, 36817, 37045, 37048, 37041, 37046, 37319,
- [12198, 37329], [12199, 38263], [12200, 38272], [12201, 38428], 38464,
- 38463, 38459, 38468, 38466, [12203, 38585], [12204, 38632], 38738,
- [12206, 38750], 20127, {f: 2, c: 20141}, 20449, 20405, 20399, 20415, 20448,
- 20433, 20431, 20445, 20419, 20406, 20440, 20447, 20426, 20439, 20398,
- 20432, 20420, 20418, 20442, 20430, 20446, 20407, 20823, 20882, 20881,
- 20896, 21070, 21059, 21066, 21069, 21068, 21067, 21063, 21191, 21193,
- 21187, 21185, 21261, 21335, 21371, 21402, 21467, 21676, 21696, 21672,
- 21710, 21705, 21688, 21670, 21683, 21703, 21698, 21693, 21674, 21697,
- 21700, 21704, 21679, 21675, 21681, 21691, 21673, 21671, 21695, 22271,
- 22402, 22411, 22432, 22435, 22434, 22478, 22446, 22419, 22869, 22865,
- 22863, 22862, 22864, 23004, 23000, 23039, 23011, 23016, 23043, 23013,
- 23018, 23002, 23014, 23041, 23035, 23401, 23459, 23462, 23460, 23458,
- 23461, 23553, {f: 2, c: 23630}, 23629, 23627, 23769, 23762, 24055, 24093,
- 24101, 24095, 24189, 24224, 24230, 24314, 24328, 24365, 24421, 24456,
- 24453, {f: 2, c: 24458}, 24455, 24460, 24457, 24594, 24605, 24608, 24613,
- 24590, 24616, 24653, 24688, 24680, [24674, 60712], 24646, 24643, 24684,
- 24683, 24682, 24676, 25153, 25308, 25366, 25353, 25340, 25325, 25345,
- 25326, 25341, 25351, 25329, 25335, 25327, 25324, 25342, 25332, 25361,
- 25346, 25919, 25925, 26027, 26045, 26082, 26149, 26157, 26144, 26151,
- 26159, 26143, 26152, 26161, 26148, 26359, 26623, 26579, 26609, 26580,
- 26576, 26604, 26550, 26543, 26613, 26601, 26607, 26564, 26577, 26548,
- 26586, 26597, 26552, 26575, 26590, 26611, 26544, 26585, 26594, 26589,
- 26578, 27498, 27523, 27526, 27573, 27602, 27607, 27679, 27849, 27915,
- 27954, 27946, 27969, 27941, 27916, 27953, 27934, 27927, 27963,
- {f: 2, c: 27965}, 27958, 27931, 27893, 27961, 27943, 27960, 27945, 27950,
- 27957, 27918, 27947, 28843, 28858, 28851, 28844, 28847, 28845, 28856,
- 28846, 28836, 29232, 29298, 29295, 29300, 29417, {f: 2, c: 29408}, 29623,
- 29642, 29627, 29618, 29645, 29632, 29619, 29978, 29997, 30031, 30028,
- 30030, 30027, 30123, {f: 2, c: 30116}, {f: 2, c: 30114}, 30328,
- {f: 3, c: 30342}, 30408, 30406, 30403, 30405, 30465, 30457, 30456, 30473,
- 30475, 30462, 30460, 30471, 30684, 30722, 30740, {f: 2, c: 30732}, 31046,
- 31049, 31048, 31047, {f: 2, c: 31161}, {f: 2, c: 31185}, 31179, 31359,
- 31361, 31487, 31485, 31869, 32002, 32005, 32000, 32009, 32007, 32004,
- 32006, 32568, 32654, 32703, 32784, 32781, 32785, 32822, 32982, 32997,
- 32986, {f: 2, c: 32963}, 32972, 32993, 32987, 32974, 32990, 32996, 32989,
- 33268, 33314, 33511, 33539, 33541, 33507, 33499, 33510, 33540, 33509,
- 33538, 33545, 33490, 33495, 33521, 33537, 33500, 33492, 33489, 33502,
- 33491, 33503, 33519, 33542, 34384, 34425, 34427, 34426, 34893, 34923,
- 35201, 35284, 35336, {f: 2, c: 35330}, 35998, 36000, 36212, 36211, 36276,
- 36557, 36556, 36848, 36838, 36834, 36842, 36837, 36845, 36843, 36836,
- 36840, 37066, 37070, 37057, 37059, 37195, 37194, 37325, 38274, 38480,
- {f: 3, c: 38475}, [12207, 38754], [12208, 38761], [12209, 38859],
- [12210, 38893], [12211, 38899], [12212, 38913], [12213, 39080],
- [12214, 39131], [12215, 39135], [12216, 39318], [12217, 39321], 20056,
- 20147, {f: 2, c: 20492}, 20515, 20463, 20518, 20517, 20472, [20521, 57375],
- 20502, 20486, 20540, 20511, 20506, 20498, 20497, 20474, 20480, 20500,
- 20520, 20465, 20513, 20491, 20505, 20504, 20467, 20462, 20525, 20522,
- 20478, 20523, 20489, 20860, {f: 2, c: 20900}, 20898, 20941, 20940, 20934,
- 20939, 21078, 21084, 21076, 21083, 21085, 21290, [21375, 57459], 21407,
- 21405, 21471, 21736, 21776, 21761, 21815, 21756, 21733, 21746, 21766,
- 21754, 21780, 21737, 21741, 21729, 21769, 21742, 21738, 21734, 21799,
- 21767, 21757, 21775, {f: 2, c: 22275}, 22466, 22484, 22475, 22467, 22537,
- 22799, {f: 2, c: 22871}, 22874, 23057, 23064, 23068, 23071, 23067, 23059,
- 23020, 23072, 23075, 23081, 23077, 23052, 23049, 23403, 23640, 23472,
- 23475, 23478, 23476, 23470, 23477, 23481, 23480, 23556, 23633, 23637,
- 23632, 23789, 23805, 23803, 23786, 23784, 23792, 23798, 23809, 23796,
- 24046, 24109, 24107, 24235, 24237, 24231, 24369, 24466, 24465, 24464,
- 24665, 24675, 24677, 24656, 24661, 24685, 24681, 24687, 24708, 24735,
- 24730, 24717, 24724, 24716, 24709, 24726, 25159, 25331, 25352, 25343,
- 25422, 25406, 25391, 25429, 25410, 25414, 25423, 25417, 25402, 25424,
- 25405, {f: 2, c: 25386}, 25384, 25421, 25420, {f: 2, c: 25928}, 26009,
- 26049, 26053, 26178, 26185, 26191, 26179, 26194, 26188, 26181, 26177,
- 26360, {f: 2, c: 26388}, 26391, 26657, 26680, 26696, 26694, 26707, 26681,
- 26690, 26708, 26665, 26803, 26647, 26700, 26705, 26685, 26612, 26704,
- 26688, 26684, 26691, 26666, 26693, 26643, 26648, 26689, 27530, 27529,
- 27575, 27683, {f: 2, c: 27687}, 27686, 27684, 27888, 28010, 28053, 28040,
- 28039, 28006, 28024, 28023, 27993, 28051, 28012, 28041, 28014, 27994,
- 28020, 28009, 28044, 28042, 28025, 28037, 28005, 28052, 28874, 28888,
- 28900, 28889, 28872, 28879, 29241, 29305, 29436, 29433, 29437, 29432,
- 29431, 29574, 29677, 29705, 29678, 29664, 29674, 29662, 30036, 30045,
- 30044, 30042, 30041, 30142, 30149, 30151, {f: 2, c: 30130}, 30141, 30140,
- 30137, 30146, 30136, 30347, 30384, 30410, {f: 2, c: 30413}, 30505,
- {f: 2, c: 30495}, 30504, 30697, 30768, 30759, 30776, 30749, 30772, 30775,
- 30757, 30765, 30752, 30751, 30770, 31061, 31056, 31072, 31071, 31062,
- 31070, 31069, 31063, 31066, 31204, [31203, 60418], 31207, 31199, 31206,
- 31209, 31192, 31364, 31368, 31449, 31494, 31505, 31881, 32033, 32023,
- 32011, 32010, 32032, 32034, 32020, 32016, 32021, 32026, 32028, 32013,
- 32025, 32027, 32570, 32607, 32660, 32709, 32705, 32774, 32772, 32792,
- 32789, 32793, 32791, 32829, 32831, 33009, 33026, 33008, 33029, 33005,
- 33012, 33030, 33016, 33011, 33032, 33021, 33034, 33020, 33007, 33261,
- 33260, 33280, 33296, {f: 2, c: 33322}, 33320, 33324, 33467, 33579, 33618,
- 33620, 33610, 33592, 33616, 33609, 33589, 33588, 33615, 33586, 33593,
- 33590, 33559, 33600, 33585, 33576, 33603, 34388, 34442, 34474, 34451,
- 34468, 34473, 34444, 34467, 34460, 34928, 34935, {f: 2, c: 34945}, 34941,
- 34937, 35352, 35344, 35342, 35340, 35349, 35338, 35351, 35347, 35350,
- 35343, 35345, 35912, 35962, 35961, {f: 2, c: 36001}, [36215, 58442], 36524,
- 36562, 36564, 36559, 36785, 36865, 36870, 36855, 36864, 36858, 36852,
- 36867, 36861, 36869, 36856, 37013, 37089, 37085, 37090, 37202, 37197,
- 37196, 37336, 37341, 37335, 37340, 37337, 38275, {f: 2, c: 38498}, 38497,
- 38491, 38493, 38500, 38488, 38494, 38587, 39138, [12218, 39340],
- [12219, 39592], [12220, 39640], [12222, 39717], [12224, 39730],
- [12225, 39740], 20094, 20602, [20605, 57382], 20572, 20551, 20547, 20556,
- 20570, 20553, 20581, 20598, 20558, 20565, 20597, 20596, 20599, 20559,
- 20495, 20591, 20589, 20828, 20885, 20976, 21098, 21103, 21202, 21209,
- 21208, 21205, 21264, 21263, 21273, {f: 2, c: 21311}, 21310, 21443, 26364,
- 21830, 21866, 21862, 21828, 21854, 21857, 21827, 21834, 21809, 21846,
- 21839, 21845, 21807, 21860, 21816, 21806, 21852, 21804, 21859, 21811,
- 21825, 21847, 22280, 22283, 22281, 22495, 22533, 22538, 22534, 22496,
- 22500, 22522, 22530, 22581, 22519, 22521, 22816, 22882, 23094, 23105,
- 23113, 23142, 23146, 23104, 23100, 23138, 23130, 23110, 23114, 23408,
- 23495, 23493, 23492, 23490, 23487, 23494, 23561, 23560, 23559, 23648,
- {f: 2, c: 23644}, 23815, 23814, 23822, 23835, 23830, 23842, 23825, 23849,
- 23828, 23833, 23844, 23847, 23831, 24034, 24120, 24118, 24115, 24119,
- {f: 2, c: 24247}, 24246, 24245, 24254, 24373, 24375, 24407, 24428, 24425,
- 24427, 24471, 24473, 24478, 24472, 24481, 24480, 24476, 24703, 24739,
- 24713, 24736, 24744, 24779, 24756, 24806, 24765, 24773, 24763, 24757,
- 24796, 24764, 24792, 24789, 24774, 24799, 24760, 24794, 24775,
- {f: 2, c: 25114}, 25160, 25504, 25511, 25458, 25494, 25506, 25509, 25463,
- 25447, 25496, 25514, 25457, 25513, 25481, 25475, 25499, 25451, 25512,
- 25476, 25480, 25497, 25505, 25516, 25490, 25487, 25472, 25467, 25449,
- 25448, 25466, 25949, 25942, 25937, 25945, 25943, 21855, 25935, 25944,
- 25941, 25940, 26012, 26011, 26028, 26063, {f: 2, c: 26059}, 26062, 26205,
- 26202, 26212, 26216, 26214, 26206, 26361, 21207, 26395, 26753, 26799,
- 26786, 26771, 26805, 26751, 26742, 26801, 26791, 26775, 26800, 26755,
- 26820, 26797, 26758, 26757, 26772, 26781, 26792, 26783, 26785, 26754,
- 27442, 27578, {f: 2, c: 27627}, 27691, 28046, 28092, 28147, 28121, 28082,
- 28129, 28108, 28132, 28155, 28154, 28165, 28103, 28107, 28079, 28113,
- 28078, 28126, 28153, 28088, 28151, 28149, 28101, 28114, 28186, 28085,
- 28122, 28139, 28120, 28138, 28145, 28142, 28136, 28102, 28100, 28074,
- 28140, 28095, 28134, 28921, {f: 2, c: 28937}, 28925, 28911, 29245, 29309,
- 29313, 29468, 29467, 29462, 29459, 29465, 29575, 29701, 29706, 29699,
- 29702, 29694, 29709, 29920, {f: 2, c: 29942}, 29980, 29986,
- {f: 2, c: 30053}, 30050, 30064, 30095, {f: 2, c: 30164}, 30133, 30154,
- 30157, 30350, 30420, 30418, 30427, 30519, 30526, 30524, 30518, 30520,
- 30522, 30827, 30787, 30798, 31077, 31080, 31085, 31227, 31378, 31381,
- 31520, 31528, 31515, 31532, 31526, 31513, 31518, 31534, 31890, 31895,
- 31893, 32070, 32067, 32113, 32046, 32057, 32060, 32064, 32048, 32051,
- 32068, 32047, 32066, 32050, 32049, 32573, 32670, 32666, 32716, 32718,
- 32722, 32796, 32842, 32838, 33071, 33046, 33059, 33067, 33065, 33072,
- 33060, 33282, 33333, 33335, 33334, 33337, 33678, 33694, 33688, 33656,
- 33698, 33686, 33725, 33707, 33682, 33674, 33683, 33673, 33696, 33655,
- {f: 2, c: 33659}, 33670, 33703, 34389, 24426, 34503, 34496, 34486, 34500,
- 34485, 34502, 34507, 34481, 34479, 34505, 34899, 34974, 34952, 34987,
- 34962, 34966, 34957, 34955, 35219, 35215, 35370, 35357, 35363, 35365,
- 35377, 35373, 35359, 35355, 35362, 35913, 35930, 36009, 36012, 36011,
- 36008, 36010, 36007, 36199, 36198, 36286, 36282, 36571, 36575, 36889,
- 36877, 36890, 36887, 36899, 36895, 36893, 36880, 36885, 36894, 36896,
- 36879, 36898, 36886, 36891, 36884, 37096, 37101, [37117, 58488], 37207,
- 37326, 37365, 37350, 37347, 37351, 37357, 37353, 38281, 38506, 38517,
- 38515, 38520, 38512, 38516, {f: 2, c: 38518}, 38508, 38592, 38634, 38633,
- 31456, 31455, {f: 2, c: 38914}, [12226, 39770], [12227, 40165],
- [12228, 40565], [12229, 40575], [12230, 40613], [12231, 40635], 20642,
- 20621, 20613, 20633, 20625, 20608, 20630, 20632, 20634, 26368, 20977,
- 21106, {f: 2, c: 21108}, 21097, 21214, 21213, 21211, 21338, 21413, 21883,
- 21888, 21927, 21884, 21898, 21917, 21912, 21890, 21916, 21930, 21908,
- 21895, 21899, 21891, 21939, 21934, 21919, 21822, 21938, 21914, 21947,
- 21932, 21937, 21886, 21897, 21931, 21913, 22285, 22575, 22570, 22580,
- 22564, {f: 2, c: 22576}, 22561, 22557, 22560, {f: 2, c: 22777}, 22880,
- [23159, 57587], 23194, 23167, 23186, 23195, 23207, 23411, 23409, 23506,
- 23500, 23507, 23504, {f: 2, c: 23562}, 23601, 23884, 23888, 23860, 23879,
- 24061, 24133, 24125, 24128, 24131, 24190, 24266, {f: 2, c: 24257}, 24260,
- 24380, 24429, {f: 2, c: 24489}, 24488, 24785, 24801, 24754, 24758, 24800,
- 24860, 24867, 24826, 24853, 24816, 24827, 24820, 24936, 24817, 24846,
- 24822, 24841, 24832, 24850, 25119, 25161, 25507, 25484, 25551, 25536,
- 25577, 25545, 25542, 25549, 25554, 25571, 25552, 25569, 25558,
- {f: 2, c: 25581}, 25462, 25588, 25578, 25563, 25682, 25562, 25593, 25950,
- 25958, {f: 2, c: 25954}, 26001, 26000, 26031, 26222, 26224, [26228, 57786],
- 26230, 26223, 26257, 26234, 26238, 26231, {f: 2, c: 26366}, 26399, 26397,
- 26874, 26837, 26848, 26840, 26839, 26885, 26847, 26869, 26862, 26855,
- 26873, 26834, 26866, 26851, 26827, 26829, 26893, 26898, 26894, 26825,
- 26842, 26990, 26875, 27454, 27450, 27453, 27544, 27542, 27580, 27631,
- {f: 2, c: 27694}, 27692, [28207, 57904], 28216, 28244, 28193, 28210, 28263,
- 28234, 28192, 28197, 28195, 28187, 28251, 28248, 28196, 28246, 28270,
- 28205, 28198, 28271, 28212, 28237, 28218, 28204, 28227, [28189, 57901],
- 28222, 28363, 28297, 28185, 28238, 28259, 28228, 28274, 28265, 28255,
- {f: 2, c: 28953}, 28966, 28976, 28961, 28982, [29038, 57958], 28956, 29260,
- 29316, 29312, 29494, 29477, 29492, 29481, 29754, 29738, 29747, 29730,
- 29733, {f: 2, c: 29749}, 29748, 29743, 29723, 29734, 29736,
- {f: 2, c: 29989}, 30059, 30058, 30178, 30171, 30179, 30169, 30168, 30174,
- 30176, {f: 2, c: 30331}, 30358, 30355, 30388, 30428, 30543, 30701, 30813,
- 30828, 30831, 31245, 31240, 31243, 31237, 31232, 31384, 31383, 31382,
- 31461, 31459, 31561, 31574, 31558, 31568, 31570, 31572, 31565, 31563,
- 31567, [31569, 60510], 31903, 31909, 32094, 32080, 32104, 32085, 32043,
- 32110, 32114, 32097, 32102, 32098, 32112, 32115, 21892, {f: 2, c: 32724},
- 32779, 32850, 32901, 33109, 33108, 33099, 33105, 33102, 33081, 33094,
- 33086, 33100, 33107, 33140, 33298, 33308, 33769, 33795, 33784, 33805,
- 33760, 33733, 33803, [33729, 58309], 33775, 33777, 33780, 33879, 33802,
- 33776, 33804, 33740, 33789, 33778, 33738, 33848, 33806, 33796, 33756,
- 33799, 33748, 33759, 34395, 34527, 34521, 34541, 34516, 34523, 34532,
- 34512, 34526, 34903, {f: 2, c: 35009}, 34993, 35203, 35222, 35387, 35424,
- 35413, 35422, 35388, 35393, 35412, 35419, 35408, 35398, 35380, 35386,
- 35382, 35414, 35937, 35970, 36015, 36028, 36019, 36029, 36033, 36027,
- 36032, 36020, 36023, 36022, 36031, 36024, 36234, 36229, 36225, 36302,
- 36317, 36299, 36314, 36305, 36300, 36315, 36294, 36603, 36600, 36604,
- 36764, 36910, 36917, 36913, 36920, 36914, 36918, 37122, 37109, 37129,
- 37118, 37219, 37221, 37327, {f: 2, c: 37396}, 37411, 37385, 37406, 37389,
- 37392, 37383, 37393, 38292, 38287, 38283, 38289, 38291, 38290, 38286,
- 38538, 38542, 38539, 38525, {f: 2, c: 38533}, 38541, 38514, 38532, 38593,
- 38597, 38596, {f: 2, c: 38598}, 38639, 38642, 38860, {f: 2, c: 38917},
- 38920, 39143, 39146, 39151, 39145, 39154, 39149, 39342, 39341,
- [12232, 40643], [12233, 40653], [12234, 40657], 20098, 20653, 20661,
- {f: 2, c: 20658}, 20677, 20670, 20652, 20663, 20667, 20655, 20679, 21119,
- 21111, 21117, 21215, 21222, 21220, {f: 2, c: 21218}, 21295, 21983, 21992,
- 21971, 21990, 21966, 21980, 21959, 21969, {f: 2, c: 21987}, 21999, 21978,
- 21985, {f: 2, c: 21957}, 21989, 21961, {f: 2, c: 22290}, 22622, 22609,
- 22616, 22615, 22618, 22612, 22635, 22604, 22637, 22602, 22626, 22610,
- 22603, 22887, 23233, 23241, 23244, 23230, 23229, 23228, 23219, 23234,
- 23218, 23913, 23919, 24140, 24185, 24265, 24264, 24338, 24409, 24492,
- 24494, 24858, 24847, 24904, 24863, 24819, 24859, 24825, 24833, 24840,
- 24910, 24908, 24900, 24909, 24894, 24884, 24871, 24845, 24838, 24887,
- {f: 2, c: 25121}, 25619, 25662, 25630, 25642, 25645, 25661, 25644, 25615,
- 25628, 25620, 25613, 25654, {f: 2, c: 25622}, 25606, 25964, 26015, 26032,
- 26263, 26249, {f: 2, c: 26247}, 26262, 26244, 26264, 26253, 26371, 27028,
- 26989, 26970, 26999, 26976, 26964, 26997, 26928, 27010, 26954, 26984,
- 26987, 26974, 26963, 27001, 27014, 26973, 26979, 26971, 27463, 27506,
- 27584, 27583, 27603, 27645, 28322, 28335, 28371, 28342, 28354, 28304,
- 28317, 28359, 28357, 28325, 28312, 28348, 28346, 28331, 28369, 28310,
- 28316, 28356, 28372, 28330, 28327, 28340, 29006, 29017, 29033, 29028,
- 29001, 29031, 29020, 29036, 29030, 29004, 29029, 29022, 28998, 29032,
- 29014, 29242, 29266, 29495, 29509, 29503, 29502, 29807, 29786, 29781,
- 29791, 29790, 29761, 29759, 29785, 29787, [29788, 58019], 30070, 30072,
- 30208, 30192, 30209, 30194, 30193, 30202, 30207, 30196, 30195,
- {f: 2, c: 30430}, 30555, 30571, 30566, 30558, 30563, 30585, 30570, 30572,
- 30556, 30565, 30568, 30562, 30702, 30862, 30896, {f: 2, c: 30871}, 30860,
- 30857, 30844, 30865, 30867, 30847, 31098, 31103, 31105, 33836, 31165,
- 31260, 31258, 31264, 31252, 31263, 31262, {f: 2, c: 31391}, 31607, 31680,
- 31584, 31598, 31591, 31921, 31923, 31925, 32147, 32121, 32145, 32129,
- 32143, 32091, 32622, {f: 2, c: 32617}, 32626, 32681, 32680, 32676, 32854,
- 32856, 32902, 32900, 33137, 33136, 33144, 33125, 33134, 33139, 33131,
- {f: 2, c: 33145}, 33126, 33285, 33351, 33922, 33911, 33853, 33841, 33909,
- 33894, 33899, 33865, 33900, 33883, 33852, 33845, 33889, 33891, 33897,
- 33901, 33862, 34398, 34396, 34399, 34553, 34579, 34568, 34567, 34560,
- 34558, 34555, {f: 2, c: 34562}, 34566, 34570, 34905, 35039, 35028, 35033,
- 35036, 35032, 35037, 35041, 35018, 35029, 35026, 35228, 35299, 35435,
- {f: 2, c: 35442}, 35430, 35433, 35440, 35463, 35452, 35427, 35488, 35441,
- 35461, 35437, 35426, 35438, 35436, 35449, 35451, 35390, 35432, 35938,
- 35978, 35977, 36042, {f: 2, c: 36039}, 36036, 36018, 36035, 36034, 36037,
- 36321, 36319, 36328, 36335, 36339, 36346, 36330, 36324, 36326, 36530,
- 36611, 36617, 36606, 36618, 36767, 36786, 36939, 36938, 36947, 36930,
- 36948, 36924, 36949, 36944, 36935, 36943, 36942, 36941, 36945, 36926,
- 36929, 37138, 37143, 37228, 37226, 37225, 37321, 37431, 37463, 37432,
- 37437, 37440, 37438, 37467, 37451, 37476, 37457, 37428, 37449, 37453,
- 37445, 37433, 37439, 37466, 38296, 38552, {f: 2, c: 38548}, 38605, 38603,
- {f: 2, c: 38601}, 38647, 38651, 38649, 38646, 38742, 38772, 38774,
- {f: 2, c: 38928}, 38931, 38922, 38930, 38924, 39164, 39156,
- {f: 2, c: 39165}, 39347, 39345, 39348, 39649, 40169, 40578, [12237, 40718],
- [12238, 40723], [12239, 40736], 20711, 20718, 20709, 20694, [20717, 60903],
- 20698, 20693, 20687, 20689, 20721, 20686, 20713, 20834, 20979, 21123,
- 21122, 21297, 21421, 22014, 22016, 22043, 22039, 22013, 22036, 22022,
- 22025, {f: 2, c: 22029}, 22007, 22038, 22047, 22024, 22032, 22006, 22296,
- 22294, 22645, 22654, 22659, 22675, 22666, 22649, 22661, 22653, 22781,
- 22821, 22818, 22820, 22890, 22889, 23265, 23270, 23273, 23255, 23254,
- 23256, 23267, 23413, 23518, 23527, 23521, {f: 2, c: 23525}, 23528, 23522,
- 23524, 23519, 23565, 23650, 23940, 23943, 24155, 24163, 24149, 24151,
- 24148, 24275, 24278, 24330, 24390, 24432, 24505, 24903, 24895, 24907,
- 24951, {f: 2, c: 24930}, 24927, 24922, 24920, 24949, 25130, 25735, 25688,
- 25684, 25764, 25720, 25695, 25722, 25681, 25703, 25652, 25709, 25723,
- 25970, 26017, 26071, 26070, 26274, 26280, 26269, 27036, 27048, 27029,
- 27073, 27054, 27091, 27083, 27035, 27063, 27067, 27051, 27060, 27088,
- 27085, 27053, 27084, 27046, 27075, 27043, 27465, 27468, 27699, 28467,
- 28436, 28414, 28435, 28404, 28457, 28478, 28448, 28460, 28431, 28418,
- 28450, 28415, 28399, 28422, 28465, 28472, 28466, 28451, 28437, 28459,
- 28463, 28552, 28458, 28396, 28417, 28402, 28364, 28407, 29076, 29081,
- 29053, 29066, 29060, 29074, 29246, 29330, 29334, 29508, 29520, 29796,
- 29795, 29802, 29808, 29805, 29956, 30097, 30247, 30221, 30219, 30217,
- 30227, 30433, 30435, 30596, 30589, 30591, 30561, 30913, 30879, 30887,
- 30899, 30889, 30883, {f: 2, c: 31118}, 31117, 31278, 31281, 31402, 31401,
- 31469, 31471, 31649, 31637, 31627, 31605, 31639, 31645, 31636, 31631,
- [31672, 58170], 31623, 31620, 31929, {f: 2, c: 31933}, 32187, 32176, 32156,
- {f: 2, c: 32189}, 32160, 32202, 32180, 32178, 32177, 32186, 32162, 32191,
- 32181, 32184, 32173, [32210, 58202], 32199, 32172, 32624, {f: 2, c: 32736},
- 32735, 32862, 32858, 32903, 33104, 33152, 33167, 33160, 33162, 33151,
- 33154, 33255, 33274, 33287, 33300, 33310, 33355, 33993, 33983, 33990,
- 33988, 33945, 33950, 33970, 33948, 33995, 33976, 33984, 34003, 33936,
- 33980, 34001, 33994, 34623, 34588, 34619, 34594, 34597, 34612, 34584,
- 34645, 34615, 34601, 35059, 35074, 35060, 35065, 35064, 35069, 35048,
- 35098, 35055, 35494, 35468, 35486, 35491, 35469, 35489, 35475, 35492,
- 35498, 35493, 35496, 35480, 35473, 35482, 35495, 35946, 35981, 35980,
- 36051, {f: 2, c: 36049}, 36203, 36249, 36245, 36348, 36628, 36626, 36629,
- 36627, 36771, 36960, 36952, 36956, 36963, 36953, 36958, 36962, 36957,
- 36955, 37145, 37144, 37150, 37237, 37240, 37239, 37236, 37496, 37548,
- 37504, 37509, 37528, 37526, 37499, 37523, 37532, 37544, 37500, 37521,
- 38305, {f: 2, c: 38312}, 38307, 38309, 38308, 38553, 38556, 38555, 38604,
- 38610, 38656, 38780, 38789, 38902, {f: 2, c: 38935}, 39087, 39089, 39171,
- 39173, 39180, 39177, 39361, {f: 2, c: 39599}, 39654, {f: 2, c: 39745},
- 40180, 40182, 40179, 40636, [12240, 40763], [12241, 40778], 20740, 20736,
- 20731, 20725, 20729, 20738, {f: 2, c: 20744}, 20741, 20956,
- {f: 3, c: 21127}, 21133, 21130, 21232, 21426, 22062, 22075, 22073, 22066,
- 22079, 22068, 22057, 22099, 22094, 22103, 22132, 22070, {f: 2, c: 22063},
- 22656, 22687, 22686, 22707, 22684, 22702, 22697, 22694, 22893, 23305,
- 23291, 23307, 23285, 23308, 23304, 23534, 23532, 23529, 23531,
- {f: 2, c: 23652}, 23965, 23956, 24162, 24159, 24161, 24290, 24282, 24287,
- 24285, 24291, 24288, 24392, 24433, 24503, 24501, 24950, 24935, 24942,
- 24925, 24917, 24962, 24956, 24944, 24939, 24958, 24999, 24976, 25003,
- 24974, 25004, 24986, 24996, 24980, 25006, 25134, 25705, 25711, 25721,
- 25758, 25778, 25736, [25744, 57745], 25776, 25765, 25747, 25749, 25769,
- 25746, 25774, 25773, 25771, 25754, 25772, 25753, 25762, 25779, 25973,
- {f: 2, c: 25975}, 26286, 26283, 26292, 26289, 27171, 27167, 27112, 27137,
- 27166, 27161, 27133, 27169, 27155, 27146, 27123, 27138, 27141, 27117,
- 27153, 27472, 27470, 27556, {f: 2, c: 27589}, 28479, 28540, 28548, 28497,
- 28518, 28500, 28550, 28525, 28507, 28536, 28526, 28558, 28538, 28528,
- 28516, 28567, 28504, 28373, 28527, 28512, 28511, 29087, 29100, 29105,
- 29096, 29270, 29339, 29518, 29527, 29801, 29835, 29827, 29822, 29824,
- 30079, 30240, 30249, 30239, 30244, 30246, {f: 2, c: 30241}, 30362, 30394,
- 30436, 30606, 30599, 30604, 30609, 30603, 30923, 30917, 30906, 30922,
- 30910, 30933, 30908, 30928, 31295, 31292, 31296, 31293, 31287, 31291,
- 31407, 31406, 31661, 31665, 31684, 31668, {f: 2, c: 31686}, 31681, 31648,
- 31692, 31946, 32224, 32244, 32239, 32251, 32216, 32236, 32221, 32232,
- 32227, 32218, 32222, 32233, 32158, 32217, 32242, 32249, 32629, 32631,
- 32687, 32745, 32806, {f: 3, c: 33179}, 33184, 33178, 33176, 34071, 34109,
- 34074, 34030, {f: 2, c: 34092}, 34067, 34065, 34083, 34081, 34068, 34028,
- 34085, 34047, 34054, 34690, 34676, 34678, 34656, 34662, 34680, 34664,
- 34649, 34647, 34636, 34643, 34907, 34909, 35088, 35079, {f: 2, c: 35090},
- 35093, 35082, 35516, 35538, 35527, 35524, 35477, 35531, 35576, 35506,
- 35529, 35522, 35519, 35504, 35542, 35533, 35510, 35513, 35547, 35916,
- 35918, 35948, 36064, 36062, 36070, 36068, {f: 2, c: 36076},
- {f: 2, c: 36066}, 36060, 36074, 36065, 36205, 36255, 36259, 36395, 36368,
- 36381, 36386, 36367, 36393, 36383, 36385, 36382, 36538, 36637, 36635,
- 36639, 36649, 36646, 36650, 36636, 36638, 36645, 36969, 36974, 36968,
- 36973, 36983, 37168, 37165, 37159, 37169, 37255, 37257, 37259, 37251,
- 37573, 37563, 37559, 37610, 37604, 37569, 37555, 37564, 37586, 37575,
- 37616, 37554, 38317, 38321, 38660, {f: 2, c: 38662}, 38665, 38752, 38797,
- 38795, 38799, 38945, 38955, 38940, 39091, 39178, 39187, 39186, 39192,
- 39389, 39376, 39391, 39387, 39377, 39381, 39378, 39385, 39607,
- {f: 2, c: 39662}, 39719, 39749, 39748, 39799, 39791, 40198, 40201, 40195,
- 40617, 40638, 40654, 22696, [12242, 40786], 20754, 20760, 20756, 20752,
- 20757, 20864, 20906, 20957, 21137, 21139, 21235, 22105, 22123, 22137,
- 22121, 22116, 22136, 22122, 22120, 22117, 22129, 22127, 22124, 22114,
- 22134, 22721, 22718, 22727, 22725, 22894, 23325, 23348, 23416, 23536,
- 23566, 24394, 25010, 24977, 25001, 24970, 25037, 25014, 25022, 25034,
- 25032, 25136, 25797, 25793, 25803, {f: 2, c: 25787}, 25818, 25796, 25799,
- 25794, 25805, 25791, 25810, 25812, 25790, 25972, 26310, 26313, 26297,
- 26308, 26311, 26296, 27197, 27192, 27194, 27225, 27243, 27224, 27193,
- 27204, 27234, 27233, 27211, 27207, 27189, 27231, 27208, 27481, 27511,
- 27653, 28610, 28593, 28577, 28611, 28580, 28609, 28583, 28595, 28608,
- 28601, [28598, 60318], 28582, 28576, 28596, 29118, 29129, 29136, 29138,
- 29128, 29141, 29113, 29134, 29145, 29148, {f: 2, c: 29123}, 29544, 29852,
- 29859, 29848, 29855, 29854, 29922, {f: 2, c: 29964}, 30260, 30264, 30266,
- 30439, 30437, 30624, {f: 2, c: 30622}, 30629, 30952, 30938, 30956, 30951,
- 31142, {f: 2, c: 31309}, 31302, 31308, 31307, 31418, 31705, 31761, 31689,
- 31716, 31707, 31713, 31721, 31718, {f: 2, c: 31957}, 32266, 32273, 32264,
- 32283, 32291, 32286, [32285, 58211], 32265, 32272, 32633, 32690,
- {f: 2, c: 32752}, 32750, [32808, 58239], 33203, 33193, 33192, 33275, 33288,
- {f: 2, c: 33368}, 34122, 34137, 34120, {f: 2, c: 34152}, 34115, 34121,
- 34157, 34154, 34142, 34691, 34719, 34718, 34722, 34701, 34913, 35114,
- 35122, 35109, 35115, 35105, 35242, [35238, 58391], 35558, 35578, 35563,
- 35569, 35584, 35548, 35559, 35566, 35582, {f: 2, c: 35585}, 35575, 35565,
- 35571, 35574, 35580, 35947, 35949, 35987, 36084, 36420, 36401, 36404,
- 36418, 36409, 36405, 36667, 36655, 36664, 36659, 36776, 36774, 36981,
- 36980, 36984, 36978, 36988, 36986, 37172, 37266, 37664, 37686, 37624,
- 37683, 37679, 37666, 37628, 37675, 37636, 37658, 37648, 37670, 37665,
- 37653, 37678, 37657, 38331, {f: 2, c: 38567}, 38570, 38613, 38670, 38673,
- 38678, 38669, 38675, 38671, 38747, [38748, 58565], 38758, 38808, 38960,
- 38968, 38971, 38967, 38957, 38969, 38948, 39184, 39208, 39198, 39195,
- 39201, 39194, 39405, 39394, 39409, 39608, 39612, 39675, 39661, 39720,
- 39825, 40213, 40227, 40230, 40232, 40210, 40219, 40664, 40660,
- [12243, 40845], [12244, 40860], 20778, 20767, 20769, 20786, 21237, 22158,
- 22144, 22160, 22149, 22151, 22159, 22741, 22739, 22737, 22734, 23344,
- 23338, 23332, 23418, 23607, 23656, 23996, 23994, 23997, 23992, 24171,
- 24396, 24509, 25033, 25026, 25031, 25062, 25035, 25138, 25140, 25806,
- 25802, 25816, 25824, 25840, 25830, 25836, 25841, 25826, 25837,
- {f: 2, c: 25986}, 26329, 26326, 27264, 27284, 27268, 27298, 27292, 27355,
- 27299, 27262, 27287, 27280, 27296, 27484, 27566, 27610, 27656, 28632,
- 28657, {f: 2, c: 28639}, 28635, 28644, 28651, 28655, 28544, 28652, 28641,
- 28649, 28629, 28654, 28656, 29159, [29151, 60361], 29166, 29158, 29157,
- 29165, 29164, 29172, 29152, 29237, 29254, 29552, 29554, 29865, 29872,
- 29862, 29864, 30278, 30274, 30284, 30442, 30643, 30634, 30640, 30636,
- 30631, 30637, 30703, 30967, 30970, 30964, 30959, 30977, 31143, 31146,
- 31319, 31423, 31751, 31757, 31742, 31735, 31756, 31712, 31968, 31964,
- 31966, 31970, 31967, 31961, 31965, 32302, 32318, 32326, 32311, 32306,
- 32323, 32299, 32317, 32305, 32325, 32321, 32308, 32313, 32328, 32309,
- 32319, 32303, 32580, 32755, 32764, {f: 2, c: 32881}, 32880, 32879, 32883,
- 33222, 33219, 33210, 33218, 33216, 33215, 33213, 33225, 33214, 33256,
- 33289, 33393, 34218, 34180, 34174, 34204, 34193, 34196, 34223, 34203,
- 34183, 34216, 34186, 34214, 34407, 34752, 34769, 34739, 34770, 34758,
- 34731, 34747, 34746, 34760, 34763, 35131, 35126, 35140, 35128, 35133,
- 35244, 35598, 35607, 35609, 35611, 35594, 35616, 35613, 35588, 35600,
- 35905, 35903, 35955, 36090, 36093, 36092, 36088, 36091, 36264, 36425,
- 36427, 36424, 36426, 36676, 36670, 36674, 36677, 36671, 36991, 36989,
- 36996, {f: 2, c: 36993}, 36992, 37177, 37283, 37278, 37276, 37709, 37762,
- 37672, 37749, 37706, 37733, 37707, 37656, 37758, 37740, 37723, 37744,
- 37722, 37716, {f: 3, c: 38346}, 38344, 38342, 38577, 38584, 38614, 38684,
- 38686, 38816, 38867, 38982, 39094, 39221, 39425, 39423, 39854, 39851,
- 39850, 39853, 40251, 40255, 40587, 40655, 40670, {f: 2, c: 40668}, 40667,
- 40766, 40779, 21474, 22165, 22190, 22745, 22744, 23352, 24413, 25059,
- 25139, 25844, 25842, 25854, 25862, {f: 2, c: 25850}, 25847, 26039, 26332,
- 26406, 27315, 27308, 27331, 27323, 27320, 27330, {f: 2, c: 27310}, 27487,
- 27512, 27567, 28681, 28683, 28670, 28678, 28666, 28689, 28687,
- {f: 2, c: 29179}, 29182, 29176, 29559, 29557, 29863, 29887, 29973, 30294,
- 30296, 30290, 30653, 30655, {f: 2, c: 30651}, 30990, 31150,
- {f: 2, c: 31329}, 31328, {f: 2, c: 31428}, 31787, 31783, 31786, 31774,
- 31779, 31777, 31975, {f: 2, c: 32340}, 32350, 32346, 32353, 32338, 32345,
- 32584, 32761, 32763, 32887, 32886, 33229, 33231, 33290, 34255, 34217,
- 34253, 34256, 34249, 34224, 34234, 34233, 34799, 34796, 34802, 34784,
- 35206, 35250, 35316, 35624, 35641, 35628, 35627, 35920, 36101, 36441,
- 36451, 36454, 36452, 36447, 36437, 36544, 36681, 36685, 36999, 36995,
- 37000, {f: 2, c: 37291}, 37328, 37780, 37770, 37782, 37794, 37811, 37806,
- 37804, 37808, 37784, 37786, 37783, 38356, 38358, 38352, 38357, 38626,
- 38620, 38617, 38619, 38622, 38692, 38819, 38822, 38829, 38905, 38989,
- 38991, 38988, 38990, 38995, 39098, {f: 2, c: 39230}, 39229, 39214, 39333,
- 39438, 39617, 39683, 39686, 39759, 39758, 39757, 39882, 39881, 39933,
- 39880, 39872, 40273, 40285, 40288, 40672, 40725, 40748, 20787, 22181,
- 22184, {f: 2, c: 22750}, 22754, 23541, 40848, 24300, 25074, 25079, 25078,
- 25077, 25856, 25871, 26336, 26333, 27365, 27357, 27354, 27347, 28699,
- 28703, 28712, 28698, 28701, 28693, 28696, 29190, 29197, 29272, 29346,
- 29560, 29562, 29885, 29898, 29923, 30087, 30086, 30303, 30305, 30663,
- 31001, 31153, 31339, 31337, {f: 2, c: 31806}, 31800, 31805, 31799, 31808,
- 32363, 32365, 32377, {f: 2, c: 32361}, 32371, 32645, 32694, 32697, 32696,
- 33240, 34281, 34269, 34282, 34261, {f: 2, c: 34276}, 34295, 34811, 34821,
- 34829, 34809, 34814, 35168, 35167, 35158, 35166, 35649, 35676, 35672,
- 35657, 35674, {f: 2, c: 35662}, 35654, 35673, 36104, 36106, 36476, 36466,
- 36487, 36470, 36460, 36474, 36468, 36692, 36686, 36781, {f: 2, c: 37002},
- 37297, 37294, 37857, 37841, 37855, 37827, 37832, {f: 2, c: 37852}, 37846,
- 37858, 37837, 37848, 37860, 37847, 37864, 38364, 38580, 38627, 38698,
- 38695, 38753, 38876, 38907, 39006, 39000, 39003, 39100, 39237, 39241,
- 39446, 39449, 39693, 39912, 39911, 39894, 39899, 40329, 40289, 40306,
- 40298, 40300, 40594, 40599, 40595, 40628, 21240, 22199, 22198, 22196,
- 22204, 22756, 23360, 23363, 23421, 23542, 24009, 25080, 25082, 25880,
- 25876, 25881, 26342, 26407, 27372, 28734, 28720, 28722, 29200, 29563,
- 29903, 30306, 30309, 31014, 31018, 31020, 31019, 31431, 31478, 31820,
- 31811, 31821, {f: 2, c: 31983}, 36782, 32381, 32380, 32386, 32588, 32768,
- 33242, 33382, 34299, 34297, 34321, 34298, 34310, 34315, 34311, 34314,
- {f: 2, c: 34836}, 35172, 35258, 35320, 35696, 35692, 35686, 35695, 35679,
- 35691, 36111, 36109, 36489, 36481, 36485, 36482, 37300, 37323, 37912,
- 37891, 37885, 38369, 38704, 39108, 39250, 39249, 39336, 39467, 39472,
- 39479, 39477, 39955, 39949, 40569, 40629, 40680, 40751, 40799, 40803,
- 40801, {f: 2, c: 20791}, 22209, 22208, 22210, 22804, 23660, 24013, 25084,
- 25086, 25885, 25884, 26005, 26345, 27387, 27396, 27386, 27570, 28748,
- 29211, 29351, 29910, 29908, 30313, 30675, 31824, 32399, 32396, 32700,
- 34327, 34349, 34330, 34851, 34850, 34849, 34847, 35178, 35180, 35261,
- 35700, 35703, 35709, 36115, 36490, 36493, 36491, 36703, 36783, 37306,
- 37934, 37939, 37941, 37946, 37944, 37938, 37931, 38370, {f: 2, c: 38712},
- 38706, [38911, 58586], 39015, 39013, 39255, 39493, 39491, 39488, 39486,
- 39631, 39764, 39761, 39981, 39973, 40367, 40372, 40386, 40376, 40605,
- 40687, 40729, 40796, {f: 2, c: 40806}, 20796, 20795, 22216, 22218, 22217,
- 23423, 24020, 24018, 24398, 25087, 25892, 27402, 27489, 28753, 28760,
- 29568, 29924, 30090, 30318, 30316, 31155, 31840, 31839, 32894, 32893,
- 33247, 35186, 35183, 35324, 35712, {f: 2, c: 36118}, 36497, 36499, 36705,
- 37192, 37956, {f: 2, c: 37969}, {f: 2, c: 38717}, 38851, 38849, 39019,
- 39253, 39509, 39501, 39634, 39706, 40009, 39985, 39998, 39995, 40403,
- 40407, 40756, 40812, 40810, 40852, 22220, 24022, 25088, 25891, 25899,
- 25898, 26348, 27408, 29914, 31434, 31844, 31843, 31845, 32403, 32406,
- 32404, 33250, 34360, 34367, 34865, 35722, 37008, 37007, 37987, 37984,
- 37988, 38760, 39023, 39260, {f: 2, c: 39514}, 39511, {f: 2, c: 39635},
- 39633, 40020, 40023, 40022, 40421, 40607, 40692, 22225, 22761, 25900,
- 28766, {f: 2, c: 30321}, [30679, 60226], 32592, 32648, 34870, 34873, 34914,
- 35731, 35730, 35734, 33399, 36123, 37312, 37994, 38722, 38728, 38724,
- 38854, 39024, 39519, 39714, 39768, 40031, {f: 2, c: 40441},
- {f: 2, c: 40572}, 40711, 40823, 40818, 24307, 27414, 28771, 31852, 31854,
- 34875, 35264, 36513, 37313, 38002, 38000, 39025, 39262, 39638, 39715,
- 40652, 28772, 30682, 35738, 38007, 38857, 39522, 39525, 32412, 35740,
- 36522, 37317, {f: 2, c: 38013}, 38012, {f: 2, c: 40055}, 40695, 35924,
- 38015, 40474, 29224, 39530, 39729, 40475, 40478, 31858, 20034, 20060,
- [12048, 20981], [12053, 21274], [12058, 21378], 19975, 19980, 20039, 20109,
- [12062, 22231], [12076, 23662], [12091, 24435], 19983, 20871, 19982, 20014,
- 20115, 20162, 20169, 20168, 20888, 21244, 21356, 21433, 22304, 22787,
- 22828, [23568, 60417], 24063, 26081, [12110, 27571], 27596, [12115, 27668],
- [12121, 29247], 20017, 20028, 20200, 20188, 20201, 20193, 20189, 20186,
- 21004, 21001, 21276, 21324, {f: 2, c: 22306}, 22807, 22831, 23425, 23428,
- 23570, 23611, 23668, 23667, 24068, 24192, 24194, 24521, 25097, 25168,
- 27669, 27702, 27715, 27711, 27707, 29358, 29360, 29578, [12145, 31160],
- 32906, 38430, 20238, 20248, 20268, 20213, 20244, 20209, 20224, 20215,
- 20232, 20253, 20226, 20229, 20258, 20243, 20228, 20212, 20242, 20913,
- 21011, 21008, 21158, 21282, 21279, 21325, 21386, 21511, 22241, 22239,
- 22318, 22314, 22324, 22844, 22912, 22908, 22917, 22907, 22910, 22903,
- 22911, 23382, 23573, 23589, 23676, {f: 2, c: 23674}, 23678, 24031,
- [24181, 57646], 24196, 24322, 24346, 24436, 24533, 24532, 24527, 25180,
- 25182, 25188, 25185, 25190, 25186, 25177, 25184, 25178, 25189, 25911,
- 26095, 26094, 26430, 26425, 26424, 26427, 26426, 26431, 26428, 26419,
- 27672, 27718, 27730, 27740, 27727, [27722, 60796], 27732, {f: 2, c: 27723},
- 28785, 29278, {f: 2, c: 29364}, 29582, 29994, 30335, 31349, [12153, 32593],
- [12171, 33400], 33404, 33408, 33405, 33407, [12172, 34381], [12177, 35198],
- 37017, [37015, 59347], 37016, 37019, 37012, 38434, 38436, 38432, 38435,
- 20310, 20283, 20322, 20297, 20307, 20324, 20286, 20327, 20306, 20319,
- 20289, 20312, 20269, 20275, 20287, 20321, 20879, 20921, 21020, 21022,
- 21025, {f: 2, c: 21165}, 21257, 21347, 21362, {f: 2, c: 21390}, 21552,
- 21559, 21546, 21588, 21573, 21529, 21532, 21541, 21528, 21565, 21583,
- 21569, 21544, 21540, 21575, 22254, 22247, 22245, 22337, 22341, 22348,
- 22345, 22347, 22354, 22790, 22848, 22950, 22936, 22944, 22935, 22926,
- 22946, 22928, 22927, 22951, 22945, 23438, 23442, 23592, 23594, 23693,
- 23695, 23688, 23691, 23689, 23698, 23690, 23686, 23699, 23701, 24032,
- 24074, 24078, 24203, 24201, 24204, 24200, 24205, 24325, 24349, 24440,
- 24438, 24530, 24529, 24528, 24557, 24552, 24558, 24563, 24545, 24548,
- 24547, 24570, 24559, 24567, 24571, 24576, 24564, 25146, 25219, 25228,
- {f: 2, c: 25230}, 25236, 25223, 25201, 25211, 25210, 25200, 25217, 25224,
- 25207, 25213, 25202, 25204, 26096, 26100, 26099, 26098, 26101, 26437,
- 26439, 26457, 26453, 26444, 26440, 26461, 26445, 26458, 26443, 27600,
- {f: 2, c: 27673}, 27768, 27751, 27755, 27780, 27787, 27791, 27761, 27759,
- 27753, 27802, 27757, 27783, 27797, [27804, 57900], 27750, 27763, 27749,
- 27771, 27790, 28788, 28794, 29283, 29375, 29373, 29379, 29382, 29377,
- 29370, 29381, 29589, 29591, {f: 2, c: 29587}, 29586, 30010, 30009,
- {f: 2, c: 30100}, 30337, 31037, 32820, 32917, 32921, 32912, 32914, 32924,
- 33424, 33423, 33413, 33422, 33425, 33427, 33418, {f: 2, c: 33411},
- [12184, 35960], 36809, 36799, 37023, 37025, 37029, 37022, 37031, 37024,
- 38448, 38440, 38447, 38445, 20019, 20376, 20348, 20357, 20349, 20352,
- 20359, 20342, 20340, 20361, 20356, 20343, 20300, 20375, 20330, 20378,
- 20345, 20353, 20344, 20368, 20380, 20372, 20382, 20370, 20354, 20373,
- 20331, 20334, 20894, 20924, 20926, 21045, {f: 2, c: 21042}, 21062, 21041,
- 21180, {f: 2, c: 21258}, 21308, 21394, 21396, 21639, 21631, 21633, 21649,
- 21634, 21640, 21611, 21626, 21630, 21605, 21612, 21620, 21606, 21645,
- 21615, 21601, 21600, 21656, 21603, 21607, 21604, 22263, 22265, 22383,
- 22386, 22381, 22379, 22385, 22384, 22390, 22400, 22389, 22395,
- {f: 2, c: 22387}, 22370, 22376, 22397, 22796, 22853, 22965, 22970, 22991,
- 22990, 22962, 22988, 22977, 22966, 22972, 22979, 22998, 22961, 22973,
- 22976, 22984, 22964, 22983, 23394, 23397, 23443, 23445, 23620, 23623,
- 23726, 23716, 23712, 23733, 23727, 23720, 23724, 23711, 23715, 23725,
- 23714, 23722, 23719, 23709, 23717, 23734, 23728, 23718, 24087, 24084,
- 24089, 24360, {f: 3, c: 24354}, 24404, 24450, 24446, 24445, 24542, 24549,
- 24621, 24614, 24601, 24626, 24587, 24628, 24586, 24599, 24627, 24602,
- 24606, 24620, 24610, 24589, 24592, 24622, 24595, 24593, 24588, 24585,
- 24604, 25108, 25149, 25261, 25268, 25297, 25278, 25258, 25270, 25290,
- 25262, 25267, 25263, 25275, 25257, 25264, 25272, 25917, 26024, 26043,
- 26121, 26108, 26116, 26130, 26120, 26107, 26115, 26123, 26125, 26117,
- 26109, 26129, 26128, 26358, 26378, 26501, 26476, 26510, 26514, 26486,
- 26491, 26520, 26502, 26500, 26484, 26509, 26508, 26490, 26527, 26513,
- 26521, 26499, 26493, 26497, {f: 2, c: 26488}, 26516, 27429, 27520, 27518,
- 27614, 27677, 27795, 27884, 27883, 27886, 27865, 27830, 27860, 27821,
- 27879, 27831, 27856, 27842, 27834, 27843, 27846, 27885, 27890, 27858,
- 27869, 27828, 27786, 27805, 27776, 27870, 27840, 27952, 27853, 27847,
- 27824, 27897, 27855, 27881, 27857, 28820, 28824, 28805, 28819, 28806,
- 28804, 28817, 28822, 28802, 28826, 28803, 29290, 29398, 29387, 29400,
- 29385, 29404, 29394, 29396, 29402, 29388, 29393, 29604, 29601, 29613,
- 29606, 29602, 29600, 29612, 29597, 29917, 29928, {f: 2, c: 30015}, 30014,
- 30092, 30104, 30383, 30451, 30449, 30448, 30453, 30712, 30716, 30713,
- 30715, 30714, 30711, 31042, 31039, 31173, 31352, 31355, 31483, 31861,
- 31997, 32821, 32911, 32942, 32931, 32952, 32949, 32941, 33312, 33440,
- 33472, 33451, 33434, 33432, 33435, 33461, 33447, 33454, 33468, 33438,
- 33466, 33460, 33448, 33441, 33449, 33474, 33444, 33475, 33462, 33442,
- 34416, 34415, {f: 2, c: 34413}, 35926, 36818, 36811, 36819, 36813, 36822,
- 36821, 36823, 37042, 37044, 37039, 37043, 37040, 38457, 38461, 38460,
- 38458, 38467, 20429, 20421, 20435, 20402, 20425, 20427, 20417, 20436,
- 20444, 20441, [20411, 60346], 20403, 20443, 20423, 20438, 20410, 20416,
- 20409, 20460, 21060, 21065, 21184, 21186, 21309, 21372, 21399, 21398,
- 21401, 21400, 21690, 21665, 21677, 21669, 21711, 21699, 33549, 21687,
- 21678, 21718, 21686, {f: 2, c: 21701}, 21664, 21616, 21692, 21666, 21694,
- 21618, 21726, 21680, 22453, {f: 2, c: 22430}, 22436, 22412, 22423, 22429,
- 22427, 22420, 22424, 22415, 22425, 22437, 22426, 22421, 22772, 22797,
- 22867, 23009, 23006, 23022, 23040, 23025, 23005, 23034, 23037, 23036,
- 23030, 23012, 23026, 23031, 23003, 23017, 23027, 23029, 23008, 23038,
- 23028, 23021, 23464, 23628, 23760, 23768, 23756, 23767, 23755, 23771,
- 23774, 23770, 23753, 23751, 23754, 23766, {f: 2, c: 23763}, 23759, 23752,
- 23750, 23758, 23775, 23800, 24057, {f: 3, c: 24097}, 24096, 24100, 24240,
- 24228, 24226, 24219, 24227, 24229, 24327, 24366, 24406, 24454, 24631,
- 24633, 24660, 24690, 24670, 24645, 24659, 24647, 24649, 24667, 24652,
- 24640, 24642, 24671, 24612, 24644, 24664, 24678, 24686, {f: 2, c: 25154},
- 25295, 25357, 25355, 25333, 25358, 25347, 25323, 25337, 25359, 25356,
- 25336, 25334, 25344, {f: 2, c: 25363}, 25338, 25365, 25339, 25328, 25921,
- 25923, 26026, 26047, 26166, 26145, 26162, 26165, 26140, 26150, 26146,
- 26163, 26155, 26170, 26141, 26164, 26169, 26158, {f: 2, c: 26383}, 26561,
- 26610, 26568, 26554, 26588, 26555, 26616, 26584, 26560, 26551, 26565,
- 26603, 26596, 26591, 26549, 26573, 26547, 26615, 26614, 26606, 26595,
- 26562, 26553, 26574, 26599, 26608, 26546, 26620, 26566, 26605, 26572,
- 26542, 26598, 26587, 26618, {f: 2, c: 26569}, 26563, 26602, 26571, 27432,
- 27522, 27524, 27574, 27606, 27608, 27616, {f: 2, c: 27680}, 27944, 27956,
- 27949, 27935, 27964, 27967, 27922, 27914, 27866, 27955, 27908, 27929,
- 27962, 27930, 27921, 27904, 27933, 27970, 27905, 27928, 27959, 27907,
- 27919, 27968, 27911, 27936, 27948, 27912, 27938, 27913, 27920, 28855,
- 28831, 28862, 28849, 28848, 28833, {f: 2, c: 28852}, 28841, 29249,
- {f: 2, c: 29257}, 29292, 29296, 29299, 29294, 29386, 29412, 29416, 29419,
- 29407, 29418, 29414, 29411, 29573, 29644, 29634, 29640, 29637, 29625,
- 29622, 29621, 29620, 29675, 29631, 29639, 29630, 29635, 29638, 29624,
- 29643, 29932, 29934, 29998, {f: 2, c: 30023}, 30119, 30122, 30329, 30404,
- 30472, {f: 3, c: 30467}, 30474, 30455, 30459, 30458, {f: 2, c: 30695},
- 30726, {f: 2, c: 30737}, 30725, 30736, 30735, 30734, [30729, 58095], 30723,
- 30739, 31050, 31052, 31051, 31045, 31044, 31189, 31181, 31183, 31190,
- 31182, 31360, 31358, 31441, {f: 2, c: 31488}, 31866, {f: 2, c: 31864},
- {f: 3, c: 31871}, 32003, 32008, 32001, 32600, 32657, 32653, 32702, 32775,
- {f: 2, c: 32782}, 32788, 32823, 32984, 32967, 32992, 32977, 32968, 32962,
- 32976, 32965, 32995, 32985, 32988, 32970, 32981, 32969, 32975, 32983,
- 32998, 32973, 33279, 33313, 33428, 33497, 33534, 33529, 33543, 33512,
- 33536, 33493, 33594, 33515, 33494, 33524, 33516, 33505, 33522, 33525,
- 33548, 33531, 33526, 33520, 33514, 33508, 33504, 33530, 33523, 33517,
- 34423, 34420, 34428, 34419, 34881, 34894, 34919, 34922, 34921, 35283,
- 35332, 35335, 36210, 36835, 36833, 36846, 36832, 37105, 37053, 37055,
- 37077, 37061, 37054, 37063, 37067, 37064, [37332, 60294], 37331, 38484,
- 38479, 38481, 38483, 38474, 38478, 20510, 20485, 20487, 20499, 20514,
- 20528, 20507, 20469, 20468, 20531, 20535, 20524, {f: 2, c: 20470}, 20503,
- 20508, 20512, 20519, 20533, 20527, 20529, 20494, 20826, 20884, 20883,
- 20938, {f: 2, c: 20932}, 20936, 20942, 21089, 21082, 21074,
- {f: 2, c: 21086}, 21077, 21090, 21197, 21262, 21406, 21798, 21730, 21783,
- 21778, 21735, 21747, 21732, 21786, 21759, 21764, 21768, 21739, 21777,
- 21765, 21745, 21770, 21755, {f: 2, c: 21751}, 21728, 21774, 21763, 21771,
- {f: 2, c: 22273}, 22476, 22578, 22485, 22482, 22458, 22470, 22461, 22460,
- 22456, 22454, 22463, 22471, 22480, 22457, 22465, 22798, 22858, 23065,
- 23062, {f: 2, c: 23085}, 23061, 23055, 23063, 23050, 23070, 23091, 23404,
- 23463, 23469, 23468, 23555, 23638, 23636, 23788, 23807, 23790, 23793,
- 23799, 23808, 23801, 24105, 24104, 24232, 24238, 24234, 24236, 24371,
- 24368, 24423, 24669, 24666, 24679, 24641, 24738, 24712, 24704, 24722,
- 24705, 24733, 24707, 24725, 24731, 24727, 24711, 24732, 24718, 25113,
- 25158, 25330, 25360, 25430, 25388, {f: 2, c: 25412}, 25398, 25411, 25572,
- 25401, 25419, 25418, 25404, 25385, 25409, 25396, 25432, 25428, 25433,
- 25389, 25415, 25395, 25434, 25425, 25400, 25431, 25408, 25416, 25930,
- 25926, 26054, {f: 2, c: 26051}, 26050, 26186, 26207, 26183, 26193,
- {f: 2, c: 26386}, 26655, 26650, 26697, {f: 2, c: 26674}, 26683, 26699,
- 26703, 26646, 26673, 26652, 26677, 26667, 26669, 26671, 26702, 26692,
- 26676, 26653, 26642, 26644, 26662, 26664, 26670, 26701, 26682, 26661,
- 26656, 27436, 27439, 27437, 27441, 27444, 27501, 32898, 27528, 27622,
- 27620, 27624, 27619, 27618, 27623, 27685, 28026, {f: 2, c: 28003}, 28022,
- 27917, 28001, 28050, 27992, 28002, 28013, 28015, 28049, 28045, 28143,
- 28031, 28038, 27998, [28007, 59078], 28000, 28055, 28016, 28028, 27999,
- 28034, 28056, 27951, 28008, 28043, 28030, 28032, 28036, 27926, 28035,
- 28027, 28029, 28021, 28048, 28892, 28883, 28881, 28893, 28875, 32569,
- 28898, 28887, 28882, 28894, 28896, 28884, 28877, {f: 3, c: 28869}, 28890,
- 28878, 28897, 29250, 29304, 29303, 29302, 29440, 29434, 29428, 29438,
- 29430, 29427, 29435, 29441, 29651, 29657, 29669, 29654, 29628, 29671,
- 29667, 29673, 29660, 29650, 29659, 29652, 29661, 29658, {f: 2, c: 29655},
- 29672, {f: 2, c: 29918}, {f: 2, c: 29940}, 29985, 30043, 30047, 30128,
- 30145, 30139, 30148, 30144, 30143, 30134, 30138, 30346, 30409, 30493,
- 30491, 30480, 30483, 30482, 30499, 30481, 30485, {f: 2, c: 30489}, 30498,
- 30503, 30755, 30764, 30754, 30773, 30767, 30760, 30766, 30763, 30753,
- 30761, 30771, 30762, 30769, 31060, 31067, 31055, 31068, 31059, 31058,
- 31057, {f: 2, c: 31211}, 31200, 31214, 31213, 31210, 31196, 31198, 31197,
- 31366, 31369, 31365, {f: 2, c: 31371}, 31370, 31367, 31448, 31504, 31492,
- 31507, 31493, 31503, 31496, 31498, 31502, 31497, 31506, 31876, 31889,
- 31882, 31884, 31880, 31885, 31877, 32030, 32029, 32017, 32014, 32024,
- 32022, 32019, 32031, 32018, 32015, 32012, 32604, 32609, 32606, 32608,
- 32605, 32603, 32662, 32658, 32707, 32706, 32704, 32790, 32830, 32825,
- 33018, 33010, 33017, 33013, 33025, 33019, 33024, 33281, 33327, 33317,
- 33587, 33581, 33604, 33561, 33617, 33573, 33622, 33599, 33601, 33574,
- 33564, 33570, 33602, 33614, 33563, 33578, 33544, 33596, 33613, 33558,
- 33572, 33568, 33591, 33583, 33577, 33607, 33605, 33612, 33619, 33566,
- 33580, 33611, 33575, 33608, 34387, 34386, 34466, 34472, 34454, 34445,
- 34449, 34462, 34439, 34455, 34438, 34443, 34458, 34437, 34469, 34457,
- 34465, 34471, 34453, 34456, 34446, 34461, 34448, 34452, {f: 2, c: 34883},
- 34925, {f: 2, c: 34933}, 34930, 34944, 34929, 34943, 34927, 34947, 34942,
- 34932, 34940, 35346, 35911, 35927, 35963, 36004, 36003, 36214, 36216,
- 36277, 36279, 36278, 36561, 36563, 36862, 36853, 36866, 36863, 36859,
- 36868, 36860, 36854, 37078, 37088, {f: 2, c: 37081}, 37091, 37087, 37093,
- 37080, 37083, 37079, 37084, 37092, 37200, {f: 2, c: 37198}, 37333, 37346,
- 37338, 38492, 38495, 38588, 39139, [12221, 39647], [12223, 39727], 20095,
- 20592, 20586, 20577, 20574, 20576, 20563, 20555, 20573, 20594, 20552,
- 20557, 20545, 20571, 20554, 20578, 20501, 20549, 20575, 20585, 20587,
- {f: 2, c: 20579}, 20550, 20544, 20590, 20595, 20567, 20561, 20944, 21099,
- 21101, 21100, 21102, 21206, 21203, 21293, 21404, {f: 2, c: 21877}, 21820,
- 21837, 21840, 21812, 21802, 21841, 21858, 21814, 21813, 21808, 21842,
- 21829, 21772, 21810, 21861, 21838, 21817, 21832, 21805, 21819, 21824,
- 21835, 22282, 22279, 22523, 22548, 22498, 22518, 22492, 22516, 22528,
- 22509, 22525, 22536, 22520, 22539, 22515, 22479, 22535, 22510, 22499,
- 22514, 22501, 22508, 22497, 22542, 22524, 22544, 22503, 22529, 22540,
- 22513, 22505, 22512, 22541, 22532, 22876, 23136, 23128, 23125,
- [23143, 60437], 23134, 23096, 23093, 23149, 23120, 23135, 23141, 23148,
- 23123, 23140, 23127, 23107, 23133, 23122, 23108, 23131, 23112, 23182,
- 23102, 23117, 23097, 23116, 23152, 23145, 23111, 23121, 23126, 23106,
- 23132, 23410, 23406, 23489, 23488, 23641, 23838, 23819, 23837, 23834,
- 23840, 23820, 23848, 23821, 23846, 23845, 23823, 23856, 23826, 23843,
- 23839, 23854, 24126, 24116, 24241, 24244, 24249, {f: 2, c: 24242}, 24374,
- 24376, 24475, 24470, 24479, 24714, 24720, 24710, 24766, 24752, 24762,
- {f: 2, c: 24787}, 24783, 24804, 24793, 24797, 24776, 24753, 24795, 24759,
- 24778, 24767, 24771, 24781, 24768, 25394, 25445, 25482, 25474, 25469,
- 25533, 25502, 25517, 25501, 25495, 25515, 25486, 25455, 25479, 25488,
- 25454, 25519, 25461, 25500, 25453, 25518, 25468, 25508, 25403, 25503,
- 25464, 25477, 25473, 25489, 25485, 25456, 25939, 26061, 26213, 26209,
- 26203, 26201, 26204, 26210, 26392, 26745, 26759, 26768, 26780,
- {f: 2, c: 26733}, 26798, 26795, 26966, 26735, 26787, 26796, 26793, 26741,
- 26740, 26802, 26767, 26743, 26770, 26748, 26731, 26738, 26794, 26752,
- 26737, 26750, 26779, 26774, 26763, 26784, 26761, 26788, 26744, 26747,
- 26769, 26764, 26762, 26749, 27446, 27443, {f: 2, c: 27447}, 27537, 27535,
- {f: 2, c: 27533}, 27532, 27690, 28096, 28075, 28084, 28083, 28276, 28076,
- 28137, 28130, 28087, 28150, 28116, 28160, 28104, 28128, 28127, 28118,
- 28094, 28133, {f: 2, c: 28124}, 28123, 28148, 28106, 28093, 28141, 28144,
- 28090, 28117, 28098, 28111, 28105, 28112, 28146, 28115, 28157, 28119,
- 28109, 28131, 28091, 28922, 28941, 28919, 28951, 28916, 28940, 28912,
- 28932, 28915, 28944, 28924, 28927, 28934, 28947, 28928, 28920, 28918,
- 28939, 28930, 28942, 29310, {f: 2, c: 29307}, 29311, 29469, 29463, 29447,
- 29457, 29464, 29450, 29448, 29439, 29455, 29470, 29576, 29686, 29688,
- 29685, 29700, 29697, 29693, 29703, 29696, 29690, 29692, 29695, 29708,
- 29707, 29684, 29704, 30052, 30051, 30158, 30162, 30159, {f: 2, c: 30155},
- 30161, 30160, 30351, 30345, 30419, 30521, 30511, 30509, {f: 2, c: 30513},
- 30516, 30515, 30525, 30501, 30523, 30517, 30792, 30802, 30793, 30797,
- 30794, 30796, 30758, 30789, 30800, 31076, 31079, {f: 2, c: 31081}, 31075,
- 31083, 31073, 31163, 31226, 31224, {f: 2, c: 31222}, 31375, 31380, 31376,
- 31541, 31547, 31540, 31525, 31536, 31522, 31524, 31539, 31512, 31530,
- 31517, 31537, 31531, 31533, 31535, 31538, 31544, 31514, 31523, 31892,
- 31896, 31894, 31907, 32053, 32061, 32056, 32054, 32058, 32069, 32044,
- 32041, 32065, 32071, {f: 2, c: 32062}, 32074, 32059, 32040, 32611, 32661,
- {f: 2, c: 32668}, 32667, {f: 2, c: 32714}, 32717, {f: 2, c: 32720}, 32711,
- 32719, 32713, 32799, 32798, 32795, 32839, 32835, 32840, 33048, 33061,
- 33049, 33051, 33069, 33055, 33068, 33054, 33057, 33045, 33063, 33053,
- 33058, 33297, 33336, 33331, 33338, 33332, 33330, 33396, 33680, 33699,
- 33704, 33677, 33658, 33651, 33700, 33652, 33679, 33665, 33685, 33689,
- 33653, 33684, 33705, 33661, 33667, 33676, 33693, 33691, 33706, 33675,
- 33662, 33701, 33711, 33672, 33687, 33712, 33663, 33702, 33671, 33710,
- 33654, 34393, 34390, 34495, 34487, 34498, 34497, 34501, 34490, 34480,
- 34504, 34489, 34483, 34488, 34508, 34484, {f: 2, c: 34491}, 34499,
- {f: 2, c: 34493}, 34898, 34953, 34965, 34984, 34978, 34986, 34970, 34961,
- 34977, 34975, 34968, 34983, 34969, 34971, 34967, 34980, 34988, 34956,
- 34963, 34958, 35202, 35286, 35289, 35285, 35376, 35367, 35372, 35358,
- 35897, 35899, {f: 2, c: 35932}, 35965, 36005, 36221, 36219, 36217, 36284,
- 36290, 36281, 36287, 36289, 36568, 36574, 36573, 36572, 36567,
- {f: 2, c: 36576}, 36900, 36875, 36881, 36892, 36876, 36897, 37103, 37098,
- 37104, 37108, {f: 2, c: 37106}, 37076, {f: 2, c: 37099}, 37097, 37206,
- 37208, 37210, 37203, 37205, 37356, 37364, 37361, 37363, 37368, 37348,
- 37369, {f: 2, c: 37354}, 37367, 37352, 37358, 38266, 38278, 38280, 38524,
- 38509, 38507, 38513, 38511, 38591, 38762, 38916, 39141, 39319, 20635,
- 20629, 20628, 20638, 20619, 20643, 20611, 20620, 20622, 20637, 20584,
- 20636, 20626, 20610, 20615, 20831, 20948, 21266, 21265, 21412, 21415,
- 21905, 21928, 21925, 21933, 21879, 22085, 21922, 21907, 21896, 21903,
- 21941, 21889, 21923, 21906, 21924, 21885, 21900, 21926, 21887, 21909,
- 21921, 21902, 22284, 22569, 22583, 22553, 22558, 22567, 22563, 22568,
- 22517, 22600, 22565, 22556, 22555, 22579, 22591, 22582, 22574, 22585,
- 22584, 22573, 22572, 22587, 22881, 23215, 23188, 23199, 23162, 23202,
- 23198, 23160, 23206, 23164, 23205, 23212, 23189, 23214, 23095, 23172,
- 23178, 23191, 23171, 23179, 23209, 23163, 23165, 23180, 23196, 23183,
- 23187, 23197, 23530, 23501, 23499, 23508, 23505, 23498, 23502, 23564,
- 23600, 23863, 23875, 23915, 23873, 23883, 23871, 23861, 23889, 23886,
- 23893, 23859, 23866, 23890, 23869, 23857, 23897, 23874, 23865, 23881,
- 23864, 23868, 23858, 23862, 23872, 23877, 24132, 24129, [24408, 57673],
- 24486, 24485, 24491, 24777, 24761, 24780, 24802, 24782, 24772, 24852,
- 24818, 24842, 24854, 24837, 24821, 24851, 24824, 24828, 24830, 24769,
- 24835, 24856, 24861, 24848, 24831, 24836, 24843, 25162, 25492, 25521,
- 25520, 25550, 25573, 25576, 25583, 25539, 25757, 25587, 25546, 25568,
- 25590, 25557, 25586, 25589, 25697, 25567, 25534, 25565, 25564, 25540,
- 25560, 25555, 25538, 25543, 25548, 25547, 25544, 25584, 25559, 25561,
- 25906, 25959, 25962, 25956, 25948, 25960, 25957, 25996, {f: 2, c: 26013},
- 26030, 26064, 26066, 26236, 26220, 26235, 26240, 26225, 26233, 26218,
- 26226, 26369, 26892, 26835, 26884, 26844, 26922, 26860, 26858, 26865,
- 26895, 26838, 26871, 26859, 26852, 26870, 26899, 26896, 26867, 26849,
- 26887, 26828, 26888, 26992, 26804, 26897, 26863, 26822, 26900, 26872,
- 26832, 26877, 26876, 26856, 26891, 26890, 26903, 26830, 26824,
- {f: 2, c: 26845}, 26854, 26868, 26833, 26886, 26836, 26857, 26901, 26917,
- 26823, 27449, 27451, 27455, 27452, 27540, 27543, 27545, 27541, 27581,
- 27632, {f: 2, c: 27634}, 27696, 28156, {f: 2, c: 28230}, 28191, 28233,
- 28296, {f: 2, c: 28220}, 28229, 28258, 28203, 28223, 28225, 28253, 28275,
- 28188, 28211, 28235, 28224, 28241, 28219, 28163, 28206, 28254, 28264,
- 28252, 28257, 28209, 28200, 28256, 28273, 28267, 28217, 28194, 28208,
- 28243, 28261, 28199, 28280, 28260, 28279, 28245, 28281, 28242, 28262,
- {f: 2, c: 28213}, 28250, 28960, 28958, 28975, 28923, 28974, 28977, 28963,
- 28965, 28962, 28978, 28959, 28968, 28986, 28955, 29259, 29274,
- {f: 2, c: 29320}, 29318, 29317, 29323, 29458, 29451, 29488, 29474, 29489,
- 29491, 29479, 29490, 29485, 29478, 29475, 29493, 29452, 29742, 29740,
- 29744, 29739, 29718, 29722, 29729, 29741, 29745, 29732, 29731, 29725,
- 29737, 29728, 29746, 29947, 29999, 30063, 30060, 30183, 30170, 30177,
- 30182, 30173, 30175, 30180, 30167, 30357, 30354, 30426, {f: 2, c: 30534},
- 30532, 30541, 30533, 30538, 30542, {f: 2, c: 30539}, 30686, 30700, 30816,
- {f: 2, c: 30820}, 30812, 30829, 30833, 30826, 30830, 30832, 30825, 30824,
- 30814, 30818, 31092, 31091, 31090, 31088, 31234, 31242, 31235, 31244,
- 31236, 31385, 31462, 31460, 31562, 31559, 31556, 31560, 31564, 31566,
- 31552, 31576, 31557, 31906, 31902, 31912, 31905, 32088, 32111, 32099,
- 32083, 32086, 32103, 32106, 32079, 32109, 32092, 32107, 32082, 32084,
- 32105, 32081, 32095, 32078, {f: 2, c: 32574}, {f: 2, c: 32613}, 32674,
- {f: 2, c: 32672}, 32727, 32849, {f: 2, c: 32847}, 33022, 32980, 33091,
- 33098, 33106, 33103, 33095, 33085, 33101, 33082, 33254, 33262,
- {f: 3, c: 33271}, 33284, {f: 2, c: 33340}, 33343, 33397, 33595,
- [33743, 60382], 33785, 33827, 33728, 33768, 33810, 33767, 33764, 33788,
- 33782, 33808, 33734, 33736, 33771, 33763, 33727, 33793, 33757, 33765,
- 33752, 33791, 33761, 33739, 33742, 33750, 33781, 33737, 33801,
- [33807, 58332], 33758, 33809, 33798, 33730, 33779, 33749, 33786, 33735,
- 33745, 33770, 33811, 33690, 33731, 33772, 33774, 33732, 33787, 33751,
- 33762, 33819, 33755, 33790, 34520, 34530, 34534, 34515, 34531, 34522,
- 34538, 34525, 34539, 34524, 34540, 34537, 34519, 34536, 34513, 34888,
- 34902, 34901, 35002, 35031, 35001, 35000, 35008, 35006, 34998, 35004,
- 34999, 35005, 34994, 35073, 35017, 35221, 35224, 35223, 35293,
- {f: 2, c: 35290}, 35406, 35405, 35385, 35417, 35392, {f: 2, c: 35415},
- {f: 2, c: 35396}, 35410, 35400, 35409, 35402, 35404, 35407, 35935, 35969,
- 35968, 36026, 36030, 36016, 36025, 36021, 36228, 36224, 36233, 36312,
- 36307, 36301, 36295, 36310, 36316, 36303, 36309, 36313, 36296, 36311,
- 36293, 36591, 36599, 36602, 36601, 36582, 36590, 36581, 36597,
- {f: 2, c: 36583}, 36598, 36587, 36593, 36588, 36596, 36585, 36909, 36916,
- 36911, 37126, 37164, [37124, 60367], 37119, 37116, 37128, 37113, 37115,
- 37121, 37120, 37127, 37125, 37123, 37217, 37220, 37215, 37218, 37216,
- 37377, 37386, 37413, 37379, 37402, 37414, 37391, 37388, 37376, 37394,
- 37375, 37373, 37382, 37380, 37415, 37378, 37404, 37412, 37401, 37399,
- 37381, 37398, 38267, 38285, 38284, 38288, 38535, 38526, {f: 2, c: 38536},
- 38531, 38528, 38594, 38600, 38595, 38641, 38640, 38764, 38768, 38766,
- 38919, 39081, 39147, 40166, [12235, 40697], {f: 2, c: 20099}, 20150, 20669,
- 20671, 20678, 20654, 20676, 20682, 20660, 20680, 20674, 20656, 20673,
- 20666, 20657, 20683, 20681, 20662, 20664, 20951, 21114, 21112,
- {f: 2, c: 21115}, 21955, 21979, 21964, 21968, 21963, 21962, 21981,
- [21952, 64013], 21972, 21956, 21993, 21951, 21970, 21901, 21967, 21973,
- 21986, 21974, 21960, 22002, 21965, 21977, 21954, 22292, 22611, 22632,
- 22628, 22607, 22605, 22601, 22639, 22613, 22606, 22621, 22617, 22629,
- 22619, 22589, 22627, 22641, 22780, 23239, 23236, 23243, 23226, 23224,
- 23217, 23221, 23216, 23231, 23240, 23227, 23238, 23223, 23232, 23242,
- 23220, 23222, 23245, 23225, 23184, 23510, {f: 2, c: 23512}, 23583, 23603,
- 23921, 23907, 23882, 23909, 23922, 23916, 23902, 23912, 23911, 23906,
- 24048, 24143, 24142, 24138, 24141, 24139, 24261, 24268, 24262, 24267,
- 24263, 24384, 24495, 24493, 24823, {f: 2, c: 24905}, 24875, 24901, 24886,
- 24882, 24878, 24902, 24879, 24911, 24873, 24896, 25120, 37224, 25123,
- 25125, 25124, 25541, 25585, 25579, 25616, 25618, 25609, 25632, 25636,
- 25651, 25667, 25631, 25621, 25624, 25657, 25655, {f: 2, c: 25634}, 25612,
- 25638, 25648, 25640, 25665, 25653, 25647, 25610, 25626, 25664, 25637,
- 25639, 25611, 25575, 25627, 25646, 25633, 25614, 25967, 26002, 26067,
- 26246, 26252, 26261, 26256, 26251, 26250, 26265, 26260, 26232, 26400,
- 26982, 26975, 26936, 26958, 26978, 26993, 26943, 26949, 26986, 26937,
- 26946, 26967, 26969, 27002, {f: 2, c: 26952}, 26933, 26988, 26931, 26941,
- 26981, 26864, 27000, 26932, 26985, 26944, 26991, 26948, 26998, 26968,
- 26945, 26996, 26956, 26939, 26955, 26935, 26972, 26959, 26961, 26930,
- 26962, 26927, 27003, 26940, 27462, 27461, 27459, 27458, 27464, 27457,
- 27547, {f: 2, c: 27643}, 27641, {f: 2, c: 27639}, 28315, 28374, 28360,
- 28303, 28352, 28319, {f: 2, c: 28307}, 28320, 28337, 28345, 28358, 28370,
- 28349, 28353, 28318, 28361, 28343, 28336, 28365, 28326, 28367, 28338,
- 28350, 28355, 28380, 28376, 28313, 28306, 28302, 28301, 28324, 28321,
- 28351, 28339, 28368, 28362, 28311, 28334, 28323, 28999, 29012, 29010,
- 29027, 29024, 28993, 29021, [29026, 61080], 29042, 29048, 29034, 29025,
- 28994, 29016, 28995, 29003, 29040, 29023, 29008, 29011, 28996, 29005,
- 29018, 29263, 29325, 29324, 29329, 29328, 29326, 29500, 29506, 29499,
- 29498, 29504, 29514, 29513, 29764, {f: 2, c: 29770}, 29778, 29777, 29783,
- 29760, {f: 2, c: 29775}, 29774, 29762, 29766, 29773, 29780, 29921, 29951,
- 29950, 29949, 29981, 30073, 30071, 27011, 30191, 30223, 30211, 30199,
- 30206, 30204, [30201, 60782], 30200, 30224, 30203, 30198, 30189, 30197,
- 30205, 30361, 30389, 30429, 30549, {f: 2, c: 30559}, 30546, 30550, 30554,
- 30569, 30567, 30548, 30553, 30573, 30688, 30855, 30874, 30868, 30863,
- 30852, 30869, {f: 2, c: 30853}, 30881, 30851, 30841, 30873, 30848, 30870,
- 30843, 31100, 31106, 31101, 31097, 31249, {f: 2, c: 31256}, 31250, 31255,
- 31253, 31266, 31251, 31259, 31248, 31395, 31394, 31390, 31467, 31590,
- 31588, 31597, 31604, 31593, 31602, 31589, 31603, 31601, 31600, 31585,
- 31608, 31606, 31587, 31922, 31924, 31919, 32136, 32134, 32128, 32141,
- 32127, 32133, 32122, 32142, 32123, 32131, 32124, 32140, 32148, 32132,
- 32125, 32146, 32621, 32619, {f: 2, c: 32615}, 32620, 32678, 32677, 32679,
- {f: 2, c: 32731}, 32801, 33124, 33120, 33143, 33116, 33129, 33115, 33122,
- 33138, 26401, 33118, 33142, 33127, 33135, 33092, 33121, 33309, 33353,
- 33348, 33344, 33346, 33349, 34033, 33855, 33878, 33910, 33913, 33935,
- 33933, 33893, 33873, 33856, 33926, 33895, 33840, 33869, 33917, 33882,
- 33881, 33908, 33907, 33885, 34055, 33886, 33847, 33850, 33844, 33914,
- 33859, 33912, 33842, 33861, 33833, 33753, 33867, 33839, 33858, 33837,
- 33887, 33904, 33849, 33870, 33868, 33874, 33903, 33989, 33934, 33851,
- 33863, 33846, 33843, 33896, 33918, 33860, 33835, 33888, 33876, 33902,
- 33872, 34571, 34564, 34551, 34572, 34554, 34518, 34549, 34637, 34552,
- 34574, 34569, 34561, 34550, 34573, 34565, 35030, 35019, {f: 2, c: 35021},
- 35038, 35035, 35034, 35020, 35024, 35205, 35227, 35295, 35301, 35300,
- 35297, 35296, 35298, 35292, 35302, 35446, 35462, 35455, 35425, 35391,
- 35447, 35458, 35460, 35445, 35459, 35457, 35444, 35450, 35900, 35915,
- 35914, 35941, 35940, 35942, 35974, {f: 2, c: 35972}, 36044,
- {f: 2, c: 36200}, 36241, 36236, {f: 2, c: 36238}, 36237, {f: 2, c: 36243},
- 36240, 36242, 36336, 36320, 36332, 36337, 36334, 36304, 36329, 36323,
- 36322, 36327, 36338, 36331, 36340, 36614, 36607, 36609, 36608, 36613,
- {f: 2, c: 36615}, 36610, [36619, 60507], 36946, 36927, 36932, 36937, 36925,
- 37136, 37133, 37135, 37137, 37142, 37140, 37131, 37134, {f: 2, c: 37230},
- 37448, 37458, 37424, 37434, 37478, 37427, 37477, 37470, 37507, 37422,
- 37450, 37446, 37485, 37484, 37455, 37472, 37479, 37487, 37430, 37473,
- 37488, 37425, 37460, 37475, 37456, 37490, 37454, 37459, 37452, 37462,
- 37426, 38303, 38300, 38302, 38299, {f: 2, c: 38546}, 38545, 38551, 38606,
- 38650, 38653, 38648, 38645, 38771, {f: 2, c: 38775}, 38770, 38927,
- {f: 2, c: 38925}, 39084, 39158, 39161, 39343, 39346, 39344, 39349, 39597,
- 39595, 39771, 40170, 40173, 40167, 40576, [12236, 40701], 20710, 20692,
- 20695, 20712, 20723, 20699, 20714, 20701, 20708, 20691, 20716, 20720,
- 20719, 20707, 20704, 20952, {f: 2, c: 21120}, 21225, 21227, 21296, 21420,
- 22055, 22037, 22028, 22034, 22012, 22031, 22044, 22017, 22035, 22018,
- 22010, 22045, 22020, 22015, 22009, 22665, 22652, 22672, 22680, 22662,
- 22657, 22655, 22644, 22667, 22650, 22663, 22673, 22670, 22646, 22658,
- 22664, 22651, 22676, 22671, 22782, 22891, 23260, 23278, 23269, 23253,
- 23274, 23258, 23277, 23275, 23283, 23266, 23264, 23259, 23276, 23262,
- 23261, 23257, 23272, 23263, 23415, 23520, 23523, 23651, 23938, 23936,
- 23933, 23942, 23930, 23937, 23927, 23946, 23945, 23944, 23934, 23932,
- 23949, 23929, 23935, {f: 2, c: 24152}, 24147, 24280, 24273, 24279, 24270,
- 24284, 24277, 24281, 24274, 24276, 24388, 24387, 24431, 24502, 24876,
- 24872, 24897, 24926, 24945, 24947, {f: 2, c: 24914}, 24946, 24940, 24960,
- 24948, 24916, 24954, 24923, 24933, 24891, 24938, 24929, 24918, 25129,
- 25127, 25131, 25643, 25677, 25691, 25693, 25716, 25718, {f: 2, c: 25714},
- 25725, 25717, 25702, 25766, 25678, 25730, 25694, 25692, 25675, 25683,
- 25696, 25680, 25727, 25663, 25708, 25707, 25689, 25701, 25719, 25971,
- 26016, 26273, 26272, 26271, 26373, 26372, 26402, 27057, 27062, 27081,
- 27040, 27086, 27030, 27056, 27052, 27068, 27025, 27033, 27022, 27047,
- 27021, 27049, 27070, 27055, 27071, 27076, 27069, 27044, 27092, 27065,
- 27082, 27034, 27087, 27059, 27027, 27050, 27041, 27038, 27097, 27031,
- 27024, 27074, 27061, 27045, 27078, 27466, 27469, 27467, {f: 3, c: 27550},
- {f: 2, c: 27587}, 27646, 28366, 28405, 28401, 28419, 28453, 28408, 28471,
- 28411, 28462, 28425, 28494, {f: 2, c: 28441}, 28455, 28440, 28475, 28434,
- 28397, 28426, 28470, 28531, 28409, 28398, 28461, 28480, 28464, 28476,
- 28469, 28395, 28423, 28430, 28483, 28421, 28413, 28406, 28473, 28444,
- 28412, 28474, 28447, 28429, 28446, 28424, 28449, 29063, 29072, 29065,
- 29056, 29061, 29058, 29071, 29051, 29062, 29057, 29079, 29252, 29267,
- 29335, 29333, 29331, 29507, 29517, 29521, 29516, 29794, 29811, 29809,
- 29813, 29810, 29799, 29806, 29952, {f: 2, c: 29954}, 30077, 30096, 30230,
- 30216, 30220, 30229, 30225, 30218, 30228, 30392, 30593, 30588, 30597,
- 30594, 30574, 30592, 30575, 30590, 30595, 30898, 30890, 30900, 30893,
- 30888, 30846, 30891, 30878, 30885, 30880, 30892, 30882, 30884, 31128,
- {f: 2, c: 31114}, 31126, 31125, 31124, 31123, 31127, 31112, 31122, 31120,
- 31275, 31306, 31280, 31279, 31272, 31270, 31400, {f: 2, c: 31403}, 31470,
- 31624, 31644, 31626, 31633, 31632, 31638, 31629, 31628, 31643, 31630,
- 31621, 31640, 21124, 31641, 31652, 31618, 31931, 31935, 31932, 31930,
- 32167, 32183, 32194, 32163, 32170, 32193, 32192, 32197, 32157, 32206,
- 32196, 32198, {f: 2, c: 32203}, 32175, 32185, 32150, 32188, 32159, 32166,
- 32174, 32169, 32161, 32201, 32627, {f: 2, c: 32738}, 32741, 32734, 32804,
- 32861, 32860, 33161, 33158, 33155, 33159, 33165, 33164, 33163, 33301,
- 33943, 33956, 33953, 33951, 33978, 33998, 33986, 33964, 33966, 33963,
- 33977, 33972, 33985, 33997, 33962, 33946, 33969, 34000, 33949, 33959,
- 33979, 33954, 33940, 33991, 33996, 33947, 33961, 33967, [33960, 58327],
- 34006, 33944, 33974, 33999, 33952, 34007, 34004, 34002, 34011, 33968,
- 33937, 34401, 34611, 34595, 34600, 34667, 34624, 34606, 34590, 34593,
- 34585, 34587, 34627, 34604, 34625, 34622, 34630, 34592, 34610, 34602,
- 34605, 34620, 34578, 34618, 34609, 34613, 34626, {f: 2, c: 34598}, 34616,
- 34596, 34586, 34608, 34577, 35063, 35047, {f: 2, c: 35057}, 35066, 35070,
- 35054, 35068, 35062, 35067, 35056, 35052, 35051, 35229, 35233, 35231,
- 35230, 35305, 35307, 35304, 35499, 35481, 35467, 35474, 35471, 35478,
- 35901, {f: 2, c: 35944}, 36053, 36047, 36055, 36246, 36361, 36354, 36351,
- 36365, 36349, 36362, 36355, 36359, 36358, 36357, 36350, 36352, 36356,
- {f: 2, c: 36624}, 36622, 36621, 37155, 37148, 37152, 37154, 37151, 37149,
- 37146, 37156, 37153, 37147, 37242, 37234, 37241, 37235, 37541, 37540,
- 37494, 37531, 37498, 37536, 37524, 37546, 37517, 37542, 37530, 37547,
- 37497, 37527, 37503, 37539, 37614, 37518, 37506, 37525, 37538, 37501,
- 37512, 37537, 37514, 37510, 37516, 37529, 37543, 37502, 37511, 37545,
- 37533, 37515, 37421, 38558, 38561, 38655, 38744, 38781, 38778, 38782,
- 38787, 38784, 38786, 38779, 38788, 38785, 38783, 38862, 38861, 38934,
- {f: 2, c: 39085}, 39170, 39168, 39175, 39325, 39324, 39363, 39353, 39355,
- 39354, 39362, 39357, 39367, 39601, 39651, 39655, {f: 2, c: 39742},
- {f: 2, c: 39776}, 39775, {f: 2, c: 40177}, 40181, 40615, 20735, 20739,
- 20784, 20728, {f: 2, c: 20742}, 20726, 20734, {f: 2, c: 20747}, 20733,
- 20746, {f: 2, c: 21131}, 21233, 21231, 22088, 22082, 22092, 22069, 22081,
- 22090, 22089, 22086, 22104, 22106, 22080, 22067, 22077, 22060, 22078,
- 22072, 22058, 22074, 22298, 22699, 22685, 22705, 22688, 22691, 22703,
- 22700, 22693, 22689, 22783, 23295, 23284, 23293, 23287, 23286, 23299,
- 23288, 23298, 23289, 23297, 23303, 23301, 23311, 23655, 23961, 23959,
- 23967, 23954, 23970, 23955, 23957, 23968, 23964, 23969, 23962, 23966,
- 24169, 24157, 24160, 24156, 32243, 24283, 24286, 24289, 24393, 24498,
- 24971, 24963, 24953, 25009, 25008, 24994, 24969, 24987, 24979, 25007,
- 25005, 24991, 24978, 25002, 24993, 24973, 24934, 25011, 25133, 25710,
- 25712, 25750, 25760, 25733, 25751, 25756, 25743, 25739, 25738, 25740,
- 25763, 25759, 25704, 25777, 25752, 25974, 25978, 25977, 25979,
- {f: 2, c: 26034}, 26293, 26288, 26281, 26290, 26295, 26282, 26287, 27136,
- 27142, 27159, 27109, 27128, 27157, 27121, 27108, 27168, 27135, 27116,
- 27106, 27163, 27165, 27134, 27175, 27122, 27118, 27156, 27127, 27111,
- 27200, 27144, 27110, 27131, 27149, 27132, 27115, 27145, 27140, 27160,
- 27173, 27151, 27126, 27174, 27143, 27124, 27158, 27473, 27557, 27555,
- 27554, 27558, 27649, 27648, 27647, 27650, 28481, 28454, 28542, 28551,
- 28614, 28562, 28557, 28553, 28556, 28514, 28495, 28549, 28506, 28566,
- 28534, 28524, 28546, 28501, 28530, 28498, 28496, 28503, 28564, 28563,
- 28509, 28416, 28513, 28523, 28541, 28519, 28560, 28499, 28555, 28521,
- 28543, 28565, 28515, 28535, 28522, 28539, 29106, 29103, 29083, 29104,
- 29088, 29082, 29097, 29109, 29085, 29093, 29086, 29092, 29089, 29098,
- 29084, 29095, 29107, 29336, 29338, 29528, 29522, {f: 3, c: 29534}, 29533,
- 29531, 29537, 29530, 29529, 29538, 29831, {f: 2, c: 29833}, 29830, 29825,
- 29821, 29829, 29832, 29820, [29817, 58868], 29960, 29959, 30078, 30245,
- 30238, 30233, 30237, 30236, 30243, 30234, 30248, 30235, {f: 3, c: 30364},
- 30363, 30605, 30607, 30601, 30600, 30925, 30907, 30927, 30924, 30929,
- 30926, 30932, 30920, {f: 2, c: 30915}, 30921, 31130, 31137, 31136, 31132,
- 31138, [31131, 59175], 27510, 31289, 31410, 31412, 31411, 31671, 31691,
- 31678, 31660, 31694, 31663, 31673, 31690, 31669, 31941, 31944, 31948,
- 31947, 32247, 32219, 32234, 32231, 32215, 32225, 32259, 32250, 32230,
- 32246, 32241, 32240, 32238, 32223, 32630, 32684, 32688, 32685, 32749,
- 32747, 32746, 32748, 32742, 32744, 32868, 32871, 33187, 33183, 33182,
- 33173, 33186, 33177, 33175, 33302, 33359, 33363, 33362, 33360, 33358,
- 33361, 34084, 34107, 34063, 34048, 34089, 34062, 34057, 34061, 34079,
- 34058, 34087, 34076, 34043, 34091, 34042, 34056, 34060, 34036, 34090,
- 34034, 34069, 34039, 34027, 34035, 34044, 34066, 34026, 34025, 34070,
- 34046, 34088, 34077, 34094, 34050, 34045, 34078, 34038, 34097, 34086,
- {f: 2, c: 34023}, 34032, 34031, 34041, 34072, 34080, 34096, 34059, 34073,
- 34095, 34402, 34646, {f: 2, c: 34659}, 34679, 34785, 34675, 34648, 34644,
- 34651, 34642, 34657, 34650, 34641, 34654, 34669, 34666, 34640, 34638,
- 34655, 34653, 34671, 34668, 34682, 34670, 34652, 34661, 34639, 34683,
- 34677, 34658, 34663, 34665, 34906, 35077, 35084, 35092, 35083,
- {f: 3, c: 35095}, 35078, 35094, 35089, 35086, 35081, 35234, 35236, 35235,
- 35309, 35312, 35308, 35535, 35526, 35512, 35539, 35537, {f: 2, c: 35540},
- 35515, 35543, 35518, 35520, 35525, 35544, 35523, 35514, 35517, 35545,
- 35902, 35917, 35983, 36069, 36063, 36057, 36072, 36058, 36061, 36071,
- 36256, 36252, 36257, 36251, 36384, 36387, 36389, 36388, 36398, 36373,
- 36379, 36374, 36369, 36377, {f: 2, c: 36390}, 36372, 36370, 36376, 36371,
- 36380, 36375, 36378, 36652, 36644, 36632, 36634, 36640, 36643,
- {f: 2, c: 36630}, 36979, 36976, 36975, 36967, 36971, 37167, 37163,
- {f: 2, c: 37161}, 37170, 37158, 37166, {f: 2, c: 37253}, 37258,
- {f: 2, c: 37249}, 37252, 37248, 37584, {f: 2, c: 37571}, 37568, 37593,
- 37558, 37583, 37617, 37599, 37592, 37609, 37591, 37597, 37580, 37615,
- 37570, 37608, 37578, 37576, 37582, 37606, 37581, 37589, 37577, 37600,
- 37598, 37607, 37585, 37587, 37557, 37601, 37669, 37574, 37556, 38268,
- 38316, 38315, 38318, 38320, 38564, 38562, 38611, 38661, 38664, 38658,
- 38746, 38794, 38798, 38792, 38864, 38863, 38942, 38941, 38950, 38953,
- 38952, 38944, 38939, 38951, 39090, 39176, 39162, 39185, 39188,
- {f: 2, c: 39190}, 39189, 39388, 39373, 39375, {f: 2, c: 39379}, 39374,
- 39369, [39382, 60270], 39384, 39371, 39383, 39372, 39603, 39660, 39659,
- 39667, 39666, 39665, 39750, 39747, 39783, 39796, 39793, 39782, 39798,
- 39797, 39792, 39784, 39780, 39788, 40188, 40186, 40189, 40191, 40183,
- 40199, 40192, 40185, 40187, 40200, 40197, 40196, 40579, 40659,
- {f: 2, c: 40719}, 20764, 20755, 20759, 20762, 20753, 20958, 21300, 21473,
- 22128, 22112, 22126, 22131, 22118, 22115, 22125, 22130, 22110, 22135,
- 22300, 22299, 22728, 22717, 22729, 22719, 22714, 22722, 22716, 22726,
- 23319, 23321, 23323, 23329, 23316, 23315, 23312, 23318, [23336, 59539],
- 23322, 23328, 23326, 23535, 23980, 23985, 23977, 23975, 23989, 23984,
- 23982, 23978, 23976, 23986, 23981, 23983, 23988, {f: 2, c: 24167}, 24166,
- 24175, 24297, 24295, 24294, 24296, 24293, 24395, 24508, 24507, 24989,
- 25000, 24982, 25029, 25012, 25030, 25025, 25036, 25018, 25023, 25016,
- 24972, 25815, 25814, 25808, 25807, 25801, 25789, 25737, 25795, 25819,
- 25843, 25817, 25907, 25983, 25980, 26018, 26312, 26302, 26304,
- {f: 2, c: 26314}, 26319, 26301, 26299, 26298, 26316, 26403, 27188, 27238,
- 27209, 27239, 27186, 27240, 27198, 27229, 27245, 27254, 27227, 27217,
- 27176, 27226, 27195, 27199, 27201, 27242, 27236, 27216, 27215, 27220,
- 27247, 27241, 27232, 27196, 27230, 27222, 27221, {f: 2, c: 27213}, 27206,
- 27477, 27476, 27478, 27559, {f: 2, c: 27562}, 27592, 27591, 27652, 27651,
- 27654, 28589, 28619, 28579, 28615, 28604, 28622, 28616, 28510, 28612,
- 28605, 28574, 28618, 28584, 28676, 28581, 28590, 28602, 28588, 28586,
- 28623, 28607, 28600, 28578, 28617, 28587, 28621, 28591, 28594, 28592,
- 29125, 29122, 29119, 29112, 29142, {f: 2, c: 29120}, 29131, 29140, 29130,
- 29127, 29135, 29117, 29144, 29116, 29126, {f: 2, c: 29146},
- {f: 2, c: 29341}, 29545, {f: 2, c: 29542}, 29548, 29541, 29547, 29546,
- 29823, 29850, 29856, 29844, 29842, 29845, 29857, 29963, 30080, 30255,
- 30253, 30257, 30269, 30259, 30268, 30261, 30258, 30256, 30395, 30438,
- 30618, 30621, 30625, 30620, 30619, {f: 2, c: 30626}, 30613, 30617, 30615,
- 30941, 30953, 30949, 30954, 30942, 30947, 30939, {f: 2, c: 30945}, 30957,
- {f: 2, c: 30943}, 31140, 31300, 31304, 31303, 31414, 31416, 31413, 31409,
- 31415, 31710, 31715, 31719, 31709, 31701, 31717, 31706, 31720, 31737,
- 31700, 31722, 31714, 31708, 31723, 31704, 31711, 31954, 31956, 31959,
- {f: 2, c: 31952}, 32274, 32289, 32279, 32268, {f: 2, c: 32287}, 32275,
- 32270, 32284, 32277, 32282, 32290, 32267, 32271, 32278, 32269, 32276,
- 32293, 32292, 32579, {f: 2, c: 32635}, 32634, 32689, 32751, 32810, 32809,
- 32876, 33201, 33190, 33198, 33209, 33205, 33195, 33200, 33196, 33204,
- 33202, 33207, 33191, 33266, {f: 3, c: 33365}, 34134, 34117, 34155, 34125,
- 34131, 34145, 34136, 34112, 34118, 34148, 34113, 34146, 34116, 34129,
- 34119, 34147, 34110, 34139, 34161, 34126, 34158, 34165, 34133, 34151,
- 34144, 34188, 34150, 34141, 34132, 34149, 34156, 34403, 34405, 34404,
- 34724, 34715, 34703, 34711, 34707, 34706, 34696, 34689, 34710, 34712,
- 34681, 34695, 34723, 34693, {f: 2, c: 34704}, 34717, 34692, 34708, 34716,
- 34714, 34697, 35102, 35110, 35120, {f: 2, c: 35117}, 35111, 35121, 35106,
- 35113, 35107, 35119, 35116, 35103, 35313, 35552, 35554, 35570,
- {f: 2, c: 35572}, 35549, 35604, 35556, 35551, 35568, 35528, 35550, 35553,
- 35560, 35583, 35567, 35579, {f: 2, c: 35985}, 35984, 36085, 36078, 36081,
- 36080, 36083, 36204, 36206, 36261, 36263, 36403, 36414, 36408, 36416,
- 36421, 36406, {f: 2, c: 36412}, 36417, 36400, 36415, 36541, [36662, 60329],
- 36654, 36661, 36658, 36665, 36663, 36660, 36982, 36985, 36987, 36998,
- 37114, 37171, {f: 2, c: 37173}, 37267, {f: 2, c: 37264}, 37261, 37263,
- 37671, 37662, 37640, 37663, 37638, 37647, 37754, 37688, 37692, 37659,
- 37667, 37650, 37633, 37702, 37677, 37646, 37645, 37579, 37661, 37626,
- 37651, 37625, 37623, 37684, 37634, 37668, 37631, 37673, 37689, 37685,
- 37674, 37652, 37644, 37643, 37630, 37641, 37632, 37627, 37654, 38332,
- 38349, 38334, {f: 2, c: 38329}, 38326, 38335, 38325, 38333, 38569, 38612,
- 38667, 38674, 38672, 38809, 38807, 38804, 38896, 38904, 38965, 38959,
- 38962, 39204, 39199, 39207, 39209, 39326, 39406, 39404, 39397, 39396,
- 39408, 39395, 39402, 39401, 39399, 39609, 39615, 39604, 39611, 39670,
- 39674, 39673, 39671, 39731, 39808, 39813, 39815, 39804, 39806, 39803,
- 39810, 39827, 39826, 39824, 39802, 39829, 39805, 39816, 40229, 40215,
- 40224, 40222, 40212, 40233, 40221, 40216, 40226, 40208, 40217, 40223,
- 40584, {f: 2, c: 40582}, 40622, 40621, {f: 2, c: 40661}, 40698, 40722,
- 40765, 20774, 20773, 20770, 20772, 20768, 20777, 21236, 22163,
- {f: 2, c: 22156}, 22150, 22148, 22147, 22142, 22146, 22143, 22145, 22742,
- 22740, 22735, 22738, 23341, 23333, 23346, 23331, 23340, 23335, 23334,
- 23343, 23342, 23419, {f: 2, c: 23537}, 23991, 24172, 24170, 24510, 25027,
- 25013, 25020, 25063, 25056, 25061, 25060, 25064, 25054, 25839, 25833,
- 25827, 25835, 25828, 25832, 25985, 25984, 26038, 26074, 26322, 27277,
- 27286, 27265, 27301, 27273, 27295, 27291, 27297, 27294, 27271, 27283,
- 27278, 27285, 27267, 27304, 27300, 27281, 27263, 27302, 27290, 27269,
- 27276, 27282, 27483, 27565, 27657, 28620, 28585, 28660, 28628, 28643,
- 28636, 28653, 28647, 28646, 28638, 28658, 28637, 28642, 28648, 29153,
- 29169, 29160, 29170, 29156, 29168, 29154, 29555, {f: 2, c: 29550}, 29847,
- 29874, 29867, 29840, 29866, 29869, 29873, 29861, 29871, {f: 3, c: 29968},
- 29967, 30084, 30275, {f: 2, c: 30280}, 30279, 30372, 30441, 30645, 30635,
- 30642, 30647, 30646, 30644, 30641, 30632, 30704, 30963, 30973, 30978,
- {f: 2, c: 30971}, 30975, 30962, 30981, 30969, 30974, 30980, 31147, 31144,
- 31324, 31323, 31318, 31320, 31316, 31322, 31422, {f: 2, c: 31424}, 31749,
- 31759, 31730, 31744, 31743, 31739, 31758, 31732, 31755, 31731, 31746,
- 31753, 31747, 31745, 31736, 31741, [31750, 58176], {f: 2, c: 31728}, 31760,
- 31754, 31976, 32301, 32316, 32322, 32307, 38984, 32312, 32298, 32329,
- 32320, 32327, 32297, 32332, 32304, 32315, 32310, 32324, 32314, 32581,
- 32639, 32638, 32637, 32756, 32754, 32812, 33211, 33220, 33228, 33226,
- 33221, 33223, 33212, 33257, 33371, 33370, 33372, 34179, 34176, 34191,
- 34215, 34197, 34208, 34187, 34211, 34171, 34212, 34202, 34206, 34167,
- 34172, 34185, 34209, 34170, 34168, 34135, 34190, 34198, 34182, 34189,
- 34201, 34205, 34177, 34210, 34178, 34184, 34181, 34169, 34166, 34200,
- 34192, 34207, 34408, 34750, 34730, 34733, 34757, 34736, 34732, 34745,
- 34741, 34748, 34734, 34761, 34755, 34754, 34764, 34743, 34735, 34756,
- 34762, 34740, 34742, 34751, 34744, 34749, 34782, 34738, 35125, 35123,
- 35132, 35134, 35137, 35154, 35127, 35138, 35245, 35247, 35246,
- {f: 2, c: 35314}, 35614, 35608, 35606, 35601, 35589, 35595, 35618, 35599,
- 35602, 35605, 35591, 35597, 35592, 35590, 35612, 35603, 35610, 35919,
- 35952, 35954, 35953, 35951, 35989, 35988, 36089, 36207, 36430, 36429,
- 36435, 36432, 36428, 36423, 36675, 36672, 36997, 36990, 37176, 37274,
- 37282, 37275, 37273, 37279, 37281, 37277, 37280, 37793, 37763, 37807,
- 37732, 37718, 37703, 37756, 37720, 37724, 37750, 37705, {f: 2, c: 37712},
- 37728, 37741, 37775, 37708, 37738, 37753, 37719, 37717, 37714, 37711,
- 37745, 37751, 37755, 37729, 37726, 37731, 37735, 37710, 37721, 38343,
- 38336, 38345, 38339, 38341, 38327, 38574, 38576, 38572, 38688, 38687,
- 38680, 38685, 38681, 38810, 38817, 38812, 38814, 38813, 38869, 38868,
- 38897, 38977, 38980, 38986, 38985, 38981, 38979, 39205, {f: 2, c: 39211},
- 39210, 39219, 39218, 39215, 39213, 39217, 39216, 39320, 39331, 39329,
- 39426, 39418, 39412, 39415, 39417, 39416, 39414, 39419, {f: 2, c: 39421},
- 39420, 39427, 39614, 39678, 39677, 39681, 39676, 39752, 39834, 39848,
- 39838, 39835, 39846, 39841, 39845, 39844, 39814, 39842, 39840, 39855,
- 40243, 40257, 40295, 40246, {f: 2, c: 40238}, 40241, 40248, 40240, 40261,
- {f: 2, c: 40258}, 40254, 40247, 40256, 40253, 32757, 40237, 40586, 40585,
- 40589, 40624, 40648, 40666, 40699, 40703, 40740, 40739, 40738, 40788,
- [12245, 40864], 20785, {f: 2, c: 20781}, 22168, 22172, 22167, 22170, 22173,
- 22169, 22896, 23356, {f: 2, c: 23657}, 24000, {f: 2, c: 24173}, 25048,
- 25055, {f: 2, c: 25069}, 25073, 25066, 25072, 25067, 25046, 25065, 25855,
- 25860, 25853, 25848, 25857, 25859, 25852, 26004, 26075, {f: 2, c: 26330},
- 26328, 27333, 27321, 27325, 27361, 27334, 27322, {f: 2, c: 27318}, 27335,
- 27316, 27309, 27486, 27593, 27659, 28679, {f: 2, c: 28684}, 28673, 28677,
- 28692, 28686, {f: 2, c: 28671}, 28667, 28710, 28668, 28663, 28682,
- [29185, 60224], 29183, 29177, 29187, 29181, 29558, 29880, 29888, 29877,
- 29889, 29886, 29878, 29883, 29890, 29972, 29971, 30300, 30308, 30297,
- 30288, 30291, 30295, 30298, 30374, 30397, 30444, 30658, 30650, 30988,
- {f: 2, c: 30995}, 30985, 30992, 30994, 30993, 31149, 31148, 31327, 31772,
- 31785, 31769, 31776, 31775, 31789, 31773, 31782, 31784, 31778, 31781,
- 31792, 32348, 32336, 32342, 32355, 32344, 32354, 32351, 32337, 32352,
- 32343, 32339, 32693, 32691, {f: 2, c: 32759}, 32885, {f: 2, c: 33233},
- 33232, 33375, 33374, 34228, 34246, 34240, 34243, 34242, 34227, 34229,
- 34237, 34247, 34244, 34239, 34251, 34254, 34248, 34245, 34225, 34230,
- 34258, 34340, 34232, 34231, 34238, 34409, 34791, 34790, 34786, 34779,
- 34795, 34794, 34789, 34783, 34803, 34788, 34772, 34780, 34771, 34797,
- 34776, 34787, 34775, 34777, 34817, 34804, 34792, 34781, 35155, 35147,
- 35151, 35148, 35142, {f: 2, c: 35152}, 35145, 35626, 35623, 35619, 35635,
- 35632, 35637, 35655, 35631, 35644, 35646, 35633, 35621, 35639, 35622,
- 35638, 35630, 35620, 35643, 35645, 35642, 35906, 35957, 35993, 35992,
- 35991, 36094, 36100, 36098, 36096, 36444, 36450, 36448, 36439, 36438,
- 36446, 36453, 36455, 36443, 36442, 36449, 36445, 36457, 36436,
- {f: 3, c: 36678}, 36683, 37160, {f: 2, c: 37178}, 37182, 37288, 37285,
- 37287, 37295, 37290, 37813, 37772, 37778, 37815, 37787, 37789, 37769,
- 37799, 37774, 37802, 37790, 37798, 37781, 37768, 37785, 37791, 37760,
- 37773, 37809, 37777, 37810, 37796, 37800, 37812, 37795, {f: 2, c: 38354},
- 38353, 38579, 38615, 38618, 24002, 38623, 38616, 38621, 38691, 38690,
- 38693, 38828, 38830, 38824, 38827, 38820, 38826, 38818, 38821, 38871,
- 38873, 38870, 38872, 38906, {f: 3, c: 38992}, 39096, 39233, 39228, 39226,
- 39439, 39435, 39433, 39437, 39428, 39441, 39434, 39429, 39431, 39430,
- 39616, 39644, 39688, {f: 2, c: 39684}, 39721, 39733, 39754, 39756, 39755,
- 39879, 39878, 39875, 39871, 39873, 39861, 39864, 39891, 39862, 39876,
- 39865, 39869, 40284, 40275, 40271, 40266, 40283, 40267, 40281, 40278,
- 40268, 40279, 40274, 40276, 40287, 40280, 40282, 40590, 40588, 40671,
- 40705, 40704, [40726, 58693], 40741, 40747, 40746, 40745, 40744, 40780,
- 40789, {f: 2, c: 20788}, 21142, 21239, 21428, 22187, 22189,
- {f: 2, c: 22182}, 22186, 22188, 22746, 22749, 22747, 22802,
- {f: 3, c: 23357}, 24003, 24176, 24511, 25083, 25863, 25872, 25869, 25865,
- 25868, 25870, 25988, 26078, 26077, 26334, 27367, 27360, 27340, 27345,
- 27353, 27339, 27359, 27356, 27344, 27371, 27343, 27341, 27358, 27488,
- 27568, 27660, 28697, 28711, 28704, 28694, 28715, {f: 3, c: 28705}, 28713,
- 28695, 28708, 28700, 29196, 29194, 29191, 29186, 29189, {f: 2, c: 29349},
- 29348, 29347, 29345, 29899, 29893, 29879, 29891, 29974, 30304,
- {f: 2, c: 30665}, 30660, 30705, 31005, 31003, 31009, 31004, 30999, 31006,
- 31152, {f: 2, c: 31335}, 31795, 31804, 31801, 31788, 31803, 31980, 31978,
- 32374, 32373, 32376, 32368, 32375, 32367, 32378, 32370, 32372, 32360,
- 32587, 32586, 32643, 32646, 32695, {f: 2, c: 32765}, 32888, 33239, 33237,
- 33291, 33380, 33377, 33379, 34283, 34289, 34285, 34265, 34273, 34280,
- 34266, 34263, 34284, 34290, 34296, 34264, 34271, 34275, 34268, 34257,
- 34288, 34278, 34287, 34270, 34274, 34816, 34810, 34819, {f: 2, c: 34806},
- 34825, 34828, 34827, 34822, 34812, 34824, 34815, 34826, 34818, 35170,
- {f: 2, c: 35162}, 35159, 35169, 35164, 35160, 35165, 35161, 35208, 35255,
- 35254, 35318, 35664, 35656, 35658, 35648, 35667, 35670, 35668, 35659,
- 35669, 35665, 35650, 35666, 35671, 35907, 35959, 35958, 35994,
- {f: 2, c: 36102}, 36105, 36268, 36266, 36269, 36267, 36461, 36472, 36467,
- 36458, 36463, 36475, 36546, 36690, 36689, {f: 2, c: 36687}, 36691, 36788,
- 37184, 37183, 37296, 37293, 37854, 37831, 37839, 37826, 37850, 37840,
- 37881, 37868, 37836, 37849, 37801, 37862, 37834, 37844, 37870, 37859,
- 37845, 37828, 37838, 37824, 37842, 37797, 37863, 38269, {f: 2, c: 38362},
- 38625, 38697, {f: 2, c: 38699}, 38696, 38694, 38835, 38839, 38838,
- {f: 3, c: 38877}, 39004, 39001, 39005, 38999, 39103, 39101, 39099, 39102,
- 39240, 39239, 39235, {f: 2, c: 39334}, 39450, 39445, 39461, 39453, 39460,
- 39451, 39458, 39456, 39463, 39459, 39454, 39452, 39444, 39618, 39691,
- 39690, 39694, 39692, 39735, {f: 2, c: 39914}, 39904, 39902, 39908, 39910,
- 39906, 39920, 39892, 39895, 39916, 39900, 39897, 39909, 39893, 39905,
- 39898, 40311, 40321, 40330, 40324, 40328, 40305, 40320, 40312, 40326,
- {f: 2, c: 40331}, 40317, 40299, {f: 2, c: 40308}, 40304, 40297, 40325,
- 40307, 40315, 40322, 40303, 40313, 40319, 40327, 40296, 40596, 40593,
- 40640, 40700, 40749, {f: 2, c: 40768}, 40781, {f: 3, c: 40790}, 21303,
- 22194, 22197, 22195, 22755, 23365, {f: 2, c: 24006}, {f: 2, c: 24302},
- {f: 2, c: 24512}, 25081, 25879, 25878, 25877, 25875, 26079, 26344,
- {f: 2, c: 26339}, 27379, 27376, 27370, 27368, 27385, 27377,
- {f: 2, c: 27374}, 28732, 28725, 28719, 28727, 28724, 28721, 28738, 28728,
- 28735, 28730, 28729, 28714, 28736, 28731, 28723, 28737, {f: 2, c: 29203},
- 29352, 29565, 29564, 29882, 30379, 30378, 30398, 30445, 30668,
- {f: 2, c: 30670}, 30669, 30706, 31013, 31011, {f: 2, c: 31015}, 31012,
- 31017, 31154, 31342, {f: 2, c: 31340}, 31479, 31817, 31816, 31818, 31815,
- 31813, 31982, 32379, 32382, 32385, 32384, 32698, 32767, 32889, 33243,
- 33241, {f: 2, c: 33384}, 34338, 34303, 34305, 34302, 34331, 34304, 34294,
- 34308, 34313, 34309, 34316, 34301, 34841, {f: 2, c: 34832}, 34839, 34835,
- 34838, 35171, 35174, 35257, 35319, 35680, 35690, 35677, 35688, 35683,
- 35685, 35687, 35693, 36270, 36486, 36488, 36484, 36697, {f: 2, c: 36694},
- 36693, 36696, 36698, 37005, 37187, 37185, 37303, 37301, {f: 2, c: 37298},
- 37899, 37907, 37883, 37920, 37903, 37908, 37886, 37909, 37904, 37928,
- 37913, 37901, 37877, 37888, 37879, 37895, 37902, 37910, 37906, 37882,
- 37897, 37880, 37948, 37898, 37887, 37884, 37900, 37878, 37905, 37894,
- 38366, 38368, 38367, {f: 2, c: 38702}, 38841, 38843, {f: 2, c: 38909},
- 39008, {f: 2, c: 39010}, 39007, {f: 2, c: 39105}, 39248, 39246, 39257,
- 39244, 39243, 39251, 39474, 39476, 39473, 39468, 39466, 39478, 39465,
- 39470, 39480, 39469, 39623, 39626, 39622, 39696, 39698, 39697, 39947,
- 39944, 39927, 39941, 39954, 39928, 40000, 39943, 39950, 39942, 39959,
- 39956, 39945, 40351, 40345, 40356, 40349, 40338, 40344, 40336, 40347,
- 40352, 40340, 40348, 40362, 40343, 40353, 40346, 40354, 40360, 40350,
- 40355, 40383, 40361, 40342, {f: 2, c: 40358}, 40601, 40603, 40602, 40677,
- 40676, 40679, 40678, 40752, 40750, 40795, 40800, 40798, 40797, 40793,
- 40849, 20794, 20793, 21144, 21143, 22211, {f: 2, c: 22205}, 23368, 23367,
- 24011, 24015, 24305, 25085, 25883, 27394, 27388, 27395, 27384, 27392,
- {f: 2, c: 28739}, 28746, {f: 2, c: 28744}, {f: 2, c: 28741}, 29213, 29210,
- 29209, 29566, 29975, 30314, 30672, 31021, 31025, 31023, 31828, 31827,
- 31986, 32394, [32391, 60229], 32392, 32395, 32390, 32397, 32589, 32699,
- 32816, 33245, 34328, 34346, 34342, 34335, 34339, 34332, 34329, 34343,
- 34350, 34337, 34336, 34345, 34334, 34341, 34857, 34845, 34843, 34848,
- 34852, 34844, 34859, 34890, 35181, 35177, 35182, 35179, 35322, 35705,
- 35704, 35653, {f: 2, c: 35706}, 36112, 36116, 36271, 36494, 36492, 36702,
- 36699, 36701, 37190, {f: 2, c: 37188}, 37305, 37951, 37947, 37942, 37929,
- 37949, 37936, 37945, 37930, 37943, 37932, 37952, 37937, 38373, 38372,
- 38371, 38709, 38714, 38847, 38881, 39012, 39113, 39110, 39104, 39256,
- 39254, 39481, 39485, 39494, 39492, 39490, 39489, 39482, 39487, 39629,
- 39701, {f: 2, c: 39703}, 39702, 39738, 39762, 39979, 39965, 39964, 39980,
- 39971, {f: 2, c: 39976}, 39972, 39969, 40375, 40374, 40380, 40385, 40391,
- 40394, 40399, 40382, 40389, 40387, 40379, 40373, 40398, {f: 2, c: 40377},
- 40364, 40392, 40369, 40365, 40396, 40371, 40397, 40370, 40570, 40604,
- 40683, 40686, 40685, 40731, 40728, 40730, 40753, 40782, 40805, 40804,
- 40850, 20153, 22214, 22213, 22219, 22897, {f: 2, c: 23371}, 24021, 24017,
- 24306, 25889, 25888, 25894, 25890, 27403, {f: 2, c: 27400}, 27661,
- {f: 3, c: 28757}, 28754, {f: 2, c: 29214}, 29353, 29567, 29912, 29909,
- 29913, 29911, 30317, 30381, 31029, 31156, {f: 2, c: 31344}, 31831, 31836,
- 31833, 31835, 31834, 31988, 31985, 32401, 32591, 32647, 33246, 33387,
- {f: 2, c: 34356}, 34355, 34348, 34354, 34358, 34860, 34856, 34854, 34858,
- 34853, 35185, 35263, 35262, 35323, 35710, 35716, 35714, 35718, 35717,
- 35711, 36117, 36501, 36500, 36506, 36498, 36496, {f: 2, c: 36502}, 36704,
- 36706, 37191, 37964, 37968, {f: 2, c: 37962}, 37967, 37959, 37957,
- {f: 2, c: 37960}, 37958, 38719, 38883, 39018, 39017, 39115, 39252, 39259,
- 39502, {f: 2, c: 39507}, 39500, 39503, 39496, 39498, 39497, 39506, 39504,
- 39632, 39705, 39723, 39739, 39766, 39765, 40006, 40008, 39999, 40004,
- 39993, 39987, 40001, 39996, 39991, 39988, 39986, 39997, 39990, 40411,
- 40402, 40414, 40410, 40395, 40400, 40412, 40401, 40415, 40425, 40409,
- 40408, 40406, 40437, 40405, 40413, 40630, 40688, 40757, 40755, 40754,
- 40770, 40811, 40853, 40866, 20797, 21145, 22760, 22759, 22898, 23373,
- 24024, 34863, 24399, 25089, {f: 2, c: 25091}, 25897, 25893, 26006, 26347,
- {f: 2, c: 27409}, 27407, 27594, 28763, 28762, 29218, 29570, 29569, 29571,
- 30320, 30676, 31847, 31846, 32405, 33388, 34362, 34368, 34361, 34364,
- 34353, 34363, 34366, 34864, 34866, 34862, 34867, 35190, 35188, 35187,
- 35326, 35724, 35726, 35723, 35720, 35909, 36121, 36504, 36708, 36707,
- 37308, 37986, 37973, 37981, 37975, 37982, {f: 2, c: 38852}, 38912, 39510,
- 39513, {f: 3, c: 39710}, 40018, 40024, 40016, 40010, 40013, 40011, 40021,
- 40025, 40012, 40014, 40443, 40439, 40431, 40419, 40427, 40440, 40420,
- 40438, 40417, 40430, 40422, 40434, [40432, 60370], 40418, 40428, 40436,
- 40435, 40424, 40429, 40642, 40656, {f: 2, c: 40690}, 40710, 40732, 40760,
- 40759, 40758, 40771, 40783, 40817, 40816, {f: 2, c: 40814}, 22227, 22221,
- 23374, 23661, 25901, {f: 2, c: 26349}, 27411, 28767, 28769, 28765, 28768,
- 29219, 29915, 29925, 30677, 31032, 31159, 31158, 31850, 32407, 32649,
- 33389, 34371, 34872, 34871, 34869, 34891, {f: 2, c: 35732},
- {f: 3, c: 36510}, 36509, 37310, 37309, 37314, 37995, {f: 2, c: 37992},
- 38629, 38726, 38723, 38727, 38855, 38885, 39518, 39637, 39769, 40035,
- 40039, 40038, 40034, 40030, 40032, 40450, 40446, 40455, 40451, 40454,
- 40453, {f: 2, c: 40448}, 40457, 40447, 40445, 40452, 40608, 40734, 40774,
- {f: 3, c: 40820}, 22228, 25902, 26040, {f: 2, c: 27416}, 27415, 27418,
- 28770, 29222, 29354, {f: 2, c: 30680}, 31033, 31849, 31851, 31990, 32410,
- 32408, 32411, 32409, {f: 2, c: 33248}, {f: 3, c: 34374}, {f: 2, c: 35193},
- 35196, 35195, 35327, {f: 2, c: 35736}, 36517, 36516, 36515, 37998, 37997,
- 37999, 38001, 38003, 38729, 39026, 39263, 40040, 40046, 40045, 40459,
- 40461, 40464, 40463, 40466, 40465, 40609, 40693, 40713, 40775, 40824,
- 40827, 40826, 40825, 22302, 28774, 31855, 34876, 36274, 36518, 37315,
- 38004, 38008, 38006, 38005, 39520, [39726, 60830], 40052, 40051, 40049,
- 40053, 40468, 40467, 40694, 40714, 40868, 28776, 28773, 31991, 34410,
- 34878, 34877, 34879, 35742, 35996, 36521, 36553, 38731, {f: 2, c: 39027},
- 39116, 39265, 39339, 39524, {f: 2, c: 39526}, 39716, 40469, 40471, 40776,
- 25095, 27422, 29223, 34380, 36520, 38018, {f: 2, c: 38016}, 39529, 39528,
- 40473, 34379, 35743, 38019, 40057, 40631, 30325, 39531, 40058, 40477,
- {f: 2, c: 28777}, 29225, 40612, 40830, 40777, 40856, {s: 97}, 65075, 0,
- 65076, 65103, [168, 776, 63208], [710, 63209, 65342], [12541, 63210],
- [12542, 63211], [12445, 63212], [12446, 63213], 0, [12293, 63216],
- [12294, 63217], [12295, 63218], [12540, 63219], [63220, 65339],
- [63221, 65341], [10045, 63222], [12353, 63223], [12354, 63224],
- [12355, 63225], [12356, 63226], [12357, 63227], [12358, 63228],
- [12359, 63229], [12360, 63230], [12361, 63231], [12362, 63232],
- [12363, 63233], [12364, 63234], [12365, 63235], [12366, 63236],
- [12367, 63237], [12368, 63238], [12369, 63239], [12370, 63240],
- [12371, 63241], [12372, 63242], [12373, 63243], [12374, 63244],
- [12375, 63245], [12376, 63246], [12377, 63247], [12378, 63248],
- [12379, 63249], [12380, 63250], [12381, 63251], [12382, 63252],
- [12383, 63253], [12384, 63254], [12385, 63255], [12386, 63256],
- [12387, 63257], [12388, 63258], [12389, 63259], [12390, 63260],
- [12391, 63261], [12392, 63262], [12393, 63263], [12394, 63264],
- [12395, 63265], [12396, 63266], [12397, 63267], [12398, 63268],
- [12399, 63269], [12400, 63270], [12401, 63271], [12402, 63272],
- [12403, 63273], [12404, 63274], [12405, 63275], [12406, 63276],
- [12407, 63277], [12408, 63278], [12409, 63279], [12410, 63280],
- [12411, 63281], [12412, 63282], [12413, 63283], [12414, 63284],
- [12415, 63285], [12416, 63286], [12417, 63287], [12418, 63288],
- [12419, 63289], [12420, 63290], [12421, 63291], [12422, 63292],
- [12423, 63293], [12424, 63294], [12425, 63295], [12426, 63296],
- [12427, 63297], [12428, 63298], [12429, 63299], [12430, 63300],
- [12431, 63301], [12432, 63302], [12433, 63303], [12434, 63304],
- [12435, 63305], [12449, 63306], [12450, 63307], [12451, 63308],
- [12452, 63309], [12453, 63310], [12454, 63311], [12455, 63312],
- [12456, 63313], [12457, 63314], [12458, 63315], [12459, 63316],
- [12460, 63317], [12461, 63318], [12462, 63319], [12463, 63320],
- [12464, 63321], [12465, 63322], [12466, 63323], [12467, 63324],
- [12468, 63325], [12469, 63326], [12470, 63327], [12471, 63328],
- [12472, 63329], [12473, 63330], [12474, 63331], [12475, 63332],
- [12476, 63333], [12477, 63334], [12478, 63335], [12479, 63336],
- [12480, 63337], [12481, 63338], [12482, 63339], [12483, 63340],
- [12484, 63341], [12485, 63342], [12486, 63343], [12487, 63344],
- [12488, 63345], [12489, 63346], [12490, 63347], [12491, 63348],
- [12492, 63349], [12493, 63350], [12494, 63351], [12495, 63352],
- [12496, 63353], [12497, 63354], [12498, 63355], [12499, 63356],
- [12500, 63357], [12501, 63358], [12502, 63359], [12503, 63360],
- [12504, 63361], [12505, 63362], [12506, 63363], [12507, 63364],
- [12508, 63365], [12509, 63366], [12510, 63367], [12511, 63368],
- [12512, 63369], [12513, 63370], [12514, 63371], [12515, 63372],
- [12516, 63373], [12517, 63374], [12518, 63375], [12519, 63376],
- [12520, 63377], [12521, 63378], [12522, 63379], [12523, 63380],
- [12524, 63381], [12525, 63382], [12526, 63383], [12527, 63384],
- [12528, 63385], [12529, 63386], [12530, 63387], [12531, 63388],
- [12532, 63389], [12533, 63390], [12534, 63391], [1040, 63392],
- [1041, 63393], [1042, 63394], [1043, 63395], [1044, 63396], [1045, 63397],
- [1025, 63398], [1046, 63399], [1047, 63400], [1048, 63401], [1049, 63402],
- [1050, 63403], [1051, 63404], [1052, 63405], [1053, 63406], [1054, 63407],
- [1055, 63408], [1056, 63409], [1057, 63410], [1058, 63411], [1059, 63412],
- [1060, 63413], [1061, 63414], [1062, 63415], [1063, 63416], [1064, 63417],
- [1065, 63418], [1066, 63419], [1067, 63420], [1068, 63421], [1069, 63422],
- [1070, 63423], [1071, 63424], [1072, 63425], [1073, 63426], [1074, 63427],
- [1075, 63428], [1076, 63429], [1077, 63430], [1105, 63431], [1078, 63432],
- [1079, 63433], [1080, 63434], [1081, 63435], [1082, 63436], [1083, 63437],
- [1084, 63438], [1085, 63439], [1086, 63440], [1087, 63441], [1088, 63442],
- [1089, 63443], [1090, 63444], [1091, 63445], [1092, 63446], [1093, 63447],
- [1094, 63448], [1095, 63449], [1096, 63450], [1097, 63451], [1098, 63452],
- [1099, 63453], [1100, 63454], [1101, 63455], [1102, 63456], [1103, 63457],
- [8679, 63458], [8632, 63459], [8633, 63460], [20033, 63461],
- [63462, 131276], [20058, 63463], [63464, 131210], [20994, 63465],
- [17553, 63466], 63467, [20872, 63468], [13853, 63469], [63470, 161287],
- {s: 40}, [172, 63511, 65506], [63512, 65508], [63513, 65287],
- [63514, 65282], [12849, 63515], [8470, 63516], [8481, 63517], 30849,
- [37561, 58501], 35023, 22715, 24658, 31911, 23290, 9556, 9574, 9559, 9568,
- 9580, 9571, 9562, 9577, 9565, 9554, 9572, 9557, {s: 3}, 9560, 9575, 9563,
- 9555, 9573, 9558, 9567, 9579, 9570, 9561, 9576, 9564, 9553, {s: 5}, 9619,
- {s: 26}, [58129, 147159], [22462, 58130], [58131, 159443], [28990, 58132],
- [58133, 153568], [27042, 58135], [58136, 166889], [23412, 58137],
- [31305, 58138], [58139, 153825], [58140, 169177], [31333, 58141],
- [31357, 58142], [58143, 154028], [31419, 58144], [31408, 58145],
- [31426, 58146], [31427, 58147], [29137, 58148], [58149, 156813],
- [16842, 58150], [31450, 58151], [31453, 58152], [31466, 58153],
- [16879, 58154], [21682, 58155], [58156, 154625], [31499, 58157],
- [31573, 58158], [31529, 58159], [58160, 152334], [58161, 154878],
- [31650, 58162], [31599, 58163], [33692, 58164], [58165, 154548],
- [58166, 158847], [31696, 58167], [33825, 58168], [31634, 58169], 0,
- [58171, 154912], 0, [33938, 58174], [31738, 58175], 0, [31797, 58177],
- [58178, 154817], [31812, 58179], [31875, 58180], [58181, 149634],
- [31910, 58182], [58184, 148856], [31945, 58185], [31943, 58186],
- [31974, 58187], 0, [31987, 58189], [31989, 58190], [32359, 58192],
- [17693, 58193], [58194, 159300], [32093, 58195], [58196, 159446],
- [32137, 58198], [32171, 58199], [28981, 58200], [32179, 58201], 32214,
- [58203, 147543], [58204, 155689], [32228, 58205], [15635, 58206],
- [32245, 58207], [58208, 137209], [32229, 58209], [58210, 164717], 0,
- [58212, 155937], [58213, 155994], [32366, 58214], 0, [17195, 58216],
- [37996, 58217], [32295, 58218], [32576, 58219], [32577, 58220],
- [32583, 58221], [31030, 58222], [58223, 156368], [39393, 58224],
- [32663, 58225], [58226, 156497], [32675, 58227], [58228, 136801],
- [58229, 131176], [17756, 58230], [58231, 145254], [58233, 164666],
- [32762, 58234], [58235, 156809], 0, [32776, 58237], [32797, 58238], 0,
- [32815, 58240], [58241, 172167], [58242, 158915], [32827, 58243],
- [32828, 58244], [32865, 58245], [58246, 141076], [18825, 58247],
- [58248, 157222], [58249, 146915], [58250, 157416], [26405, 58251],
- [32935, 58252], [58253, 166472], [33031, 58254], [33050, 58255],
- [22704, 58256], [58257, 141046], [27775, 58258], [58259, 156824],
- [25831, 58261], [58262, 136330], [33304, 58263], [58264, 137310],
- [27219, 58265], [58266, 150117], [58267, 150165], [17530, 58268],
- [33321, 58269], [58271, 158290], [58272, 146814], [20473, 58273],
- [58274, 136445], [34018, 58275], [33634, 58276], 0, [58278, 149927],
- [58279, 144688], [58280, 137075], [58281, 146936], [33450, 58282],
- [26907, 58283], [58284, 194964], [16859, 58285], [34123, 58286],
- [33488, 58287], [33562, 58288], [58289, 134678], [58290, 137140],
- [14017, 58291], [58292, 143741], [58293, 144730], [33403, 58294],
- [33506, 58295], [33560, 58296], [58297, 147083], [58298, 159139],
- [58299, 158469], [58300, 158615], [58301, 144846], [15807, 58302],
- [33565, 58303], [21996, 58304], [33669, 58305], [17675, 58306],
- [58307, 159141], [33708, 58308], 0, [33747, 58310], [58312, 159444],
- [27223, 58313], [34138, 58314], [13462, 58315], [58316, 159298],
- [33880, 58318], [58319, 154596], [33905, 58320], [15827, 58321],
- [17636, 58322], [27303, 58323], [33866, 58324], [31064, 58326], 0,
- [58328, 158614], [58329, 159351], [58330, 159299], [34014, 58331], 0,
- [33681, 58333], [17568, 58334], [33939, 58335], [34020, 58336],
- [58337, 154769], [16960, 58338], [58339, 154816], [17731, 58340],
- [34100, 58341], [23282, 58342], 0, [17703, 58344], [34163, 58345],
- [17686, 58346], [26559, 58347], [34326, 58348], [58349, 165413],
- [58350, 165435], [34241, 58351], [58352, 159880], [34306, 58353],
- [58354, 136578], [58355, 159949], [58356, 194994], [17770, 58357],
- [34344, 58358], [13896, 58359], [58360, 137378], [21495, 58361],
- [58362, 160666], [34430, 58363], 0, [58365, 172280], [34798, 58366],
- [58367, 142375], [34737, 58368], [34778, 58369], [34831, 58370, 60990],
- [22113, 58371], [34412, 58372], [26710, 58373], [17935, 58374],
- [34885, 58375], [34886, 58376], [58377, 161248], [58378, 146873],
- [58379, 161252], [34910, 58380], [34972, 58381], [18011, 58382],
- [34996, 58383], [34997, 58384], [35013, 58386], [58388, 161551],
- [35207, 58389], {s: 3}, [35239, 58393], [35260, 58394], [58395, 166437],
- [35303, 58396], [58397, 162084], [58398, 162493], [35484, 58399],
- [30611, 58400], [37374, 58401], [35472, 58402], [58403, 162393],
- [31465, 58404], [58405, 162618], [18195, 58407], [58408, 162616],
- [29052, 58409], [35596, 58410], [35615, 58411], [58412, 152624],
- [58413, 152933], [35647, 58414], 0, [35661, 58416], [35497, 58417],
- [58418, 150138], [35728, 58419], [35739, 58420], [35503, 58421],
- [58422, 136927], [17941, 58423], [34895, 58424], [35995, 58425],
- [58426, 163156], [58427, 163215], [58428, 195028], [14117, 58429],
- [58430, 163155], [36054, 58431], [58432, 163224], [58433, 163261],
- [36114, 58434], [36099, 58435], [58436, 137488], [36059, 58437],
- [28764, 58438], [36113, 58439], [16080, 58441], 0, [36265, 58443],
- [58444, 163842], [58445, 135188], [58446, 149898], [15228, 58447],
- [58448, 164284], [58449, 160012], [31463, 58450], [36525, 58451],
- [36534, 58452], [36547, 58453], [37588, 58454], [36633, 58455],
- [36653, 58456], [58457, 164709], [58458, 164882], [36773, 58459],
- [37635, 58460], [58461, 172703], [58462, 133712], [36787, 58463], 0,
- [58465, 166366], [58466, 165181], [58467, 146875], [24312, 58468],
- [58469, 143970], [36857, 58470], 0, [58474, 140069], [14720, 58475],
- [58476, 159447], [36919, 58477], [58478, 165180], [58479, 162494],
- [36961, 58480], [58481, 165228], [58482, 165387], [37032, 58483],
- [58484, 165651], [37060, 58485], [58486, 165606], [37038, 58487], 0,
- [37223, 58489], [37289, 58491], [37316, 58492], [31916, 58493],
- [58494, 166195], [58495, 138889], [37390, 58496], [27807, 58497],
- [37441, 58498], [37474, 58499], [58500, 153017], [58502, 166598],
- [58503, 146587], [58504, 166668], [58505, 153051], [58506, 134449],
- [37676, 58507], [37739, 58508], [58509, 166625], [58510, 166891],
- [23235, 58512], [58513, 166626], [58514, 166629], [18789, 58515],
- [37444, 58516], [58517, 166892], [58518, 166969], [58519, 166911],
- [37747, 58520], [37979, 58521], [36540, 58522], [38277, 58523],
- [38310, 58524], [37926, 58525], [38304, 58526], [28662, 58527],
- [17081, 58528], [58530, 165592], [58531, 135804], [58532, 146990],
- [18911, 58533], [27676, 58534], [38523, 58535], [38550, 58536],
- [16748, 58537], [38563, 58538], [58539, 159445], [25050, 58540], 58541,
- [30965, 58542], [58543, 166624], [38589, 58544], [21452, 58545],
- [18849, 58546], [58547, 158904], [58548, 131700], [58549, 156688],
- [58550, 168111], [58551, 168165], [58552, 150225], [58553, 137493],
- [58554, 144138], [38705, 58555], [34370, 58556], [38710, 58557],
- [18959, 58558], [17725, 58559], [17797, 58560], [58561, 150249],
- [28789, 58562], [23361, 58563], [38683, 58564], 0, [58566, 168405],
- [38743, 58567], [23370, 58568], [58569, 168427], [38751, 58570],
- [37925, 58571], [20688, 58572], [58573, 143543], [58574, 143548],
- [38793, 58575], [38815, 58576], [38833, 58577], [38846, 58578],
- [38848, 58579], [38866, 58580], [38880, 58581], [58582, 152684],
- [38894, 58583], [29724, 58584], [58585, 169011], 0, [38901, 58587],
- [58588, 168989], [58589, 162170], [19153, 58590], [38964, 58591],
- [38963, 58592], [38987, 58593], [39014, 58594], [15118, 58595],
- [58596, 160117], [15697, 58597], [58598, 132656], [58599, 147804],
- [58600, 153350], [39114, 58601], [39095, 58602], [39112, 58603],
- [39111, 58604], [19199, 58605], [58606, 159015], [58607, 136915],
- [21936, 58608], [39137, 58609], [39142, 58610], [39148, 58611],
- [37752, 58612], [39225, 58613], [58614, 150057], [19314, 58615],
- [58616, 170071], [58617, 170245], [39413, 58618], [39436, 58619],
- [39483, 58620], [39440, 58621], [39512, 58622], [58623, 153381],
- [14020, 58624], [58625, 168113], [58626, 170965], [39648, 58627],
- [39650, 58628], [58629, 170757], [39668, 58630], [19470, 58631],
- [39700, 58632], [39725, 58633], [58634, 165376], [20532, 58635],
- [39732, 58636], [14531, 58638], [58639, 143485], [39760, 58640],
- [39744, 58641], [58642, 171326], [23109, 58643], [58644, 137315],
- [39822, 58645], [39938, 58647], [39935, 58648], [39948, 58649],
- [58650, 171624], [40404, 58651], [58652, 171959], [58653, 172434],
- [58654, 172459], [58655, 172257], [58656, 172323], [58657, 172511],
- [40318, 58658], [40323, 58659], [58660, 172340], [40462, 58661],
- [40388, 58663], [58665, 172435], [58666, 172576], [58667, 137531],
- [58668, 172595], [40249, 58669], [58670, 172217], [58671, 172724],
- [40592, 58672], [40597, 58673], [40606, 58674], [40610, 58675],
- [19764, 58676], [40618, 58677], [40623, 58678], [58679, 148324],
- [40641, 58680], [15200, 58681], [14821, 58682], [15645, 58683],
- [20274, 58684], [14270, 58685], [58686, 166955], [40706, 58687],
- [40712, 58688], [19350, 58689], [37924, 58690], [58691, 159138],
- [40727, 58692, 60836], 0, [40761, 58694], [22175, 58695], [22154, 58696],
- [40773, 58697], [39352, 58698], [58699, 168075], [38898, 58700],
- [33919, 58701], 0, [40809, 58703], [31452, 58704], [40846, 58705],
- [29206, 58706], [19390, 58707], [58708, 149877], [58709, 149947],
- [29047, 58710], [58711, 150008], [58712, 148296], [58713, 150097],
- [29598, 58714], [58715, 166874], [58716, 137466], [31135, 58717],
- [58718, 166270], [58719, 167478], [37737, 58720], [37875, 58721],
- [58722, 166468], [37612, 58723], [37761, 58724], [37835, 58725],
- [58726, 166252], [58727, 148665], [29207, 58728], [16107, 58729],
- [30578, 58730], [31299, 58731], [28880, 58732], [58733, 148595],
- [58734, 148472], [29054, 58735], [58736, 137199], [28835, 58737],
- [58738, 137406], [58739, 144793], [16071, 58740], [58741, 137349],
- [58742, 152623], [58743, 137208], [14114, 58744], [58745, 136955],
- [58746, 137273], [14049, 58747], [58748, 137076], [58749, 137425],
- [58750, 155467], [14115, 58751], [58752, 136896], [22363, 58753],
- [58754, 150053], [58755, 136190], [58756, 135848], [58757, 136134],
- [58758, 136374], [34051, 58759, 58761], [58760, 145062], 0, [33877, 58762],
- [58763, 149908], [58764, 160101], [58765, 146993], [58766, 152924],
- [58767, 147195], [58768, 159826], [17652, 58769], [58770, 145134],
- [58771, 170397], [58772, 159526], [26617, 58773], [14131, 58774],
- [15381, 58775], [15847, 58776], [22636, 58777], [58778, 137506],
- [26640, 58779], [16471, 58780], [58781, 145215], [58782, 147681],
- [58783, 147595], [58784, 147727], [58785, 158753], [21707, 58786],
- [22174, 58787], [58788, 157361], [22162, 58789], [58790, 135135],
- [58791, 134056], [58792, 134669], 0, [58794, 166675], [37788, 58795],
- [20216, 58796], [20779, 58797], [14361, 58798], [58799, 148534],
- [20156, 58800], [58801, 132197], 0, [20299, 58803], [20362, 58804],
- [58805, 153169], [23144, 58806], [58807, 131499], [58808, 132043],
- [14745, 58809], [58810, 131850], [58811, 132116], [13365, 58812],
- [20265, 58813], [58814, 131776], [58815, 167603], [58816, 131701],
- [35546, 58817], [58818, 131596], [20120, 58819], [20685, 58820],
- [20749, 58821], [20386, 58822], [20227, 58823], [58824, 150030],
- [58825, 147082], [20290, 58826], [20526, 58827], [20588, 58828],
- [20609, 58829], [20428, 58830], [20453, 58831], [20568, 58832],
- [20732, 58833], [28278, 58838], [58839, 144789], [58840, 147001],
- [58841, 147135], [28018, 58842], [58843, 137348], [58844, 147081],
- [20904, 58845], [20931, 58846], [58847, 132576], [17629, 58848],
- [58849, 132259], [58850, 132242], [58851, 132241], [36218, 58852],
- [58853, 166556], [58854, 132878], [21081, 58855], [21156, 58856],
- [58857, 133235], [21217, 58858], 0, [18042, 58860], [29068, 58861],
- [58862, 148364], [58863, 134176], [58864, 149932], [58865, 135396],
- [27089, 58866], [58867, 134685], 0, [16094, 58869], [29849, 58870],
- [29716, 58871], [29782, 58872], [29592, 58873], [19342, 58874],
- [58875, 150204], [58876, 147597], [21456, 58877], [13700, 58878],
- [29199, 58879], [58880, 147657], [21940, 58881], [58882, 131909],
- [21709, 58883], [58884, 134086], [22301, 58885], [37469, 58886],
- [38644, 58887], [22493, 58889], [22413, 58890], [22399, 58891],
- [13886, 58892], [22731, 58893], [23193, 58894], [58895, 166470],
- [58896, 136954], [58897, 137071], [58898, 136976], [23084, 58899],
- [22968, 58900], [23166, 58902], [23247, 58903], [23058, 58904],
- [58905, 153926], [58906, 137715], [58907, 137313], [58908, 148117],
- [14069, 58909], [27909, 58910], [29763, 58911], [23073, 58912],
- [58913, 155267], [23169, 58914], [58915, 166871], [58916, 132115],
- [37856, 58917], [29836, 58918], [58919, 135939], [28933, 58920],
- [18802, 58921], [37896, 58922], [58923, 166395], [37821, 58924],
- [14240, 58925], [23582, 58926], [23710, 58927], [24158, 58928],
- [24136, 58929], [58930, 137622], [58931, 137596], [58932, 146158],
- [24269, 58933], [23375, 58934], [58935, 137475], [58936, 137476],
- [14081, 58937], [58938, 137376], [14045, 58939], [58940, 136958],
- [14035, 58941], [33066, 58942], [58943, 166471], [58944, 138682],
- [58945, 144498], [58946, 166312], [24332, 58947, 60916], [24334, 58948],
- [58949, 137511], [58950, 137131], [23147, 58951], [58952, 137019],
- [23364, 58953], [58955, 161277], [34912, 58956], [24702, 58957],
- [58958, 141408], [58959, 140843], [24539, 58960], [16056, 58961],
- [58962, 140719], [58963, 140734], [58964, 168072], [58965, 159603],
- [25024, 58966], [58967, 131134], [58968, 131142], [58969, 140827],
- [24985, 58970], [24984, 58971], [24693, 58972], [58973, 142491],
- [58974, 142599], [58975, 149204], [58976, 168269], [25713, 58977],
- [58978, 149093], [58979, 142186], [14889, 58980], [58981, 142114],
- [58982, 144464], [58983, 170218], [58984, 142968], [25399, 58985],
- [25782, 58987], [25393, 58988], [25553, 58989], [58990, 149987],
- [58991, 142695], [25252, 58992], [58993, 142497], [25659, 58994],
- [25963, 58995], [26994, 58996], [15348, 58997], [58998, 143502],
- [58999, 144045], [59000, 149897], [59001, 144043], [21773, 59002],
- [59003, 144096], [59004, 137433], [59005, 169023], [26318, 59006],
- [59007, 144009], [59008, 143795], [15072, 59009], [59011, 152964],
- [59012, 166690], [59013, 152975], [59014, 136956], [59015, 152923],
- [59016, 152613], [30958, 59017], [59018, 143619], [59019, 137258],
- [59020, 143924], [13412, 59021], [59022, 143887], [59023, 143746],
- [59024, 148169], [26254, 59025], [59026, 159012], [26219, 59027],
- [19347, 59028], [26160, 59029], [59030, 161904], [59031, 138731],
- [26211, 59032], [59033, 144082], [59034, 144097], [26142, 59035],
- [59036, 153714], [14545, 59037], [59038, 145466], [59039, 145340],
- [15257, 59040], [59041, 145314], [59042, 144382], [29904, 59043],
- [15254, 59044], [59046, 149034], [26806, 59047], 0, [15300, 59049],
- [27326, 59050], [59052, 145365], [59053, 148615], [27187, 59054],
- [27218, 59055], [27337, 59056], [27397, 59057], [59058, 137490],
- [25873, 59059], [26776, 59060], [27212, 59061], [15319, 59062],
- [27258, 59063], [27479, 59064], [59065, 147392], [59066, 146586],
- [37792, 59067], [37618, 59068], [59069, 166890], [59070, 166603],
- [37513, 59071], [59072, 163870], [59073, 166364], [37991, 59074],
- [28069, 59075], [28427, 59076], 0, [59079, 147327], [15759, 59080],
- [28164, 59081], [59082, 147516], [23101, 59083], [28170, 59084],
- [22599, 59085], [27940, 59086], [30786, 59087], [28987, 59088],
- [59089, 148250], [59090, 148086], [28913, 59091], [29264, 59092, 61085],
- [29319, 59093], [29332, 59094], [59095, 149391], [59096, 149285],
- [20857, 59097], [59098, 150180], [59099, 132587], [29818, 59100],
- [59101, 147192], [59102, 144991], [59103, 150090], [59104, 149783],
- [59105, 155617], [16134, 59106], [16049, 59107], [59108, 150239],
- [59109, 166947], [59110, 147253], [24743, 59111], [16115, 59112],
- [29900, 59113], [29756, 59114], [37767, 59115], [29751, 59116],
- [17567, 59117], [59118, 159210], [17745, 59119], [30083, 59120],
- [16227, 59121], [59122, 150745], [59123, 150790], [16216, 59124],
- [30037, 59125], [30323, 59126], [59127, 173510], 0, [29800, 59129, 61070],
- [59130, 166604], [59131, 149931], [59132, 149902], [15099, 59133],
- [15821, 59134], [59135, 150094], [16127, 59136], [59137, 149957],
- [59138, 149747], [37370, 59139], [22322, 59140], [37698, 59141],
- [59142, 166627], [59143, 137316], [20703, 59144], [59145, 152097],
- [59146, 152039], [30584, 59147], [59148, 143922], [30478, 59149],
- [30479, 59150], [30587, 59151], [59152, 149143], [59153, 145281],
- [14942, 59154], [59155, 149744], [29752, 59156], [29851, 59157],
- [16063, 59158], [59159, 150202], [59160, 150215], [16584, 59161],
- [59162, 150166], [59163, 156078], [37639, 59164], [59165, 152961],
- [30750, 59166], [30861, 59167], [30856, 59168], [30930, 59169],
- [29648, 59170], [31065, 59171], [59172, 161601], [59173, 153315],
- [16654, 59174], 0, 0, [31141, 59177], [27181, 59178], [59179, 147194],
- [31290, 59180], [31220, 59181], [16750, 59182], [59183, 136934],
- [16690, 59184], [37429, 59185], [31217, 59186], [59187, 134476],
- [59188, 149900], [59189, 131737], [59190, 146874], [59191, 137070],
- [13719, 59192], [21867, 59193], [13680, 59194], [13994, 59195],
- [59196, 131540], [59197, 134157], [31458, 59198], [23129, 59199],
- [59200, 141045], [59201, 154287], [59202, 154268], [23053, 59203],
- [59204, 131675], [30960, 59205], [23082, 59206], [59207, 154566],
- [31486, 59208], [16889, 59209], [31837, 59210], [31853, 59211],
- [16913, 59212], [59213, 154547], [59214, 155324], [59215, 155302],
- [31949, 59216], [59217, 150009], [59218, 137136], [31886, 59219],
- [31868, 59220], [31918, 59221], [27314, 59222], [32220, 59223],
- [32263, 59224], [32211, 59225], [32590, 59226], [59227, 156257],
- [59228, 155996], [59229, 162632], [32151, 59230], [59231, 155266],
- [17002, 59232], [59233, 158581], [59234, 133398], [26582, 59235],
- [59236, 131150], [59237, 144847], [22468, 59238], [59239, 156690],
- [59240, 156664], [32733, 59242], [31527, 59243], [59244, 133164],
- [59245, 154345], [59246, 154947], [31500, 59247], [59248, 155150],
- [39398, 59249], [34373, 59250], [39523, 59251], [27164, 59252],
- [59253, 144447], [59255, 150007], [59256, 157101], [39455, 59257],
- [59258, 157088], 0, [59260, 160039], [59261, 158929], [17642, 59262],
- [33079, 59263], [17410, 59264], [32966, 59265], [33033, 59266],
- [33090, 59267], [59268, 157620], [39107, 59269], [59270, 158274],
- [33378, 59271], [33381, 59272], [59273, 158289], [33875, 59274],
- [59275, 159143], [34320, 59276], [59277, 160283], [23174, 59278],
- [16767, 59279], [59280, 137280], [23339, 59281], [59282, 137377],
- [23268, 59283], [59284, 137432], [34464, 59285], [59286, 195004],
- [59287, 146831], [34861, 59288], [59289, 160802], [23042, 59290],
- [34926, 59291], [20293, 59292], [34951, 59293], [35007, 59294],
- [35046, 59295], [35173, 59296], [35149, 59297], [59298, 153219],
- [35156, 59299], [59300, 161669], [59301, 161668], [59302, 166901],
- [59303, 166873], [59304, 166812], [59305, 166393], [16045, 59306],
- [33955, 59307], [18165, 59308], [18127, 59309], [14322, 59310],
- [35389, 59311], [35356, 59312], [59313, 169032], [24397, 59314],
- [37419, 59315], [59316, 148100], [26068, 59317], [28969, 59318],
- [28868, 59319], [59320, 137285], [40301, 59321], [35999, 59322],
- [36073, 59323], [59324, 163292], [22938, 59325], [30659, 59326],
- [23024, 59327], [14036, 59329], [36394, 59330], [36519, 59331],
- [59332, 150537], [36656, 59333], [36682, 59334], [17140, 59335],
- [27736, 59336], [28603, 59337], [59338, 140065], [18587, 59339],
- [28537, 59340], [28299, 59341], [59342, 137178], [39913, 59343],
- [14005, 59344], [59345, 149807], [37051, 59346], 0, [21873, 59348],
- [18694, 59349], [37307, 59350], [37892, 59351], [59352, 166475],
- [16482, 59353], [59354, 166652], [37927, 59355], [59356, 166941],
- [59357, 166971], [34021, 59358], [35371, 59359], [38297, 59360],
- [38311, 59361], [38295, 59362], [38294, 59363], [59364, 167220],
- [29765, 59365], [16066, 59366], [59367, 149759], [59368, 150082],
- [59369, 148458], [16103, 59370], [59371, 143909], [38543, 59372],
- [59373, 167655], [59374, 167526], [59375, 167525], [16076, 59376],
- [59377, 149997], [59378, 150136], [59379, 147438], [29714, 59380],
- [29803, 59381], [16124, 59382], [38721, 59383], [59384, 168112],
- [26695, 59385], [18973, 59386], [59387, 168083], [59388, 153567], 0,
- [37736, 59390], [59391, 166281], [59392, 166950], [59393, 166703],
- [59394, 156606], [37562, 59395], [23313, 59396], [35689, 59397],
- [18748, 59398], [29689, 59399], [59400, 147995], [38811, 59401], 0,
- [39224, 59403], [59404, 134950], [24001, 59405], [59406, 166853],
- [59407, 150194], [38943, 59408], [59409, 169178], [37622, 59410],
- [59411, 169431], [37349, 59412], [17600, 59413], [59414, 166736],
- [59415, 150119], [59416, 166756], [39132, 59417], [59418, 166469],
- [16128, 59419], [37418, 59420], [18725, 59421], [33812, 59422],
- [39227, 59423], [39245, 59424], [59425, 162566], [15869, 59426], 0,
- [19311, 59428], [39338, 59429], [39516, 59430], [59431, 166757],
- [59432, 153800], [27279, 59433], [39457, 59434], [23294, 59435],
- [39471, 59436], [59437, 170225], [19344, 59438], [59439, 170312],
- [39356, 59440], [19389, 59441], [19351, 59442], [37757, 59443],
- [22642, 59444], [59445, 135938], [22562, 59446], [59447, 149944],
- [59448, 136424], [30788, 59449], [59450, 141087], [59451, 146872],
- [26821, 59452], [15741, 59453], [37976, 59454], [14631, 59455],
- [24912, 59456], [59457, 141185], [59458, 141675], [24839, 59459],
- [40015, 59460], [40019, 59461], [40059, 59462], [39989, 59463],
- [39952, 59464], [39807, 59465], [39887, 59466], [59467, 171565],
- [39839, 59468], [59469, 172533], [59470, 172286], [40225, 59471],
- [19630, 59472], [59473, 147716], [40472, 59474], [19632, 59475],
- [40204, 59476], [59477, 172468], [59478, 172269], [59479, 172275],
- [59480, 170287], [40357, 59481], [33981, 59482], [59483, 159250],
- [59484, 159711], [59485, 158594], [34300, 59486], [17715, 59487],
- [59488, 159140], [59489, 159364], [59490, 159216], [33824, 59491],
- [34286, 59492], [59493, 159232], [59494, 145367], [59495, 155748],
- [31202, 59496], [59497, 144796], [59498, 144960], [59500, 149982],
- [15714, 59501], [37851, 59502], [37566, 59503], [37704, 59504],
- [59505, 131775], [30905, 59506], [37495, 59507], [37965, 59508],
- [20452, 59509], [13376, 59510], [36964, 59511], [59512, 152925],
- [30781, 59513], [30804, 59514], [30902, 59515], [30795, 59516],
- [59517, 137047], [59518, 143817], [59519, 149825], [13978, 59520],
- [20338, 59521], [28634, 59522], [28633, 59523], 0, [28702, 59524, 59525],
- [21524, 59526], [59527, 147893], [22459, 59528], [22771, 59529],
- [22410, 59530], [40214, 59531], [22487, 59532], [28980, 59533],
- [13487, 59534], [59535, 147884], [29163, 59536], [59537, 158784],
- [59538, 151447], 0, [59540, 137141], [59541, 166473], [24844, 59542],
- [23246, 59543], [23051, 59544], [17084, 59545], [59546, 148616],
- [14124, 59547], [19323, 59548], [59549, 166396], [37819, 59550],
- [37816, 59551], [59552, 137430], [59553, 134941], [33906, 59554],
- [59555, 158912], [59556, 136211], [59557, 148218], [59558, 142374],
- [59559, 148417], [22932, 59560], [59561, 146871], [59562, 157505],
- [32168, 59563], [59564, 155995], [59565, 155812], [59566, 149945],
- [59567, 149899], [59568, 166394], [37605, 59569], [29666, 59570],
- [16105, 59571], [29876, 59572], [59573, 166755], [59574, 137375],
- [16097, 59575], [59576, 150195], [27352, 59577], [29683, 59578],
- [29691, 59579], [16086, 59580], [59581, 150078], [59582, 150164],
- [59583, 137177], [59584, 150118], [59585, 132007], [59586, 136228],
- [59587, 149989], [29768, 59588], [59589, 149782], [28837, 59590],
- [59591, 149878], [37508, 59592], [29670, 59593], [37727, 59594],
- [59595, 132350], [37681, 59596], [59597, 166606], [59598, 166422],
- [37766, 59599], [59600, 166887], [59601, 153045], [18741, 59602],
- [59603, 166530], [29035, 59604], [59605, 149827], [59606, 134399],
- [22180, 59607], [59608, 132634], [59609, 134123], [59610, 134328],
- [21762, 59611], [31172, 59612], [59613, 137210], [32254, 59614],
- [59615, 136898], [59616, 150096], [59617, 137298], [17710, 59618],
- [37889, 59619], [14090, 59620], [59621, 166592], [59622, 149933],
- [22960, 59623], [59624, 137407], [59625, 137347], [59626, 160900],
- [23201, 59627], [14050, 59628], [59629, 146779], [14000, 59630],
- [37471, 59631], [23161, 59632], [59633, 166529], [59634, 137314],
- [37748, 59635], [15565, 59636], [59637, 133812], [19094, 59638],
- [14730, 59639], [20724, 59640], [15721, 59641], [15692, 59642],
- [59643, 136092], [29045, 59644], [17147, 59645], [59646, 164376],
- [28175, 59647], [59648, 168164], [17643, 59649], [27991, 59650],
- [59651, 163407], [28775, 59652], [27823, 59653], [15574, 59654],
- [59655, 147437], [59656, 146989], [28162, 59657], [28428, 59658],
- [15727, 59659], [59660, 132085], [30033, 59661], [14012, 59662],
- [13512, 59663], [18048, 59664], [16090, 59665], [18545, 59666],
- [22980, 59667], [37486, 59668], [18750, 59669], [36673, 59670],
- [59671, 166940], [59672, 158656], [22546, 59673], [22472, 59674],
- [14038, 59675], [59676, 136274], [28926, 59677], [59678, 148322],
- [59679, 150129], [59680, 143331], [59681, 135856], [59682, 140221],
- [26809, 59683], [26983, 59684], [59685, 136088], [59686, 144613],
- [59687, 162804], [59688, 145119], [59689, 166531], [59690, 145366],
- [59691, 144378], [59692, 150687], [27162, 59693], [59694, 145069],
- [59695, 158903], [33854, 59696], [17631, 59697], [17614, 59698],
- [59699, 159014], [59700, 159057], [59701, 158850], [59702, 159710], 0, 0,
- [33597, 59705], [59706, 137018], [33773, 59707], [59708, 158848],
- [59709, 159827], [59710, 137179], [22921, 59711], [23170, 59712],
- [59713, 137139], [23137, 59714], [23153, 59715], [59716, 137477],
- [59717, 147964], [14125, 59718], [23023, 59719], [59720, 137020],
- [14023, 59721], [29070, 59722], [37776, 59723], [26266, 59724],
- [59725, 148133], [23150, 59726], [23083, 59727], [59728, 148115],
- [27179, 59729], [59730, 147193], [59731, 161590], [59732, 148571],
- [59733, 148170], [28957, 59734], [59735, 148057], [59736, 166369],
- [20400, 59737], [59738, 159016], [23746, 59739], [59740, 148686],
- [59741, 163405], [59742, 148413], [27148, 59743], [59744, 148054],
- [59745, 135940], 0, [28979, 59747], [59748, 148457], [15781, 59749],
- [27871, 59750], [59751, 194597], [23019, 59754], [24412, 59757],
- [59764, 144128], [31955, 59776], [59783, 162548], [59786, 153334],
- [59790, 162584], [36972, 59791], [33270, 59795], [30476, 59797],
- [27810, 59799], [22269, 59800], [22633, 59828], [26465, 59832],
- [23646, 59838], [22770, 59841], [28857, 59843], [26627, 59853],
- [36795, 59859], [36796, 59861], [20001, 59871], [31545, 59898],
- [15820, 59902], [29482, 57990, 59909], [30048, 59912], [22586, 59920],
- [33446, 59932], [27018, 59940], [24803, 59944], [20206, 59984],
- [39364, 60002], [40639, 60023], [21249, 60025], [26528, 60038],
- [24808, 60046], [20916, 60053], [31363, 60064], [39994, 60075],
- [31432, 60093], [26906, 60098], [22956, 60100], [22592, 60102],
- [21610, 60114], [24807, 60123], [22138, 60125], [26965, 60132],
- [39983, 60133], [34725, 60134], [23584, 60141], [24075, 60143],
- [26398, 60147], [33965, 60157], [35713, 60161], [20088, 60166],
- [25283, 60176], [26709, 60180], 0, [33533, 60190], [35237, 60194],
- [36768, 60196], [38840, 60198], [38983, 60200], [39613, 60201],
- [24497, 60218], [26184, 60219], [26303, 60220], [60221, 162425], 0,
- [60225, 149946], 0, 0, [60230, 131910], [26382, 60232], [26904, 60233],
- [60235, 161367], [60236, 155618], [60239, 161278], [60240, 139418],
- [18640, 60241], [19128, 60242], [60244, 166554], [60247, 147515],
- [60250, 150085], [60251, 132554], [20946, 60252], [60253, 132625],
- [22943, 60254], [60255, 138920], [15294, 60256], [60257, 146687],
- [14747, 60262], [60264, 165352], [60265, 170441], [14178, 60266],
- [60267, 139715], [35678, 60268], [60269, 166734], 0, [29193, 60274],
- [60276, 134264], [60280, 132985], [36570, 60281], [21135, 60283],
- [29041, 60285], [60288, 147274], [60289, 150183], [21948, 60290],
- [60293, 158546], [13427, 60295], [60297, 161330], [18200, 60299],
- [60303, 149823], [20582, 60305], [13563, 60306], [60307, 144332], 0,
- [18300, 60310], [60311, 166216], [60315, 138640], 0, [60320, 162834],
- [36950, 60321], [60323, 151450], [35682, 60324], [23899, 60327],
- [60328, 158711], 0, [60331, 137500], [35562, 60332], [60333, 150006],
- [60335, 147439], [19392, 60337], [60340, 141083], [37989, 60341],
- [60342, 153569], [24981, 60343], [23079, 60344], [60345, 194765], 0,
- [60348, 148769], [20074, 60350], [60351, 149812], [38486, 60352],
- [28047, 60353], [60354, 158909], [35191, 60356], [60359, 156689], 0,
- [31554, 60363], [60364, 168128], [60365, 133649], 0, [31301, 60369],
- [39462, 60372], [13919, 60374], [60375, 156777], [60376, 131105],
- [31107, 60377], [23852, 60380], [60381, 144665], 0, [18128, 60384],
- [30011, 60386], [34917, 60387], [22710, 60389], [14108, 60390],
- [60391, 140685], [15444, 60394], [37505, 60397], [60398, 139642],
- [37680, 60400], [60402, 149968], [27705, 60403], [60406, 134904],
- [34855, 60407], [35061, 60408], [60409, 141606], [60410, 164979],
- [60411, 137137], [28344, 60412], [60413, 150058], [60414, 137248],
- [14756, 60415], 0, 0, [17727, 60419], [26294, 60420], [60421, 171181],
- [60422, 170148], [35139, 60423], [16607, 60427], [60428, 136714],
- [14753, 60429], [60430, 145199], [60431, 164072], [60432, 136133],
- [29101, 60433], [33638, 60434], [60436, 168360], 0, [19639, 60438],
- [60439, 159919], [60440, 166315], [60445, 147834], [31555, 60446],
- [31102, 60447], [28597, 60449], [60450, 172767], [27139, 60451],
- [60452, 164632], [21410, 60453], [60454, 159239], [37823, 60455],
- [26678, 60456], [38749, 59389, 60457], [60458, 164207], [60460, 158133],
- [60461, 136173], [60462, 143919], [23941, 60464], [60465, 166960],
- [22293, 60467], [38947, 60468], [60469, 166217], [23979, 60470],
- [60471, 149896], [26046, 60472], [27093, 60473], [21458, 60474],
- [60475, 150181], [60476, 147329], [15377, 60477], [26422, 60478],
- [60482, 139169], [13770, 60490], [18682, 60493], 0, [30728, 60496],
- [37461, 60497], [17394, 60499], [17375, 60501], [23032, 60505], 0,
- [22155, 60518], [60520, 169449], [36882, 60541], [21953, 60546],
- [17673, 60551], [32383, 60552], [28502, 60553], [27313, 60554],
- [13540, 60556], [60558, 161949], [14138, 60559], 0, [60562, 163876],
- [60565, 162366], [15851, 60567], [60569, 146615], [60574, 156248],
- [22207, 60575], [36366, 60577], [23405, 60578], [25566, 60581], 0,
- [25904, 60585], [22061, 60586], [21530, 60588], [60591, 171416],
- [19581, 60592], [22050, 60593], [22046, 60594], [32585, 60595],
- [22901, 60597], [60598, 146752], [34672, 60599], [33047, 60604],
- [40286, 60605], [36120, 60606], [30267, 60607], [40005, 60608],
- [30286, 60609], [30649, 60610], [37701, 60611], [21554, 60612],
- [33096, 60613], [33527, 60614], [22053, 60615], [33074, 60616],
- [33816, 60617], [32957, 60618], [21994, 60619], [31074, 60620],
- [22083, 60621], [21526, 60622], [60623, 134813], [13774, 60624],
- [22021, 57509, 60625], [22001, 60626], [26353, 60627], [60628, 164578],
- [13869, 60629], [30004, 60630], [22000, 60631], [21946, 60632],
- [21655, 60633], [21874, 60634], [60635, 134209], [60636, 134294],
- [24272, 57652, 60637], [60639, 134774], [60640, 142434], [60641, 134818],
- [40619, 60642], [32090, 60643], 0, [60645, 135285], [25245, 60646],
- [38765, 60647], [21652, 60648], [36045, 60649], [29174, 60650],
- [37238, 60651], [25596, 60652], [25529, 60653], [25598, 60654],
- [21865, 60655], [60656, 142147], [40050, 60657], [60658, 143027],
- [20890, 60659], [13535, 60660], [60661, 134567], [20903, 60662],
- [21581, 60663], [21790, 60664], [21779, 60665], [30310, 60666],
- [36397, 60667], [60668, 157834], [30129, 60669], [32950, 60670],
- [34820, 60671], 0, [35015, 60673], [33206, 60674], [33820, 60675],
- [17644, 60677], [29444, 60678], [33547, 60681], [22139, 60683],
- [37232, 60690], [37384, 60692], [60696, 134905], [29286, 60697],
- [18254, 60699], [60701, 163833], [16634, 60703], [40029, 60704],
- [25887, 60705], [18675, 60707], [60708, 149472], [60709, 171388], 0,
- [60713, 161187], 60715, [60716, 155720], [29091, 60718], [32398, 60719],
- [40272, 60720], [13687, 60723], [27826, 60725], [21351, 60726],
- [14812, 60728], [60731, 149016], [33325, 60734], [21579, 60735], 60739,
- [14930, 60740], [29556, 60742], [60743, 171692], [19721, 60744],
- [39917, 60745], 0, [19547, 60748], [60751, 171998], [33884, 60752],
- [60754, 160434], [25390, 60757], [32037, 60758], [14890, 60761],
- [36872, 60762], [21196, 60763], [15988, 60764], [13946, 60765],
- [17897, 60766], [60767, 132238], [30272, 60768], [23280, 60769],
- [60770, 134838], [30842, 60771], [18358, 60772], [22695, 60773],
- [16575, 60774], [22140, 60775], [39819, 60776], [23924, 60777],
- [30292, 60778], [60779, 173108], [40581, 60780], [19681, 60781], 0,
- [14331, 60783], [24857, 60784], [60786, 148466], 60787, [22109, 60788],
- [60792, 171526], [21044, 60793], [13741, 60795], 0, [40316, 60797],
- [31830, 60798], [39737, 60799], [22494, 60800], [23635, 60802],
- [25811, 60803], [60804, 169168], [60805, 156469], [34477, 60807],
- [60808, 134440], [60811, 134513], 60812, [20990, 60813], [60814, 139023],
- [23950, 60815], [38659, 60816], [60817, 138705], [40577, 60818],
- [36940, 60819], [31519, 60820], [39682, 60821], [23761, 60822],
- [31651, 60823], [25192, 60824], [25397, 60825], [39679, 60826],
- [31695, 60827], [39722, 60828], [31870, 60829], 0, [31810, 60831],
- [31878, 60832], [39957, 60833], [31740, 60834], [39689, 60835], 0, 39982,
- [40794, 60839], [21875, 60840], [23491, 60841], [20477, 60842],
- [40600, 60843], [20466, 60844], [21088, 60845], [21201, 60847],
- [22375, 60848], [20566, 60849], [22967, 60850], [24082, 60851],
- [38856, 60852], [40363, 60853], [36700, 60854], [21609, 60855],
- [38836, 60856], [39232, 60857], [38842, 60858], [21292, 60859],
- [24880, 60860], [26924, 60861], [21466, 60862], [39946, 60863],
- [40194, 60864], [19515, 60865], [38465, 60866], [27008, 60867],
- [20646, 60868], [30022, 60869], [60870, 137069], [39386, 60871],
- [21107, 60872], 60873, [37209, 60874], [38529, 60875], [37212, 60876],
- 60877, [37201, 60878], [60879, 167575], [25471, 60880], [27338, 60882],
- [22033, 60883], [37262, 60884], [30074, 60885], [25221, 60886],
- [29519, 60888], [31856, 60889], [60890, 154657], 60892, [30422, 60894],
- [39837, 60895], [20010, 60896], [60897, 134356], [33726, 60898],
- [34882, 60899], 60900, [23626, 60901], [27072, 60902], 0, 0,
- [21023, 60905], [24053, 60906], [20174, 60907], [27697, 60908],
- [60909, 131570], [20281, 60910], [21660, 60911], 0, [21146, 60913],
- [36226, 60914], [13822, 60915], 0, [13811, 60917], 60918, [27474, 60919],
- [37244, 60920], [40869, 60921], [39831, 60922], [38958, 60923],
- [39092, 60924], [39610, 60925], [40616, 60926], [40580, 60927],
- [31508, 60929], 60930, [27642, 60931], [34840, 60932], [32632, 60933],
- 60934, [22048, 60935], [60936, 173642], [36471, 60937], [40787, 60938],
- 60939, [36308, 60940], [36431, 60941], [40476, 60942], [36353, 60943],
- [25218, 60944], [60945, 164733], [36392, 60946], [36469, 60947],
- [31443, 60948], [31294, 60950], [30936, 60951], [27882, 60952],
- [35431, 60953], [30215, 60954], [40742, 60956], [27854, 60957],
- [34774, 60958], [30147, 60959], [60960, 172722], [30803, 60961],
- [36108, 60963], [29410, 60964], [29553, 60965], [35629, 60966],
- [29442, 60967], [29937, 60968], [36075, 60969], [60970, 150203],
- [34351, 60971], [24506, 60972], [34976, 60973], [17591, 60974], 60975,
- [60977, 159237], 60978, [35454, 60979], [60980, 140571], 60981,
- [24829, 60982], [30311, 60983], [39639, 60984], [40260, 60985],
- [37742, 58859, 60986], [39823, 60987], [34805, 60988], 60989, 0,
- [36087, 60991], [29484, 60992], [38689, 60993], [39856, 60994],
- [13782, 60995], [29362, 60996], [19463, 60997], [31825, 60998],
- [39242, 60999], [24921, 61001], [19460, 61002], [40598, 61003],
- [24957, 61004], 61005, [22367, 61006], [24943, 61007], [25254, 61008],
- [25145, 61009], 0, [14940, 61011], [25058, 61012], [21418, 61013],
- [25444, 61015], [26626, 61016], [13778, 61017], [23895, 61018],
- [36826, 61020], [61021, 167481], 61022, [20697, 61023], [30982, 61025],
- [21298, 61026], [38456, 61027], [61028, 134971], [16485, 61029], 61030,
- [30718, 61031], 61032, [31938, 61033], [61034, 155418], [31962, 61035],
- [31277, 61036], [32870, 61037], [32867, 61038], [32077, 61039],
- [29957, 61040], [29938, 61041], [35220, 61042], [33306, 61043],
- [26380, 61044], [32866, 61045], [61046, 160902], [32859, 61047],
- [29936, 61048], [33027, 61049], [30500, 61050], [35209, 61051],
- [61052, 157644], [30035, 61053], [34729, 61055], [34766, 61056],
- [33224, 61057], [34700, 61058], [35401, 61059], [36013, 61060],
- [35651, 61061], [30507, 61062], [29944, 61063], [34010, 61064],
- [27058, 61066], [36262, 61067], 61068, [35241, 58392, 61069], 0,
- [28089, 61071], [34753, 61072], [61073, 147473], [29927, 61074],
- [15835, 61075], [29046, 61076], [24740, 57702, 61077], [24988, 61078],
- [15569, 61079], 0, [24695, 61081], 61082, [32625, 61083], 0,
- [24809, 61086], [19326, 61087], [57344, 132423], [37595, 57345],
- [57346, 132575], [57347, 147397], [34124, 57348], [17077, 57349],
- [29679, 57350], [20917, 57351], [13897, 57352], [57353, 149826],
- [57354, 166372], [37700, 57355], [57356, 137691], [33518, 57357],
- [57358, 146632], [30780, 57359], [26436, 57360], [25311, 57361],
- [57362, 149811], [57363, 166314], [57364, 131744], [57365, 158643],
- [57366, 135941], [20395, 57367], [57368, 140525], [20488, 57369],
- [57370, 159017], [57371, 162436], [57372, 144896], [57373, 150193],
- [57374, 140563], 0, [57376, 131966], [24484, 57377], [57378, 131968],
- [57379, 131911], [28379, 57380], [57381, 132127], 20702, [20737, 57383],
- [13434, 57384], [20750, 57385], [39020, 57386], [14147, 57387],
- [33814, 57388], [57389, 149924], [57390, 132231], [20832, 57391],
- [57392, 144308], [20842, 57393], [57394, 134143], [57395, 139516],
- [57396, 131813], [57397, 140592], [57398, 132494], [57399, 143923],
- [57400, 137603], [23426, 57401], [34685, 57402], [57403, 132531],
- [57404, 146585], [20914, 57405], [20920, 57406], [40244, 57407],
- [20937, 57408], [20943, 57409], [20945, 57410], [15580, 57411],
- [20947, 57412], [57413, 150182], [20915, 57414], 0, 0, [20973, 57417],
- [33741, 57418], [26942, 57419], [57420, 145197], [24443, 57421],
- [21003, 57422], [21030, 57423], [21052, 57424], [21173, 57425],
- [21079, 57426], [21140, 57427], [21177, 57428], [21189, 57429],
- [31765, 57430], [34114, 57431], [21216, 57432], [34317, 57433],
- [57434, 158483], 0, [57436, 166622], [21833, 57437], [28377, 57438],
- [57439, 147328], [57440, 133460], [57441, 147436], [21299, 57442], 0,
- [57444, 134114], [27851, 57445], [57446, 136998], [26651, 57447],
- [29653, 57448], [24650, 57449], [16042, 57450], [14540, 57451],
- [57452, 136936], [29149, 57453], [17570, 57454], [21357, 57455],
- [21364, 57456], [57457, 165547], [21374, 57458], 0, [57460, 136598],
- [57461, 136723], [30694, 57462], [21395, 57463], [57464, 166555],
- [21408, 57465], [21419, 57466], [21422, 57467], [29607, 57468],
- [57469, 153458], [16217, 57470], [29596, 57471], [21441, 57472],
- [21445, 57473], [27721, 57474], [20041, 57475], [22526, 57476],
- [21465, 57477], [15019, 57478], [57479, 134031], [21472, 57480],
- [57481, 147435], [57482, 142755], [21494, 57483], [57484, 134263],
- [21523, 57485], [28793, 57486], [21803, 57487], [26199, 57488],
- [27995, 57489], [21613, 57490], [57491, 158547], [57492, 134516],
- [21853, 57493], [21647, 57494], [21668, 57495], [18342, 57496],
- [57497, 136973], [57498, 134877], [15796, 57499], [57500, 134477],
- [57501, 166332], [57502, 140952], [21831, 57503], [19693, 57504],
- [21551, 57505], [29719, 57506], [21894, 57507], [21929, 57508], 0,
- [57510, 137431], [57511, 147514], [17746, 57512], [57513, 148533],
- [26291, 57514], [57515, 135348], [22071, 57516], [26317, 57517],
- [57518, 144010], [26276, 57519], 0, [22093, 57521], [22095, 57522],
- [30961, 57523], [22257, 57524], [38791, 57525], [21502, 57526],
- [22272, 57527], [22255, 57528], [22253, 57529], [57530, 166758],
- [13859, 57531], [57532, 135759], [22342, 57533], [57534, 147877],
- [27758, 57535], [28811, 57536], [22338, 57537], [14001, 57538],
- [57539, 158846], [22502, 57540], [57541, 136214], [22531, 57542],
- [57543, 136276], [57544, 148323], [22566, 57545], [57546, 150517], 0,
- [22698, 57548], [13665, 57549], [22752, 57550], [22748, 57551],
- [57552, 135740], [22779, 57553], [23551, 57554], [22339, 57555],
- [57556, 172368], [57557, 148088], [37843, 57558], [13729, 57559],
- [22815, 57560], [26790, 57561], [14019, 57562], [28249, 57563],
- [57564, 136766], [23076, 57565], 0, [57567, 136850], [34053, 57568],
- [22985, 57569], [57570, 134478], [57571, 158849], [57572, 159018],
- [57573, 137180], [23001, 57574], [57575, 137211], [57576, 137138],
- [57577, 159142], [28017, 57578], [57579, 137256], [57580, 136917],
- [23033, 57581], [57582, 159301], [23211, 57583], [23139, 57584],
- [14054, 57585], [57586, 149929], 0, [14088, 57588], [23190, 57589],
- [29797, 57590], [23251, 57591], [57592, 159649], [57593, 140628],
- [57595, 137489], [14130, 57596], [57597, 136888], [24195, 57598],
- [21200, 57599], [23414, 57600], [25992, 57601], [23420, 57602],
- [57603, 162318], [16388, 57604], [18525, 57605], [57606, 131588],
- [23509, 57607], [57609, 137780], [57610, 154060], [57611, 132517],
- [23539, 57612], [23453, 57613], [19728, 57614], [23557, 57615],
- [57616, 138052], [23571, 57617], [29646, 57618], [23572, 57619],
- [57620, 138405], [57621, 158504], [23625, 57622], [18653, 57623],
- [23685, 57624], [23785, 57625], [23791, 57626], [23947, 57627],
- [57628, 138745], [57629, 138807], [23824, 57630], [23832, 57631],
- [23878, 57632], [57633, 138916], [23738, 57634], [24023, 57635],
- [33532, 57636], [14381, 57637], [57638, 149761], [57639, 139337],
- [57640, 139635], [33415, 57641], [14390, 57642], [15298, 57643],
- [24110, 57644], [27274, 57645], 0, 57647, [57648, 148668], [57649, 134355],
- [21414, 57650], [20151, 57651], 0, [21416, 57653], [57654, 137073],
- [24073, 57655], 57656, [57657, 164994], [24313, 57658], [24315, 57659],
- [14496, 57660], [24316, 57661], [26686, 57662], [37915, 57663],
- [24333, 57664], [57665, 131521], [57666, 194708], [15070, 57667],
- [57669, 135994], [24378, 57670], [57671, 157832], [57672, 140240],
- [57674, 140401], [24419, 57675], [57677, 159342], [24434, 57678],
- [37696, 57679], [57680, 166454], [24487, 57681], [23990, 57682],
- [15711, 57683], [57684, 152144], [57685, 139114], [57686, 159992],
- [57687, 140904], [37334, 57688], [57689, 131742], [57690, 166441],
- [24625, 57691], [26245, 57692], [14691, 57694], [15815, 57695],
- [13881, 57696], [22416, 57697], [57698, 141236], [31089, 57699],
- [15936, 57700], [24734, 57701], 0, 0, [57704, 149890], [57705, 149903],
- [57706, 162387], [29860, 57707], [20705, 57708], [23200, 57709],
- [24932, 57710], [24898, 57712], [57713, 194726], [57714, 159442],
- [24961, 57715], [20980, 57716], [57717, 132694], [24967, 57718],
- [23466, 57719], [57720, 147383], [57721, 141407], [25043, 57722],
- [57723, 166813], [57724, 170333], [25040, 57725], [14642, 57726],
- [57727, 141696], [57728, 141505], [24611, 57729], [24924, 57730],
- [25886, 57731], [25483, 57732], [57733, 131352], [25285, 57734],
- [57735, 137072], [25301, 57736], [57737, 142861], [25452, 57738],
- [57739, 149983], [14871, 57740], [25656, 57741], [25592, 57742],
- [57743, 136078], [57744, 137212], [28554, 57746], [57747, 142902], 0,
- [57750, 153373], [25825, 57751], [25829, 57752], [38011, 57753],
- [14950, 57754], [25658, 57755], [14935, 57756], [25933, 57757],
- [28438, 57758], [57759, 150056], [57760, 150051], [25989, 57761],
- [25965, 57762], [25951, 57763], 0, [26037, 57765], [57766, 149824],
- [19255, 57767], [26065, 57768], [16600, 57769], [57770, 137257], 57771,
- [26083, 57772], [24543, 57773], [57774, 144384], [26136, 57775],
- [57776, 143863], [57777, 143864], [26180, 57778], [57779, 143780],
- [57780, 143781], [26187, 57781], [57782, 134773], [26215, 57783],
- [57784, 152038], [26227, 57785], 0, [57788, 143921], [57789, 165364],
- [57790, 143816], [57791, 152339], [30661, 57792], [57793, 141559],
- [39332, 57794], [26370, 57795], [57796, 148380], [57797, 150049],
- [27130, 57799], [57800, 145346], 0, [26471, 57802], [26466, 57803],
- [57804, 147917], [57805, 168173], [26583, 57806], [17641, 57807],
- [26658, 57808], [28240, 57809], [37436, 57810], [26625, 57811],
- [57812, 144358], [57813, 159136], [26717, 57814], [57815, 144495],
- [27105, 57816], [27147, 57817], [57818, 166623], [26995, 57819],
- [26819, 57820], [57821, 144845], [26881, 57822], [26880, 57823],
- [14849, 57825], [57826, 144956], [15232, 57827], [26540, 57828],
- [26977, 57829], [57830, 166474], [17148, 57831], [26934, 57832],
- [27032, 57833], [15265, 57834], [57835, 132041], [33635, 57836],
- [20624, 57837], [27129, 57838], [57839, 144985], [57840, 139562],
- [27205, 57841], [57842, 145155], [27293, 57843], [15347, 57844],
- [26545, 57845], [27336, 57846], [57847, 168348], [15373, 57848],
- [27421, 57849], [57850, 133411], [24798, 57851, 60308], [27445, 57852],
- [27508, 57853], [57854, 141261], [28341, 57855], [57856, 146139], 0,
- [57858, 137560], [14144, 57859], [21537, 57860], [57861, 146266],
- [27617, 57862], [57863, 147196], [27612, 57864], [27703, 57865],
- [57866, 140427], [57867, 149745], [57868, 158545], [27738, 57869],
- [33318, 57870], [27769, 57871], [57872, 146876], [17605, 57873],
- [57874, 146877], [57875, 147876], [57876, 149772], [57877, 149760],
- [57878, 146633], [14053, 57879], [15595, 57880], [57881, 134450],
- [39811, 57882], [57883, 143865], [57884, 140433], [32655, 57885],
- [26679, 57886], [57887, 159013], [57888, 159137], [57889, 159211],
- [28054, 57890], [27996, 57891], [28284, 57892], [28420, 57893],
- [57894, 149887], [57895, 147589], [57896, 159346], [34099, 57897],
- [57898, 159604], [20935, 57899], 0, 0, [33838, 57902], [57903, 166689], 0,
- [57905, 146991], [29779, 57906], [57907, 147330], [31180, 57908],
- [28239, 57909], [23185, 57910], [57911, 143435], [28664, 57912],
- [14093, 57913], [28573, 57914], [57915, 146992], [28410, 57916],
- [57917, 136343], [57918, 147517], [17749, 57919], [37872, 57920],
- [28484, 57921], [28508, 57922], [15694, 57923], [28532, 57924],
- [57925, 168304], [15675, 57926], [28575, 57927], [57928, 147780],
- [28627, 57929], [57930, 147601], [57931, 147797], [57932, 147513],
- [57933, 147440], [57934, 147380], [57935, 147775], [20959, 57936],
- [57937, 147798], [57938, 147799], [57939, 147776], [57940, 156125],
- [28747, 57941], [28798, 57942], [28839, 57943], 0, [28876, 57945],
- [28885, 57946], [28886, 57947], [28895, 57948], [16644, 57949],
- [15848, 57950], [29108, 57951], [29078, 57952], [57953, 148087],
- [28971, 57954], [28997, 57955], [23176, 57956], [29002, 57957], 0,
- [57960, 148325], [29007, 57961], [37730, 57962], [57963, 148161],
- [28972, 57964], [57965, 148570], [57966, 150055], [57967, 150050],
- [29114, 57968], [57969, 166888], [28861, 57970], [29198, 57971],
- [37954, 57972], [29205, 57973], [22801, 57974], [37955, 57975],
- [29220, 57976], [37697, 57977], [57978, 153093], [29230, 57979],
- [29248, 57980], [57981, 149876], [26813, 57982], [29269, 57983],
- [29271, 57984], [15957, 57985], [57986, 143428], [26637, 57987],
- [28477, 57988], [29314, 57989], 0, [29483, 57991], [57992, 149539],
- [57993, 165931], [18669, 57994], [57995, 165892], [29480, 57996],
- [29486, 57997], [29647, 57998], [29610, 57999], [58000, 134202],
- [58001, 158254], [29641, 58002], [29769, 58003], [58004, 147938],
- [58005, 136935], [58006, 150052], [26147, 58007], [14021, 58008],
- [58009, 149943], [58010, 149901], [58011, 150011], [29687, 58012],
- [29717, 58013], [26883, 58014], [58015, 150054], [29753, 58016],
- [16087, 58018], 0, [58020, 141485], [29792, 58021], [58022, 167602],
- [29767, 58023], [29668, 58024], [29814, 58025], [33721, 58026],
- [29804, 58027], [29812, 58029], [37873, 58030], [27180, 58031],
- [29826, 58032], [18771, 58033], [58034, 150156], [58035, 147807],
- [58036, 150137], [58037, 166799], [23366, 58038], [58039, 166915],
- [58040, 137374], [29896, 58041], [58042, 137608], [29966, 58043],
- [29982, 58045], [58046, 167641], [58047, 137803], [23511, 58048],
- [58049, 167596], [37765, 58050], [30029, 58051], [30026, 58052],
- [30055, 58053], [30062, 58054], [58055, 151426], [16132, 58056],
- [58057, 150803], [30094, 58058], [29789, 58059], [30110, 58060],
- [30132, 58061], [30210, 58062], [30252, 58063], [30289, 58064],
- [30287, 58065], [30319, 58066], 58067, [58068, 156661], [30352, 58069],
- [33263, 58070], [14328, 58071], [58072, 157969], [58073, 157966],
- [30369, 58074], [30373, 58075], [30391, 58076], [30412, 58077],
- [58078, 159647], [33890, 58079], [58080, 151709], [58081, 151933],
- [58082, 138780], [30494, 58083], [30502, 58084], [30528, 58085],
- [25775, 58086], [58087, 152096], [30552, 58088], [58089, 144044],
- [30639, 58090], [58091, 166244], [58092, 166248], [58093, 136897],
- [30708, 58094], 0, [26826, 58098], [30895, 58099], [30919, 58100],
- [30931, 58101], [38565, 58102], [31022, 58103], [58104, 153056],
- [30935, 58105], [31028, 58106], [30897, 58107], [58108, 161292],
- [36792, 58109], [34948, 58110], [58113, 140828], [31110, 58114],
- [35072, 58115], [26882, 58116], [31104, 58117], [58118, 153687],
- [31133, 58119], [58120, 162617], [31036, 58121], [31145, 58122],
- [28202, 58123], [58124, 160038], [16040, 58125], [31174, 58126],
- [58127, 168205], [31188, 58128], 0, [21797, 62526], 0, [62528, 134210],
- [62529, 134421], [62530, 151851], [21904, 62531], [62532, 142534],
- [14828, 62533], [62534, 131905], [36422, 62535], [62536, 150968],
- [62537, 169189], 0, [62539, 164030], [30586, 62540], [62541, 142392],
- [14900, 62542], [18389, 62543], [62544, 164189], [62545, 158194],
- [62546, 151018], [25821, 62547], [62548, 134524], [62549, 135092],
- [62550, 134357], 0, [25741, 62552], [36478, 62553], [62554, 134806], 0,
- [62556, 135012], [62557, 142505], [62558, 164438], [62559, 148691], 0,
- [62561, 134470], [62562, 170573], [62563, 164073], [18420, 62564],
- [62565, 151207], [62566, 142530], [39602, 62567], [14951, 62568],
- [62569, 169460], [16365, 62570], [13574, 62571], [62572, 152263],
- [62573, 169940], 0, [62575, 142660], [40302, 62576], [38933, 62577], 0,
- [17369, 62579], 0, [25780, 62581], [21731, 62582], 0, [62584, 142282], 0,
- [14843, 62586], 0, [62588, 157402], [62589, 157462], [62590, 162208],
- [25834, 62591], [62592, 151634], [62593, 134211], [36456, 62594], 0,
- [62596, 166732], [62597, 132913], 0, [18443, 62599], [62600, 131497],
- [16378, 62601], [22643, 62602], [62603, 142733], 0, [62605, 148936],
- [62606, 132348], [62607, 155799], [62608, 134988], 0, [21881, 62610], 0,
- [17338, 62612], 0, [19124, 62614], [62615, 141926], [62616, 135325],
- [33194, 62617], [39157, 62618], [62619, 134556], [25465, 62620],
- [14846, 62621], [62622, 141173], [36288, 62623], [22177, 62624],
- [25724, 62625], [15939, 62626], 0, [62628, 173569], [62629, 134665],
- [62630, 142031], 0, 0, [62633, 135368], [62634, 145858], [14738, 62635],
- [14854, 62636], [62637, 164507], [13688, 62638], [62639, 155209],
- [62640, 139463], 0, 0, [62643, 142514], [62644, 169760], [13500, 62645],
- [27709, 62646], [62647, 151099], 0, 0, [62650, 161140], [62651, 142987],
- [62652, 139784], [62653, 173659], [62654, 167117], [62655, 134778],
- [62656, 134196], [62683, 161337], [62684, 142286], [62687, 142417],
- [14872, 62689], [62691, 135367], [62693, 173618], [62695, 167122],
- [62696, 167321], [62697, 167114], [38314, 62698], 0, [62706, 161630],
- [28992, 62708], 0, [20822, 62385], 0, [20616, 62487], 0, [13459, 62489],
- [20870, 62491], [24130, 63037], [20997, 62495], [21031, 62436],
- [21113, 62497], 0, [13651, 62504], [21442, 62505], [21343, 62715], 0,
- [21823, 62520], 0, [21976, 59986], [13789, 62722], [22049, 63067], 0,
- [22100, 60044], [60148, 135291], 0, [60153, 135379], 0, [61095, 135934], 0,
- 0, [14265, 60104], [23745, 61099], [23829, 63066], [23894, 63030],
- [14392, 63036], [20097, 62477], [24253, 63038], [14612, 63042],
- [25017, 63050], [25232, 63054], [25368, 63056], [25690, 63063],
- [25745, 62381], [33133, 62709], [33156, 59922], [33171, 59924],
- [26624, 63080], [15292, 63093], [29327, 60517], [29389, 59781], 0,
- [29497, 59785], [30018, 59811], [30172, 59817], [16320, 59818],
- [60278, 151205], [16343, 59820], 0, 30336, [30348, 59824, 151388],
- [16552, 59845], [30777, 59846], [16643, 59855], [31377, 59863],
- [31771, 59876], [31981, 59884], [32659, 62658], [32686, 59892], 0,
- [33535, 59936], [22623, 59981], [34482, 59960], 0, [34699, 59963],
- [35143, 59969], 0, [35369, 59972], 0, [36465, 59988], [60484, 164233],
- [36528, 59990], 0, [37214, 62443], [37260, 62441], [39182, 60051],
- [39196, 60054], 0, 0, [39809, 60066], [40384, 60080], [40339, 60078],
- [40620, 60085], [19857, 60540], 0, 37818, [40571, 60084], [28809, 63148],
- [29512, 59788], 0, [31129, 59858], [36791, 59997], 0, [39234, 60056],
- {s: 193}, 8364, {s: 4}, [12443, 63518], [12444, 63519], [11904, 63520],
- {f: 5, c: 62211}, [62216, 131340], 62217, [62218, 131281], [62219, 131277],
- {f: 2, c: 62220}, [62222, 131275], [62223, 139240], 62224, [62225, 131274],
- {f: 4, c: 62226}, [62230, 131342], {f: 2, c: 62231}, {f: 2, c: 62776},
- [62778, 138177], [62779, 194680], [12205, 38737, 62780], [62781, 131206],
- [20059, 62782], [20155, 62783], [13630, 62784], [23587, 62785],
- [24401, 62786], [24516, 62787], [14586, 62788], [25164, 62789],
- [25909, 62790], [27514, 62791], [27701, 62792], [27706, 62793],
- [28780, 62794], [29227, 62795], [20012, 62796], [29357, 62797],
- [62798, 149737], [32594, 62799], [31035, 62800], [31993, 62801],
- [32595, 62802], [62803, 156266], [13505, 62804], [62806, 156491],
- [32770, 62807], [32896, 62808], [62809, 157202], [62810, 158033],
- [21341, 62811], [34916, 62812], [35265, 62813], [62814, 161970],
- [35744, 62815], [36125, 62816], [38021, 62817], [38264, 62818],
- [38271, 62819], [38376, 62820], [62821, 167439], [38886, 62822],
- [39029, 62823], [39118, 62824], [39134, 62825], [39267, 62826],
- [62827, 170000], [40060, 62828], [40479, 62829], [40644, 62830],
- [27503, 62831], [62832, 63751], [20023, 62833], [62834, 131207],
- [38429, 62835], [25143, 62836], [38050, 62837], [11908, 63521],
- [11910, 63522], [11911, 63523], [11912, 63524], [11914, 63525],
- [11916, 63526], [11917, 63527], [11925, 63528], [11932, 63529],
- [11941, 63531], [11943, 63532], [11946, 63533], [11948, 63534],
- [11950, 63535], [11958, 63536], [11964, 63537], [11966, 63538],
- [11978, 63540], [11980, 63541], [11981, 63542], [11983, 63543],
- [11990, 63544], [11991, 63545], [11998, 63546], [62368, 172969],
- [62369, 135493], [25866, 62371], [20029, 62374], [28381, 62375],
- [40270, 62376], [37343, 62377], [62380, 161589], [20250, 62382],
- [20264, 62383], [20392, 62384], [20852, 62386], [20892, 62387],
- [20964, 62388], [21153, 62389], [21160, 62390], [21307, 62391],
- [21326, 62392], [21457, 62393], [21464, 62394], [22242, 62395],
- [22768, 62396], [22788, 62397], [22791, 62398], [22834, 62399],
- [22836, 62400], [23398, 62401], [23454, 62402], [23455, 62403],
- [23706, 62404], [24198, 62405], [24635, 62406], [25993, 62407],
- [26622, 62408], [26628, 62409], [26725, 62410], [27982, 62411],
- [28860, 62412], [30005, 62413], [32420, 62414], [32428, 62415],
- [32442, 62416], [32455, 62417], [32463, 62418], [32479, 62419],
- [32518, 62420], [32567, 62421], [33402, 62422], [33487, 62423],
- [33647, 62424], [35270, 62425], [35774, 62426], [35810, 62427],
- [36710, 62428], [36711, 62429], [36718, 62430], [29713, 62431],
- [31996, 62432], [32205, 62433], [26950, 62434], [31433, 62435],
- [30904, 62442], [32956, 62444], [36107, 62446], [33014, 62447],
- [62448, 133607], [32927, 62451], [40647, 62452], [19661, 62453],
- [40393, 62454], [40460, 62455], [19518, 62456], [62457, 171510],
- [62458, 159758], [40458, 62459], [62460, 172339], [13761, 62461],
- [28314, 62463], [33342, 62464], [29977, 62465], [18705, 62467],
- [39532, 62468], [39567, 62469], [40857, 62470], [31111, 62471],
- [62472, 164972], [62473, 138698], [62474, 132560], [62475, 142054],
- [20004, 62476], [20096, 62478], [20103, 62479], [20159, 62480],
- [20203, 62481], [20279, 62482], [13388, 62483], [20413, 62484],
- [15944, 62485], [20483, 62486], [13437, 62488], [13477, 62490],
- [22789, 62492], [20955, 62493], [20988, 62494], [20105, 62496],
- [21136, 62498], [21287, 62499], [13767, 62500], [21417, 62501],
- [13649, 62502], [21424, 62503], [21539, 62506], [13677, 62507],
- [13682, 62508], [13953, 62509], [21651, 62510], [21667, 62511],
- [21684, 62512], [21689, 62513], [21712, 62514], [21743, 62515],
- [21784, 62516], [21795, 62517], [21800, 62518], [13720, 62519],
- [13733, 62521], [13759, 62522], [21975, 62523], [13765, 62524],
- [62525, 163204], [16467, 62538], [62551, 135412], [62555, 134155],
- [62574, 161992], [62580, 155813], [62583, 142668], [62585, 135287],
- [62587, 135279], [62595, 139681], [62609, 134550], [16571, 62611],
- [62631, 142537], [22098, 62641], [62642, 134961], [62657, 157724],
- [62659, 135375], [62660, 141315], [62661, 141625], [13819, 62662],
- [62663, 152035], [62664, 134796], [62665, 135053], [62666, 134826],
- [16275, 62667], [62668, 134960], [62669, 134471], [62670, 135503],
- [62671, 134732], [62673, 134827], [62674, 134057], [62675, 134472],
- [62676, 135360], [62677, 135485], [16377, 62678], [62679, 140950],
- [25650, 62680], [62681, 135085], [62682, 144372], [62685, 134526],
- [62686, 134527], [62688, 142421], [62690, 134808], [62692, 134958],
- [62694, 158544], [21708, 62699], [33476, 62700], [21945, 62701],
- [62703, 171715], [39974, 62704], [39606, 62705], [62707, 142830],
- [33004, 62710], [23580, 62711], [62712, 157042], [33076, 62713],
- [14231, 62714], [62716, 164029], [37302, 62717], [62718, 134906],
- [62719, 134671], [62720, 134775], [62721, 134907], [62723, 151019],
- [13833, 62724], [62725, 134358], [22191, 62726], [62727, 141237],
- [62728, 135369], [62729, 134672], [62730, 134776], [62731, 135288],
- [62732, 135496], [62733, 164359], [62734, 136277], [62735, 134777],
- [62736, 151120], [62737, 142756], [23124, 62738], [62739, 135197],
- [62740, 135198], [62741, 135413], [62742, 135414], [22428, 62743],
- [62744, 134673], [62745, 161428], [62746, 164557], [62747, 135093],
- [62748, 134779], [62749, 151934], [14083, 62750], [62751, 135094],
- [62752, 135552], [62753, 152280], [62754, 172733], [62755, 149978],
- [62756, 137274], [62757, 147831], [62758, 164476], [22681, 62759],
- [21096, 62760], [13850, 62761], [62762, 153405], [31666, 62763],
- [23400, 62764], [18432, 62765], [19244, 62766], [40743, 62767],
- [18919, 62768], [39967, 62769], [39821, 62770], [62771, 154484],
- [62772, 143677], [22011, 62773], [13810, 62774], [22153, 62775],
- [23870, 63028], [23880, 63029], [15868, 63031], [14351, 63032],
- [23972, 63033], [23993, 63034], [14368, 63035], [24357, 63039],
- [24451, 63040], [14600, 63041], [14655, 63043], [14669, 63044],
- [24791, 63045], [24893, 63046], [23781, 63047], [14729, 63048],
- [25015, 63049], [25039, 63051], [14776, 63052], [25132, 63053],
- [25317, 63055], [14840, 63057], [22193, 63058], [14851, 63059],
- [25570, 63060], [25595, 63061], [25607, 63062], [14923, 63064],
- [25792, 63065], [40863, 63068], [14999, 63069], [25990, 63070],
- [15037, 63071], [26111, 63072], [26195, 63073], [15090, 63074],
- [26258, 63075], [15138, 63076], [26390, 63077], [15170, 63078],
- [26532, 63079], [15192, 63081], [26698, 63082], [26756, 63083],
- [15218, 63084], [15217, 63085], [15227, 63086], [26889, 63087],
- [26947, 63088], [29276, 63089], [26980, 63090], [27039, 63091],
- [27013, 63092], [27094, 63094], [15325, 63095], [27237, 63096],
- [27252, 63097], [27249, 63098], [27266, 63099], [15340, 63100],
- [27289, 63101], [15346, 63102], [27307, 63103], [27317, 63104],
- [27348, 63105], [27382, 63106], [27521, 63107], [27585, 63108],
- [27626, 63109], [27765, 63110], [27818, 63111], [15563, 63112],
- [27906, 63113], [27910, 63114], [27942, 63115], [28033, 63116],
- [15599, 63117], [28068, 63118], [28081, 63119], [28181, 63120],
- [28184, 63121], [28201, 63122], [28294, 63123], [63124, 166336],
- [28347, 63125], [28386, 63126], [28378, 63127], [40831, 63128],
- [28392, 63129], [28393, 63130], [28452, 63131], [28468, 63132],
- [15686, 63133], [63134, 147265], [28545, 63135], [28606, 63136],
- [15722, 63137], [15733, 63138], [29111, 63139], [23705, 63140],
- [15754, 63141], [28716, 63142], [15761, 63143], [28752, 63144],
- [28756, 63145], [28783, 63146], [28799, 63147], [63149, 131877],
- [17345, 63150], [13809, 63151], [63152, 134872], [13902, 58134],
- [15789, 58172], [58173, 154725], [26237, 58183], [31860, 58188],
- [29837, 58197], [32402, 58215], [17667, 58232], [58260, 151480],
- [58270, 133901], [58277, 158474], [13438, 58311], [58317, 143087],
- [58325, 146613], [58343, 159385], [34673, 58364], [25537, 58385],
- [30583, 58387], [35210, 58390], [58406, 147343], [35660, 58415],
- [58440, 150729], [18730, 58464], [58471, 172052], [58472, 165564],
- [58473, 165121], [15088, 58490], [28815, 58511], [58529, 140922],
- [58637, 158120], [58646, 148043], [26760, 58662], [58664, 139611],
- [40802, 58702], [37830, 58793], [58802, 131967], [37734, 58888],
- [37519, 58901], [34324, 58954], [58986, 173147], [16784, 59010],
- [26511, 59045], [26654, 59048], [14435, 59051], [59077, 149996],
- [15129, 59128], [33942, 59176], [59241, 149858], [14818, 59254],
- [33920, 59259], [17262, 59328], [38769, 59402], [39323, 59427],
- [18733, 59499], [28439, 59703], [59704, 160009], [28838, 59746],
- [59752, 150095], [32357, 59753], [23855, 59755], [15859, 59756],
- [59758, 150109], [59759, 137183], [32164, 59760], [33830, 59761],
- [21637, 59762], [59763, 146170], [59765, 131604], [22398, 59766],
- [59767, 133333], [59768, 132633], [16357, 59769], [59770, 139166],
- [59771, 172726], [28675, 59772], [59773, 168283], [23920, 59774],
- [29583, 59775], [59777, 166489], [59778, 168992], [20424, 59779],
- [32743, 59780], [29456, 59782], [29496, 59784], [29505, 59787],
- [16041, 59789], [29173, 59792], [59793, 149746], [29665, 59794],
- [16074, 59796], [16081, 59798], [29721, 59801], [29726, 59802],
- [29727, 59803], [16098, 59804], [16112, 59805], [16116, 59806],
- [16122, 59807], [29907, 59808], [16142, 59809], [16211, 59810],
- [30061, 59812], [30066, 59813], [30093, 59814], [16252, 59815],
- [30152, 59816], [30285, 59819], [30324, 59821], [16348, 59822],
- [30330, 59823], [29064, 59825], [22051, 59826], [35200, 59827],
- [16413, 59829], [30531, 59830], [16441, 59831], [16453, 59833],
- [13787, 59834], [30616, 59835], [16490, 59836], [16495, 59837],
- [30654, 59839], [30667, 59840], [30744, 59842], [30748, 59844],
- [30791, 59847], [30801, 59848], [30822, 59849], [33864, 59850],
- [59851, 152885], [31027, 59852], [31026, 59854], [16649, 59856],
- [31121, 59857], [31238, 59860], [16743, 59862], [16818, 59864],
- [31420, 59865], [33401, 59866], [16836, 59867], [31439, 59868],
- [31451, 59869], [16847, 59870], [31586, 59872], [31596, 59873],
- [31611, 59874], [31762, 59875], [16992, 59877], [17018, 59878],
- [31867, 59879], [31900, 59880], [17036, 59881], [31928, 59882],
- [17044, 59883], [36755, 59885], [28864, 59886], [59887, 134351],
- [32207, 59888], [32212, 59889], [32208, 59890], [32253, 59891],
- [32692, 59893], [29343, 59894], [17303, 59895], [32800, 59896],
- [32805, 59897], [32814, 59899], [32817, 59900], [32852, 59901],
- [22452, 59903], [28832, 59904], [32951, 59905], [33001, 59906],
- [17389, 59907], [33036, 59908], [33038, 59910], [33042, 59911],
- [33044, 59913], [17409, 59914], [15161, 59915], [33110, 59916],
- [33113, 59917], [33114, 59918], [17427, 59919], [33148, 59921],
- [17445, 59923], [17453, 59925], [33189, 59926], [22511, 59927],
- [33217, 59928], [33252, 59929], [33364, 59930], [17551, 59931],
- [33398, 59933], [33482, 59934], [33496, 59935], [17584, 59937],
- [33623, 59938], [38505, 59939], [33797, 59941], [28917, 59942],
- [33892, 59943], [33928, 59945], [17668, 59946], [33982, 59947],
- [34017, 59948], [34040, 59949], [34064, 59950], [34104, 59951],
- [34130, 59952], [17723, 59953], [34159, 59954], [34160, 59955],
- [34272, 59956], [17783, 59957], [34418, 59958], [34450, 59959],
- [34543, 59961], [38469, 59962], [17926, 59964], [17943, 59965],
- [34990, 59966], [35071, 59967], [35108, 59968], [35217, 59970],
- [59971, 162151], [35384, 59973], [35476, 59974], [35508, 59975],
- [35921, 59976], [36052, 59977], [36082, 59978], [36124, 59979],
- [18328, 59980], [36291, 59982], [18413, 59983], [36410, 59985],
- [22356, 59987], [22005, 59989], [18487, 59991], [36558, 59992],
- [36578, 59993], [36580, 59994], [36589, 59995], [36594, 59996],
- [36801, 59998], [36810, 59999], [36812, 60000], [36915, 60001],
- [18605, 60003], [39136, 60004], [37395, 60005], [18718, 60006],
- [37416, 60007], [37464, 60008], [37483, 60009], [37553, 60010],
- [37550, 60011], [37567, 60012], [37603, 60013], [37611, 60014],
- [37619, 60015], [37620, 60016], [37629, 60017], [37699, 60018],
- [37764, 60019], [37805, 60020], [18757, 60021], [18769, 60022],
- [37911, 60024], [37917, 60026], [37933, 60027], [37950, 60028],
- [18794, 60029], [37972, 60030], [38009, 60031], [38189, 60032],
- [38306, 60033], [18855, 60034], [38388, 60035], [38451, 60036],
- [18917, 60037], [18980, 60039], [38720, 60040], [18997, 60041],
- [38834, 60042], [38850, 60043], [19172, 60045], [39097, 60047],
- [19225, 60048], [39153, 60049], [22596, 60050], [39193, 60052],
- [39223, 60055], [39261, 60057], [39266, 60058], [19312, 60059],
- [39365, 60060], [19357, 60061], [39484, 60062], [39695, 60063],
- [39785, 60065], [39901, 60067], [39921, 60068], [39924, 60069],
- [19565, 60070], [39968, 60071], [14191, 60072], [60073, 138178],
- [40265, 60074], [40702, 60076], [22096, 60077], [40381, 60079],
- [40444, 60081], [38134, 60082], [36790, 60083], [40625, 60086],
- [40637, 60087], [40646, 60088], [38108, 60089], [40674, 60090],
- [40689, 60091], [40696, 60092], [40772, 60094], [60095, 131220],
- [60096, 131767], [60097, 132000], [38083, 60099], [60101, 132311],
- [38081, 60103], [60105, 132565], [60106, 132629], [60107, 132726],
- [60108, 136890], [22359, 60109], [29043, 60110], [60111, 133826],
- [60112, 133837], [60113, 134079], [60115, 194619], [60116, 134091],
- [21662, 60117], [60118, 134139], [60119, 134203], [60120, 134227],
- [60121, 134245], [60122, 134268], [60124, 134285], [60126, 134325],
- [60127, 134365], [60128, 134381], [60129, 134511], [60130, 134578],
- [60131, 134600], [60135, 134660], [60136, 134670], [60137, 134871],
- [60138, 135056], [60139, 134957], [60140, 134771], [60142, 135100],
- [60144, 135260], [60145, 135247], [60146, 135286], [60149, 135304],
- [60150, 135318], [13895, 60151], [60152, 135359], [60154, 135471],
- [60155, 135483], [21348, 60156], [60158, 135907], [60159, 136053],
- [60160, 135990], [60162, 136567], [60163, 136729], [60164, 137155],
- [60165, 137159], [28859, 60167], [60168, 137261], [60169, 137578],
- [60170, 137773], [60171, 137797], [60172, 138282], [60173, 138352],
- [60174, 138412], [60175, 138952], [60177, 138965], [60178, 139029],
- [29080, 60179], [60181, 139333], [27113, 60182], [14024, 60183],
- [60184, 139900], [60185, 140247], [60186, 140282], [60187, 141098],
- [60188, 141425], [60189, 141647], [60191, 141671], [60192, 141715],
- [60193, 142037], [60195, 142056], [60197, 142094], [60199, 142143],
- [60202, 142412], [60204, 142472], [60205, 142519], [60206, 154600],
- [60207, 142600], [60208, 142610], [60209, 142775], [60210, 142741],
- [60211, 142914], [60212, 143220], [60213, 143308], [60214, 143411],
- [60215, 143462], [60216, 144159], [60217, 144350], [60222, 144743],
- [60223, 144883], [60227, 144922], [60228, 145174], [22709, 60231],
- [60234, 146087], [60237, 146961], [60238, 147129], [60243, 147737],
- [60245, 148206], [60246, 148237], [60248, 148276], [60249, 148374],
- [60258, 148484], [60259, 148694], [22408, 60260], [60261, 149108],
- [60263, 149295], [60271, 149522], [60272, 149755], [60273, 150037],
- [60275, 150208], [22885, 60277], [60279, 151430], [60282, 151596],
- [22335, 60284], [60286, 152217], [60287, 152601], [60291, 152646],
- [60292, 152686], [60296, 152895], [60298, 152926], [60300, 152930],
- [60301, 152934], [60302, 153543], [60304, 153693], [60309, 153859],
- [60312, 154286], [60313, 154505], [60314, 154630], [22433, 60316],
- [29009, 60317], [60319, 155906], [60322, 156082], [60325, 156674],
- [60326, 156746], [60330, 156804], [60334, 156808], [60336, 156946],
- [60338, 157119], [60339, 157365], [22201, 60347], [60349, 157436],
- [13848, 60355], [60357, 157593], [60358, 157806], [60360, 157790],
- [60362, 157895], [60366, 157990], [60368, 158009], [60371, 158202],
- [60373, 158253], [60378, 158260], [60379, 158555], [60383, 158621],
- [60385, 158884], [60388, 159150], [60392, 159819], [60393, 160205],
- [60395, 160384], [60396, 160389], [60399, 160395], [60401, 160486],
- [38047, 60404], [60405, 160848], [14009, 60416], [60424, 161740],
- [60425, 161880], [22230, 60426], [60435, 162269], [60441, 162301],
- [60442, 162314], [60443, 162571], [60444, 163174], [60448, 163849],
- [60459, 163875], [60463, 163912], [60466, 163971], [60479, 163984],
- [60480, 164084], [60481, 164142], [60483, 164175], [60485, 164271],
- [60486, 164378], [60487, 164614], [60488, 164655], [60489, 164746],
- [60491, 164968], [60492, 165546], [25574, 60494], [60495, 166230],
- [60498, 166328], [60500, 166375], [60502, 166376], [60503, 166726],
- [60504, 166868], [60506, 166921], [60508, 167877], [60509, 168172],
- [60511, 168208], [60512, 168252], [15863, 60513], [60514, 168286],
- [60515, 150218], [36816, 60516], [60519, 169191], [60521, 169392],
- [60522, 169400], [60523, 169778], [60524, 170193], [60525, 170313],
- [60526, 170346], [60527, 170435], [60528, 170536], [60529, 170766],
- [60530, 171354], [60531, 171419], [32415, 60532], [60533, 171768],
- [60534, 171811], [19620, 60535], [38215, 60536], [60537, 172691],
- [29090, 60538], [60539, 172799], [60542, 173515], [19868, 60543],
- [60544, 134300], [36798, 60545], [36794, 60547], [60548, 140464],
- [36793, 60549], [60550, 150163], [20202, 60555], [60557, 166700],
- [36480, 60560], [60561, 137205], [60563, 166764], [60564, 166809],
- [60566, 157359], [60568, 161365], [60570, 153141], [60571, 153942],
- [20122, 60572], [60573, 155265], [60576, 134765], [60579, 147080],
- [60580, 150686], [60583, 137206], [60584, 137339], [60587, 154698],
- [60589, 152337], [15814, 60590], [60596, 155352], [19996, 60600],
- [60601, 135146], [60602, 134473], [60603, 145082], [60638, 151880],
- [21982, 60644], [34694, 60672], [60676, 135361], [60679, 149254],
- [23440, 60680], [60682, 157843], [60684, 141044], [60685, 163119],
- [60686, 147875], [60687, 163187], [60688, 159440], [60689, 160438],
- [60691, 135641], [60693, 146684], [60694, 173737], [60695, 134828],
- [60698, 138402], [60700, 151490], [60702, 135147], [60706, 142752],
- [60710, 135148], [60711, 134666], [60714, 135149], [60717, 135559],
- [19994, 60721], [19972, 60722], [23309, 60724], [13996, 60727],
- [21373, 60729], [13989, 60730], [22682, 60732], [60733, 150382],
- [22442, 60736], [60737, 154261], [60738, 133497], [60741, 140389],
- [60746, 146686], [60747, 171824], [60749, 151465], [60750, 169374],
- [60753, 146870], [60755, 157619], [60756, 145184], [60759, 147191],
- [60760, 146988], [60785, 143578], [60789, 135849], [22439, 60790],
- [60791, 149859], [60794, 159918], [60801, 137068], [60806, 160100],
- [60809, 159010], [60810, 150242], [39963, 60837], [60838, 149822],
- [15878, 60846], [60881, 159011], [60887, 132092], [60891, 146685],
- [60893, 149785], [22394, 60904], [21722, 60912], [29050, 60928],
- [60949, 150135], [60955, 166490], [60962, 194624], [60976, 137275],
- [61000, 155993], [61014, 144373], [61019, 166850], [61024, 138566],
- [61054, 159441], [13877, 61065], [61084, 166701], [21024, 61088],
- [15384, 61089], [61090, 146631], [61091, 155351], [61092, 161366],
- [61093, 152881], [61094, 137540], [61096, 170243], [61097, 159196],
- [61098, 159917], [61100, 156077], [61101, 166415], [61102, 145015],
- [61103, 131310], [61104, 157766], [61105, 151310], [17762, 61106],
- [23327, 61107], [61108, 156492], [40784, 61109], [40614, 61110],
- [61111, 156267], [20962, 57415], [21314, 57416], [26285, 57520],
- [22620, 57547], [21843, 57566], [15749, 57594], [24928, 57608],
- [18606, 57668], [38845, 57676], [57693, 137335], [24755, 57703],
- [33828, 57711], [38932, 57748], [57749, 147596], [57764, 143486],
- [57787, 138813], [15147, 57798], [15666, 57824], [57857, 132021],
- [28801, 57944], [23708, 57959], [58017, 132547], [14128, 58028],
- [58096, 136054], [58097, 150034], [58111, 166699], [58112, 155779],
- [256, 62233], [193, 62234], [461, 62235], [192, 62236], [274, 62237],
- [201, 62238], [282, 62239], [200, 62240], [332, 62241], [211, 62242],
- [465, 62243], [210, 62244], 62245, [7870, 62246], 62247, [7872, 62248],
- [202, 62249], [257, 62250], [225, 62251], [462, 62252], [224, 62253],
- [593, 62254], [275, 62255], [233, 62256], [283, 62257], [232, 62258],
- [299, 62259], [237, 62260], [464, 62261], [236, 62262], [333, 62263],
- [243, 62264], [466, 62265], [242, 62266], [363, 62267], [250, 62268],
- [468, 62269], [249, 62270], [470, 62271], [472, 62272], [474, 62273],
- [476, 62274], [252, 62275], 62276, [7871, 62277], 62278, [7873, 62279],
- [234, 62280], [609, 62281], [643, 63551], [592, 63552], [603, 63553],
- [596, 63554], [629, 63555], [339, 63556], [248, 63557], [331, 63558],
- [650, 63559], [618, 63560], {f: 2, c: 62282}, [11933, 63530],
- [11974, 63539], [12003, 63547], 20539, 28158, [62841, 171123], 62842,
- [15817, 62843], 34959, [62845, 147790], 28791, 23797, [19232, 62848],
- [62849, 152013], [13657, 62850], [62851, 154928], 24866, [62853, 166450],
- 36775, 37366, 29073, 26393, 29626, [62859, 144001], [62860, 172295],
- [15499, 62861], [62862, 137600], [19216, 62863], 30948, 29698, 20910,
- [62867, 165647], [16393, 62868], 27235, [62870, 172730], [16931, 62871],
- 34319, 31274, [62875, 170311], [62876, 166634], 38741, 28749, 21284,
- [62880, 139390], 37876, 30425, [62883, 166371], 62884, 30685, 20131, 20464,
- 20668, 20015, 20247, 62891, 21556, 32139, 22674, 22736, [62896, 138678],
- 24210, 24217, 24514, [62900, 141074], 25995, [62902, 144377], 26905, 27203,
- [62905, 146531], 27903, 29184, [62909, 148741], 29580, [16091, 62911],
- [62912, 150035], 23317, 29881, 35715, [62916, 154788], [62917, 153237],
- 31379, 31724, 31939, 32364, 33528, 34199, 62924, 34960, 62926, 36537,
- 62928, 36815, 34143, 39392, 37409, 62933, [62934, 167353], [62935, 136255],
- [16497, 62936], [17058, 62937], 23066, 39016, 26475, [17014, 62944], 22333,
- 34262, [62948, 149883], 33471, [62950, 160013], [19585, 62951],
- [62952, 159092], 23931, [62954, 158485], [62955, 159678], {f: 2, c: 62956},
- 23446, 62959, 32347],
- 'Adobe-GB1': [{f: 95, c: 32}, {f: 3, c: 12288}, [183, 12539], 713, 711, 168,
- 12291, 12293, 8212, 65374, 8214, [8230, 8943], {f: 2, c: 8216},
- {f: 2, c: 8220}, {f: 2, c: 12308}, {f: 8, c: 12296}, {f: 2, c: 12310},
- {f: 2, c: 12304}, 177, 215, 247, 8758, {f: 2, c: 8743}, 8721, 8719, 8746,
- 8745, 8712, 8759, 8730, 8869, 8741, 8736, 8978, 8857, 8747, 8750, 8801,
- 8780, 8776, 8765, 8733, 8800, {f: 2, c: 8814}, {f: 2, c: 8804}, 8734, 8757,
- 8756, 9794, 9792, 176, {f: 2, c: 8242}, 8451, 65284, 164, {f: 2, c: 65504},
- 8240, 167, 8470, 9734, 9733, 9675, 9679, 9678, 9671, 9670, 9633, 9632,
- 9651, 9650, 8251, 8594, {f: 2, c: 8592}, 8595, 12307, {f: 20, c: 9352},
- {f: 20, c: 9332}, {f: 10, c: 9312}, {f: 10, c: 12832}, {f: 12, c: 8544},
- {f: 3, c: 65281}, 65509, {f: 89, c: 65285}, 65507, {f: 83, c: 12353},
- {f: 86, c: 12449}, {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945},
- {f: 7, c: 963}, {f: 7, c: 59277}, {f: 2, c: 65077}, {f: 2, c: 65081},
- {f: 2, c: 65087}, {f: 2, c: 65085}, {f: 4, c: 65089}, {f: 2, c: 59284},
- {f: 2, c: 65083}, {f: 2, c: 65079}, 65073, 59286, {f: 2, c: 65075},
- {f: 6, c: 1040}, 1025, {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, 257, 225,
- 462, 224, 275, 233, 283, 232, 299, 237, 464, 236, 333, 243, 466, 242, 363,
- 250, 468, 249, 470, 472, 474, 476, 252, 234, 593, 7743, 324, 328, 505, 609,
- {f: 37, c: 12549}, 0, {f: 76, c: 9472}, {s: 126}, 21834, 38463, 22467,
- 25384, 21710, 21769, 21696, 30353, 30284, 34108, 30702, 33406, 30861,
- 29233, 38552, 38797, 27688, 23433, 20474, 25353, 26263, 23736, 33018,
- 26696, 32942, 26114, 30414, 20985, 25942, 29100, 32753, 34948, 20658,
- 22885, 25034, 28595, 33453, 25420, 25170, 21485, 21543, 31494,
- [12043, 20843], 30116, 24052, 25300, 36299, 38774, 25226, 32793, 22365,
- 38712, 32610, 29240, [12137, 30333], 26575, 30334, 25670, 20336, 36133,
- 25308, 31255, 26001, 29677, 25644, 25203, 33324, 39041, 26495, 29256,
- 25198, 25292, 20276, 29923, 21322, 21150, 32458, 37030, 24110, 26758,
- 27036, 33152, 32465, 26834, 30917, 34444, 38225, 20621, 35876, 33502,
- 32990, 21253, 35090, 21093, 34180, 38649, 20445, 22561, 39281, 23453,
- 25265, 25253, 26292, 35961, 40077, 29190, 26479, 30865, 24754, 21329,
- 21271, 36744, 32972, 36125, 38049, 20493, 29384, 22791, 24811, 28953,
- 34987, 22868, 33519, 26412, 31528, 23849, 32503, 29997, 27893, 36454,
- 36856, 36924, [12240, 40763], [12112, 27604], 37145, 31508, 24444, 30887,
- 34006, 34109, 27605, 27609, 27606, 24065, 24199, 30201, 38381, 25949,
- 24330, 24517, 36767, 22721, 33218, 36991, 38491, 38829, 36793, 32534,
- 36140, 25153, 20415, 21464, 21342, {f: 2, c: 36776}, 36779, 36941, 26631,
- 24426, 33176, 34920, 40150, 24971, 21035, 30250, 24428, 25996, 28626,
- 28392, 23486, 25672, 20853, 20912, 26564, 19993, 31177, 39292, 28851,
- 30149, 24182, 29627, 33760, 25773, 25320, 38069, 27874, 21338, 21187,
- 25615, 38082, 31636, 20271, 24091, 33334, 33046, 33162, 28196, 27850,
- 39539, 25429, [12056, 21340], 21754, 34917, 22496, 19981, 24067, 27493,
- 31807, 37096, 24598, 25830, 29468, 35009, 26448, 25165, 36130, 30572,
- 36393, 37319, 24425, 33756, 34081, 39184, 21442, 34453, 27531, 24813,
- 24808, 28799, 33485, 33329, 20179, 27815, 34255, 25805, 31961, 27133,
- 26361, 33609, 21397, 31574, 20391, 20876, 27979, 23618, 36461, 25554,
- 21449, 33580, 33590, 26597, 30900, 25661, 23519, 23700, 24046, 35815,
- 25286, 26612, 35962, 25600, 25530, 34633, 39307, 35863, 32544, 38130,
- 20135, 38416, 39076, 26124, 29462, 22330, 23581, 24120, 38271, 20607,
- 32928, [12058, 21378], 25950, 30021, 21809, 20513, 36229, 25220, 38046,
- 26397, 22066, 28526, 24034, 21557, 28818, 36710, 25199, 25764, 25507,
- 24443, 28552, 37108, [12162, 33251], [12192, 36784], 23576, 26216, 24561,
- 27785, 38472, 36225, 34924, 25745, 31216, 22478, 27225, 25104, 21576,
- 20056, 31243, 24809, 28548, 35802, 25215, 36894, 39563, 31204, 21507,
- 30196, 25345, 21273, 27744, 36831, 24347, 39536, 32827, 40831, 20360,
- 23610, [12186, 36196], 32709, 26021, 28861, 20805, 20914, [12173, 34411],
- 23815, 23456, 25277, 37228, 30068, 36364, 31264, 24833, 31609, 20167,
- 32504, 30597, 19985, 33261, 21021, 20986, 27249, 21416, 36487, 38148,
- 38607, 28353, 38500, 26970, 30784, 20648, 30679, 25616, 35302, 22788,
- 25571, 24029, 31359, 26941, 20256, 33337, 21912, 20018, 30126, 31383,
- 24162, 24202, 38383, 21019, 21561, 28810, 25462, 38180, 22402, 26149,
- 26943, 37255, 21767, 28147, 32431, 34850, 25139, 32496, 30133, 33576,
- 30913, 38604, 36766, 24904, 29943, 35789, 27492, 21050, 36176, 27425,
- 32874, 33905, 22257, 21254, 20174, 19995, 20945, 31895, 37259, 31751,
- 20419, 36479, 31713, 31388, 25703, 23828, 20652, 33030, 30209, 31929,
- 28140, 32736, 26449, 23384, [12072, 23544], 30923, 25774, 25619, 25514,
- 25387, 38169, 25645, 36798, 31572, 30249, 25171, [12068, 22823], 21574,
- [12109, 27513], 20643, 25140, 24102, 27526, 20195, 36151, 34955, 24453,
- 36910, 24608, 32829, 25285, 20025, 21333, 37112, 25528, 32966, 26086,
- 27694, 20294, 24814, 28129, 35806, 24377, 34507, 24403, 25377, 20826,
- 33633, 26723, [12049, 20992], 25443, 36424, 20498, 23707, 31095, 23548,
- 21040, 31291, 24764, 36947, 30423, 24503, 24471, 30340, 36460, 28783,
- 30331, 31561, 30634, 20979, 37011, 22564, 20302, 28404, 36842, 25932,
- 31515, 29380, 28068, 32735, 23265, 25269, 24213, 22320, 33922, 31532,
- 24093, 24351, 36882, 32532, 39072, 25474, 28359, 30872, 28857, 20856,
- 38747, 22443, 30005, 20291, 30008, 24215, 24806, 22880, 28096, 27583,
- 30857, 21500, 38613, 20939, 20993, 25481, 21514, 38035, 35843, 36300,
- 29241, 30879, 34678, 36845, 35853, 21472, 19969, 30447, 21486, 38025,
- 39030, [12237, 40718], 38189, 23450, 35746, 20002, 19996, 20908, 33891,
- 25026, 21160, 26635, 20375, 24683, 20923, 27934, 20828, 25238,
- [12099, 26007], 38497, [12182, 35910], 36887, 30168, 37117, 30563, 27602,
- 29322, 29420, 35835, 22581, 30585, 36172, 26460, 38208, 32922, 24230,
- 28193, 22930, 31471, 30701, 38203, 27573, 26029, 32526, 22534, 20817,
- 38431, 23545, 22697, 21544, 36466, 25958, 39039, 22244, 38045, 30462,
- 36929, 25479, 21702, 22810, 22842, 22427, 36530, 26421, 36346, 33333,
- 21057, 24816, 22549, 34558, 23784, 40517, 20420, 39069, 35769, 23077,
- 24694, 21380, 25212, 36943, 37122, 39295, 24681, [12157, 32780],
- [12041, 20799], [12159, 32819], 23572, 39285, 27953, [12038, 20108], 36144,
- 21457, 32602, 31567, 20240, 20047, 38400, 27861, 29648, 34281, 24070,
- 30058, 32763, 27146, 30718, 38034, 32321, 20961, 28902, 21453, 36820,
- 33539, 36137, 29359, 39277, 27867, 22346, 33459, [12101, 26041], 32938,
- 25151, 38450, 22952, 20223, 35775, 32442, 25918, 33778, [12206, 38750],
- 21857, 39134, 32933, 21290, 35837, 21536, 32954, 24223, 27832, 36153,
- 33452, 37210, 21545, 27675, 20998, 32439, 22367, 28954, 27774, 31881,
- 22859, 20221, 24575, 24868, 31914, 20016, 23553, 26539, 34562, 23792,
- 38155, 39118, 30127, 28925, 36898, 20911, 32541, 35773, 22857, 20964,
- 20315, 21542, 22827, 25975, 32932, 23413, 25206, 25282, 36752, 24133,
- 27679, 31526, 20239, 20440, 26381, 28014, 28074, 31119, 34993, 24343,
- 29995, 25242, 36741, 20463, 37340, 26023, 33071, 33105, 24220, 33104,
- 36212, 21103, 35206, 36171, 22797, 20613, 20184, [12201, 38428],
- [12119, 29238], 33145, 36127, 23500, 35747, 38468, 22919, 32538, 21648,
- 22134, 22030, 35813, 25913, 27010, 38041, 30422, 28297, [12082, 24178],
- [12130, 29976], 26438, 26577, 31487, 32925, 36214, 24863, 31174, 25954,
- 36195, 20872, 21018, 38050, 32568, 32923, 32434, 23703, 28207, 26464,
- 31705, 30347, [12220, 39640], 33167, 32660, 31957, 25630, 38224, 31295,
- 21578, 21733, 27468, 25601, [12093, 25096], 40509, 33011, 30105, 21106,
- [12208, 38761], 33883, 26684, 34532, 38401, 38548, 38124, 20010, 21508,
- 32473, 26681, 36319, 32789, 26356, 24218, 32697, 22466, 32831, 26775,
- [12079, 24037], 25915, 21151, 24685, 40858, 20379, 36524, 20844, 23467,
- [12088, 24339], 24041, 27742, 25329, 36129, 20849, 38057, 21246, 27807,
- 33503, 29399, 22434, 26500, 36141, 22815, 36764, 33735, 21653, 31629,
- 20272, 27837, 23396, 22993, [12238, 40723], 21476, 34506, [12219, 39592],
- [12181, 35895], 32929, 25925, 39038, 22266, 38599, 21038, [12128, 29916],
- 21072, 23521, 25346, 35074, 20054, 25296, 24618, 26874, 20851, 23448,
- 20896, 35266, 31649, 39302, 32592, 24815, 28748, 36143, 20809,
- [12084, 24191], 36891, 29808, 35268, 22317, 30789, 24402, 40863, 38394,
- 36712, [12225, 39740], 35809, 30328, 26690, 26588, 36330, 36149, 21053,
- 36746, 28378, 26829, 38149, 37101, 22269, 26524, 35065, 36807, 21704,
- 39608, 23401, 28023, 27686, 20133, 23475, 39559, 37219, 25000, 37039,
- 38889, 21547, 28085, 23506, 20989, 21898, 32597, 32752, 25788, 25421,
- 26097, 25022, 24717, 28938, 27735, 27721, 22831, 26477, 33322, 22741,
- 22158, 35946, 27627, 37085, 22909, 32791, 21495, 28009, 21621, 21917,
- 33655, 33743, 26680, [12146, 31166], 21644, 20309, 21512, 30418, 35977,
- 38402, 27827, 28088, 36203, 35088, 40548, 36154, 22079, [12234, 40657],
- 30165, 24456, 29408, 24680, 21756, 20136, 27178, 34913, 24658, 36720,
- 21700, 28888, 34425, 40511, 27946, 23439, 24344, 32418, 21897, 20399,
- 29492, 21564, 21402, 20505, 21518, 21628, 20046, 24573, 29786, 22774,
- 33899, 32993, 34676, 29392, 31946, 28246, 24359, 34382, 21804, 25252,
- 20114, 27818, 25143, 33457, 21719, 21326, 29502, 28369, 30011, 21010,
- 21270, 35805, 27088, 24458, 24576, 28142, 22351, 27426, 29615, 26707,
- 36824, 32531, 25442, 24739, 21796, 30186, 35938, 28949, 28067, 23462,
- 24187, 33618, 24908, 40644, 30970, 34647, 31783, 30343, 20976, 24822,
- 29004, 26179, 24140, 24653, 35854, 28784, 25381, 36745, 24509, 24674,
- 34516, 22238, 27585, 24724, 24935, 21321, 24800, 26214, 36159, 31229,
- 20250, 28905, 27719, 35763, 35826, 32472, 33636, 26127, 23130, 39746,
- 27985, 28151, 35905, 27963, 20249, [12117, 28779], 33719, 25110, 24785,
- 38669, 36135, 31096, 20987, 22334, 22522, 26426, 30072, 31293, 31215,
- 31637, 32908, 39269, 36857, 28608, 35749, 40481, 23020, 32489, 32521,
- 21513, 26497, 26840, 36753, 31821, 38598, 21450, 24613, 30142, 27762,
- 21363, 23241, 32423, 25380, [12047, 20960], 33034, [12080, 24049], 34015,
- 25216, 20864, 23395, 20238, 31085, 21058, 24760, 27982, 23492, 23490,
- 35745, 35760, 26082, 24524, 38469, 22931, 32487, 32426, 22025, 26551,
- 22841, 20339, 23478, 21152, 33626, 39050, 36158, 30002, 38078, 20551,
- 31292, 20215, 26550, 39550, 23233, 27516, 30417, 22362, 23574, 31546,
- 38388, 29006, 20860, 32937, 33392, 22904, 32516, 33575, 26816, 26604,
- 30897, 30839, 25315, 25441, 31616, 20461, 21098, 20943, 33616, 27099,
- 37492, 36341, 36145, 35265, 38190, 31661, 20214, 20581, 33328, 21073,
- 39279, 28176, 28293, 28071, 24314, 20725, 23004, 23558, 27974, 27743,
- 30086, 33931, 26728, 22870, 35762, 21280, 37233, 38477, 34121, 26898,
- 30977, 28966, 33014, 20132, 37066, 27975, 39556, 23047, 22204, 25605,
- 38128, 30699, 20389, 33050, 29409, [12179, 35282], 39290, 32564, 32478,
- 21119, 25945, 37237, 36735, 36739, 21483, 31382, 25581, 25509, 30342,
- 31224, 34903, 38454, 25130, 21163, 33410, 26708, 26480, 25463, 30571,
- 31469, 27905, 32467, 35299, 22992, 25106, 34249, 33445, 30028, 20511,
- 20171, 30117, 35819, 23626, [12081, 24062], 31563, [12100, 26020],
- [12198, 37329], 20170, 27941, 35167, 32039, 38182, 20165, 35880, 36827,
- 38771, 26187, 31105, 36817, 28908, 28024, 23613, 21170, 33606, 20834,
- 33550, 30555, 26230, 40120, 20140, 24778, 31934, 31923, 32463, 20117,
- 35686, 26223, 39048, 38745, 22659, 25964, 38236, 24452, 30153, 38742,
- 31455, 31454, 20928, 28847, 31384, 25578, 31350, 32416, 29590,
- [12210, 38893], 20037, 28792, 20061, 37202, 21417, 25937, 26087,
- [12165, 33276], 33285, 21646, 23601, 30106, 38816, 25304, 29401, 30141,
- 23621, 39545, 33738, 23616, 21632, 30697, 20030, 27822, 32858, 25298,
- 25454, 24040, 20855, 36317, 36382, 38191, 20465, 21477, 24807, 28844,
- 21095, 25424, 40515, 23071, 20518, 30519, 21367, 32482, 25733, 25899,
- 25225, 25496, 20500, 29237, 35273, 20915, 35776, 32477, 22343, 33740,
- 38055, 20891, 21531, 23803, 20426, 31459, 27994, 37089, 39567, 21888,
- 21654, 21345, 21679, 24320, 25577, 26999, 20975, 24936, 21002, 22570,
- 21208, 22350, 30733, 30475, 24247, 24951, 31968, 25179, 25239, 20130,
- 28821, 32771, 25335, 28900, 38752, 22391, 33499, 26607, 26869, 30933,
- 39063, 31185, 22771, 21683, 21487, 28212, 20811, 21051, 23458, 35838,
- 32943, 21827, 22438, 24691, 22353, 21549, 31354, 24656, 23380, 25511,
- 25248, [12061, 21475], 25187, 23495, 26543, 21741, 31391, 33510, 37239,
- 24211, 35044, 22840, 22446, 25358, 36328, 33007, 22359, 31607, 20393,
- 24555, 23485, 27454, 21281, 31568, 29378, 26694, 30719, 30518, 26103,
- 20917, 20111, 30420, 23743, 31397, 33909, 22862, 39745, 20608, 39304,
- 24871, 28291, 22372, 26118, 25414, 22256, 25324, 25193, 24275, 38420,
- 22403, 25289, 21895, 34593, 33098, 36771, 21862, 33713, 26469, 36182,
- 34013, 23146, 26639, 25318, 31726, 38417, 20848, 28572, 35888, 25597,
- 35272, 25042, 32518, 28866, 28389, 29701, 27028, 29436, 24266, 37070,
- 26391, 28010, 25438, 21171, 29282, [12156, 32769], 20332, 23013, 37226,
- 28889, 28061, 21202, 20048, 38647, 38253, 34174, 30922, 32047, 20769,
- 22418, 25794, 32907, 31867, 27882, 26865, 26974, 20919, 21400, 26792,
- 29313, 40654, 31729, 29432, 31163, 28435, 29702, 26446, [12197, 37324],
- 40100, 31036, 33673, 33620, 21519, 26647, 20029, 21385, 21169, 30782,
- 21382, 21033, 20616, 20363, 20432, 30178, [12148, 31435], 31890, 27813,
- [12202, 38582], [12050, 21147], 29827, 21737, 20457, 32852, 33714, 36830,
- 38256, 24265, 24604, 28063, 24088, 25947, 33080, 38142, 24651, 28860,
- 32451, 31918, 20937, 26753, 31921, 33391, 20004, 36742, 37327, 26238,
- 20142, 35845, 25769, 32842, 20698, 30103, 29134, 23525, 36797, 28518,
- 20102, 25730, 38243, 24278, 26009, 21015, 35010, 28872, 21155, 29454,
- 29747, 26519, 30967, 38678, 20020, 37051, 40158, 28107, 20955, 36161,
- 21533, 25294, 29618, 33777, 38646, 40836, 38083, 20278, 32666, 20940,
- 28789, 38517, 23725, 39046, 21478, 20196, 28316, 29705, 27060, 30827,
- 39311, 30041, 21016, 30244, 27969, 26611, 20845, 40857, 32843, 21657,
- 31548, 31423, 38534, 22404, 25314, 38471, 27004, 23044, 25602, 31699,
- 28431, 38475, 33446, 21346, 39045, 24208, 28809, 25523, 21348, 34383,
- 40065, 40595, 30860, 38706, 36335, 36162, [12229, 40575], 28510, 31108,
- 24405, 38470, 25134, 39540, 21525, 38109, 20387, 26053, 23653, 23649,
- 32533, 34385, 27695, 24459, 29575, 28388, 32511, 23782, 25371, 23402,
- 28390, 21365, 20081, 25504, 30053, 25249, 36718, 20262, 20177, 27814,
- 32438, 35770, 33821, 34746, 32599, 36923, 38179, 31657, 39585, 35064,
- 33853, 27931, 39558, 32476, 22920, [12231, 40635], 29595, 30721, 34434,
- 39532, 39554, 22043, 21527, 22475, 20080, 40614, 21334, 36808, 33033,
- 30610, 39314, 34542, 28385, 34067, 26364, 24930, 28459, 35881, 33426,
- 33579, 30450, 27667, 24537, 33725, 29483, 33541, 38170, [12113, 27611],
- [12141, 30683], 38086, 21359, 33538, 20882, 24125, 35980, 36152, 20040,
- 29611, 26522, 26757, 37238, 38665, 29028, 27809, 30473, 23186, 38209,
- 27599, 32654, 26151, 23504, 22969, 23194, 38376, 38391, 20204, 33804,
- 33945, 27308, 30431, 38192, 29467, 26790, 23391, 30511, 37274, 38753,
- 31964, 36855, 35868, 24357, [12150, 31859], 31192, 35269, 27852, 34588,
- 23494, 24130, 26825, 30496, 32501, 20885, 20813, 21193, 23081, 32517,
- [12207, 38754], 33495, 25551, 30596, 34256, 31186, 28218, 24217, 22937,
- 34065, 28781, 27665, 25279, [12139, 30399], 25935, 24751, 38397, 26126,
- 34719, 40483, 38125, 21517, 21629, 35884, {f: 2, c: 25720}, 34321, 27169,
- 33180, 30952, 25705, 39764, 25273, 26411, 33707, 22696, 40664, 27819,
- 28448, 23518, 38476, 35851, 29279, 26576, 25287, 29281, 20137, 22982,
- 27597, 22675, 26286, 24149, 21215, 24917, [12106, 26408], [12140, 30446],
- 30566, 29287, 31302, 25343, 21738, 21584, 38048, 37027, 23068, 32435,
- 27670, 20035, 22902, 32784, 22856, 21335, 30007, 38590, 22218, 25376,
- 33041, 24700, 38393, 28118, 21602, 39297, 20869, 23273, 33021, 22958,
- 38675, 20522, 27877, 23612, 25311, 20320, 21311, 33147, 36870, 28346,
- 34091, 25288, 24180, 30910, 25781, 25467, 24565, 23064, 37247, 40479,
- 23615, 25423, 32834, 23421, 21870, 38218, 38221, 28037, 24744, 26592,
- 29406, 20957, 23425, 25319, 27870, [12124, 29275], 25197, 38062, 32445,
- 33043, 27987, 20892, 24324, 22900, 21162, 24594, [12069, 22899], 26262,
- 34384, 30111, 25386, 25062, 31983, 35834, 21734, 27431, 40485, 27572,
- 34261, 21589, 20598, 27812, 21866, 36276, 29228, 24085, 24597, 29750,
- 25293, 25490, 29260, 24472, 28227, 27966, 25856, 28504, 30424, 30928,
- 30460, 30036, 21028, 21467, 20051, 24222, 26049, 32810, 32982, 25243,
- 21638, 21032, 28846, 34957, 36305, 27873, 21624, 32986, 22521, 35060,
- 36180, 38506, 37197, 20329, 27803, 21943, 30406, 30768, 25256, 28921,
- 28558, 24429, 34028, 26842, 30844, 31735, 33192, 26379, 40527, 25447,
- 30896, 22383, 30738, 38713, 25209, 25259, 21128, 29749, 27607, 21860,
- 33086, 30130, [12138, 30382], 21305, 30174, 20731, 23617, 35692, 31687,
- 20559, [12122, 29255], 39575, 39128, 28418, 29922, 31080, 25735, 30629,
- 25340, 39057, 36139, 21697, 32856, 20050, 22378, 33529, 33805, 24179,
- 20973, 29942, 35780, 23631, 22369, 27900, 39047, 23110, 30772, 39748,
- 36843, 31893, 21078, 25169, 38138, 20166, 33670, 33889, 33769, 33970,
- 22484, 26420, 22275, 26222, 28006, 35889, 26333, 28689, 26399, 27450,
- 26646, 25114, 22971, 19971, 20932, 28422, 26578, 27791, 20854, 26827,
- 22855, 27495, 30054, 23822, 33040, 40784, 26071, 31048, 31041, 39569,
- 36215, 23682, 20062, 20225, 21551, 22865, 30732, 22120, [12115, 27668],
- 36804, 24323, 27773, 27875, 35755, 25488, 24688, 27965, 29301, 25190,
- 38030, 38085, 21315, 36801, 31614, 20191, 35878, 20094, 40660, 38065,
- 38067, 21069, 28508, 36963, 27973, 35892, 22545, 23884, [12107, 27424],
- 27465, 26538, 21595, 33108, 32652, 22681, 34103, 24378, 25250, 27207,
- 38201, 25970, 24708, 26725, 30631, 20052, 20392, 24039, 38808, 25772,
- 32728, 23789, 20431, 31373, 20999, 33540, 19988, 24623, 31363, 38054,
- 20405, 20146, 31206, 29748, 21220, 33465, 25810, 31165, 23517, 27777,
- 38738, 36731, 27682, 20542, 21375, 28165, 25806, 26228, 27696, 24773,
- 39031, 35831, 24198, 29756, 31351, 31179, 19992, 37041, 29699, 27714,
- 22234, 37195, 27845, 36235, 21306, 34502, 26354, 36527, 23624, 39537,
- 28192, 21462, 23094, 40843, 36259, 21435, 22280, 39079, 26435, 37275,
- 27849, 20840, 30154, 25331, [12125, 29356], 21048, 21149, 32570, 28820,
- 30264, 21364, 40522, 27063, 30830, 38592, 35033, 32676, 28982, 29123,
- 20873, 26579, 29924, 22756, 25880, 22199, 35753, 39286, 25200, 32469,
- 24825, 28909, 22764, 20161, [12040, 20154], 24525, 38887, 20219, 35748,
- 20995, 22922, 32427, 25172, 20173, [12103, 26085], 25102, 33592, 33993,
- 33635, 34701, 29076, 28342, 23481, 32466, 20887, 25545, 26580,
- [12161, 32905], 33593, 34837, 20754, 23418, 22914, 36785, 20083, 27741,
- [12042, 20837], 35109, 36719, 38446, 34122, 29790, 38160, 38384, 28070,
- 33509, 24369, 25746, 27922, 33832, 33134, 40131, 22622, 36187, 19977,
- 21441, 20254, 25955, 26705, 21971, 20007, 25620, 39578, 25195, 23234,
- 29791, [12170, 33394], 28073, 26862, 20711, 33678, 30722, 26432, 21049,
- 27801, 32433, 20667, 21861, 29022, 31579, 26194, 29642, 33515, 26441,
- [12077, 23665], 21024, 29053, 34923, 38378, 38485, 25797, 36193, 33203,
- 21892, 27733, 25159, 32558, 22674, 20260, 21830, 36175, 26188, 19978,
- 23578, 35059, 26786, 25422, 31245, 28903, 33421, 21242, 38902, 23569,
- 21736, 37045, 32461, 22882, 36170, 34503, [12166, 33292], 33293, 36198,
- 25668, 23556, 24913, 28041, 31038, 35774, 30775, 30003, 21627, 20280,
- [12189, 36523], 28145, 23072, 32453, 31070, 27784, 23457, 23158, 29978,
- 32958, 24910, 28183, 22768, [12131, 29983], 29989, 29298, 21319, 32499,
- 30465, 30427, 21097, 32988, 22307, 24072, 22833, 29422, 26045, 28287,
- 35799, [12075, 23608], 34417, [12055, 21313], [12143, 30707], 25342, 26102,
- 20160, [12215, 39135], 34432, 23454, 35782, 21490, [12142, 30690], 20351,
- 23630, 39542, 22987, 24335, [12144, 31034], [12064, 22763], 19990, 26623,
- 20107, 25325, 35475, 36893, 21183, 26159, 21980, 22124, 36866, 20181,
- 20365, 37322, 39280, [12114, 27663], 24066, 24643, 23460, 35270, 35797,
- 25910, [12095, 25163], [12216, 39318], 23432, 23551, 25480, 21806, 21463,
- 30246, 20861, 34092, 26530, 26803, 27530, 25234, 36755, 21460, 33298,
- 28113, 30095, 20070, 36174, 23408, 29087, 34223, 26257, 26329, 32626,
- 34560, [12233, 40653], [12239, 40736], 23646, 26415, 36848, 26641, 26463,
- 25101, 31446, 22661, 24246, 25968, 28465, 24661, 21047, 32781, 25684,
- 34928, 29993, 24069, 26643, 25332, 38684, 21452, 29245, 35841,
- [12116, 27700], 30561, 31246, 21550, 30636, 39034, 33308, 35828, 30805,
- 26388, 28865, 26031, 25749, 22070, 24605, 31169, 21496, 19997, 27515,
- 32902, 23546, 21987, 22235, 20282, 20284, 39282, 24051, 26494, 32824,
- 24578, 39042, 36865, 23435, 35772, 35829, 25628, 33368, 25822, 22013,
- 33487, 37221, 20439, 32032, 36895, 31903, 20723, 22609, 28335, 23487,
- 35785, 32899, 37240, 33948, 31639, 34429, 38539, 38543, 32485, 39635,
- 30862, 23681, 31319, 36930, 38567, 31071, 23385, 25439, 31499, 34001,
- 26797, 21766, 32553, 29712, 32034, 38145, 25152, 22604, 20182, 23427,
- 22905, 22612, 29549, 25374, 36427, 36367, 32974, 33492, 25260, 21488,
- 27888, 37214, 22826, 24577, 27760, 22349, 25674, 36138, 30251, 28393,
- 22363, 27264, 30192, 28525, 35885, 35848, 22374, 27631, 34962, 30899,
- 25506, 21497, 28845, 27748, 22616, 25642, 22530, 26848, 33179, 21776,
- 31958, 20504, 36538, 28108, 36255, 28907, 25487, 28059, 28372, 32486,
- 33796, 26691, 36867, 28120, 38518, 35752, 22871, 29305, 34276, 33150,
- 30140, 35466, 26799, 21076, 36386, 38161, 25552, 39064, 36420, 21884,
- 20307, 26367, 22159, 24789, 28053, 21059, 23625, 22825, 28155, 22635,
- [12133, 30000], 29980, 24684, 33300, 33094, 25361, 26465, 36834, 30522,
- 36339, 36148, 38081, 24086, 21381, 21548, 28867, 27712, 24311, 20572,
- 20141, 24237, 25402, 33351, 36890, 26704, 37230, 30643, 21516, 38108,
- 24420, 31461, 26742, 25413, 31570, 32479, 30171, 20599, 25237, 22836,
- 36879, 20984, 31171, 31361, 22270, 24466, 36884, 28034, 23648,
- [12063, 22303], 21520, 20820, 28237, 22242, 25512, 39059, 33151, 34581,
- 35114, 36864, 21534, 23663, 33216, 25302, 25176, 33073, 40501, 38464,
- 39534, 39548, 26925, 22949, 25299, 21822, 25366, 21703, 34521, 27964,
- 23043, [12129, 29926], 34972, 27498, 22806, 35916, 24367, 28286, 29609,
- 39037, 20024, 28919, 23436, 30871, 25405, 26202, 30358, 24779, 23451,
- 23113, 19975, 33109, 27754, 29579, 20129, 26505, [12153, 32593], 24448,
- 26106, 26395, 24536, 22916, 23041, 24013, 24494, 21361, 38886, 36829,
- 26693, 22260, 21807, 24799, 20026, 28493, 32500, 33479, 33806, 22996,
- 20255, 20266, 23614, 32428, 26410, 34074, 21619, 30031, 32963, 21890,
- 39759, 20301, 28205, 35859, 23561, 24944, 21355, 30239, 28201, 34442,
- [12098, 25991], 38395, 32441, 21563, 31283, 32010, 38382, 21985, 32705,
- 29934, 25373, 34583, 28065, 31389, 25105, 26017, 21351, 25569, 27779,
- 24043, 21596, 38056, 20044, 27745, 35820, 23627, [12102, 26080], 33436,
- 26791, 21566, 21556, [12111, 27595], 27494, 20116, 25410, 21320, 33310,
- 20237, 20398, 22366, 25098, 38654, 26212, 29289, 21247, 21153, 24735,
- 35823, 26132, 29081, 26512, 35199, 30802, 30717, 26224, 22075, 21560,
- 38177, 29306, 31232, 24687, 24076, 24713, 33181, [12067, 22805], 24796,
- 29060, 28911, 28330, 27728, 29312, 27268, 34989, 24109, 20064, 23219,
- 21916, 38115, 27927, 31995, 38553, 25103, 32454, 30606, 34430, 21283,
- 38686, 36758, 26247, 23777, 20384, 29421, 19979, 21414, 22799, 21523,
- 25472, 38184, 20808, 20185, 40092, 32420, 21688, 36132, 34900, 33335,
- 38386, 28046, 24358, 23244, 26174, 38505, 29616, 29486, 21439, 33146,
- 39301, 32673, 23466, 38519, 38480, 32447, 30456, 21410, 38262,
- [12217, 39321], 31665, 35140, 28248, 20065, 32724, 31077, 35814, 24819,
- 21709, 20139, 39033, 24055, 27233, 20687, 21521, 35937, 33831, 30813,
- 38660, 21066, 21742, 22179, 38144, 28040, 23477, 28102, 26195,
- [12073, 23567], 23389, 26657, 32918, 21880, 31505, 25928, 26964, 20123,
- 27463, 34638, 38795, 21327, 25375, 25658, 37034, 26012, 32961, 35856,
- 20889, 26800, 21368, 34809, 25032, 27844, 27899, 35874, 23633, 34218,
- 33455, 38156, 27427, [12191, 36763], 26032, 24571, [12092, 24515], 20449,
- 34885, 26143, 33125, 29481, 24826, 20852, 21009, 22411, 24418, 37026,
- [12175, 34892], 37266, 24184, 26447, 24615, 22995, 20804, 20982, 33016,
- 21256, 27769, 38596, 29066, 20241, 20462, 32670, 26429, 21957, 38152,
- 31168, 34966, 32483, 22687, 25100, 38656, 34394, 22040, 39035, 24464,
- 35768, 33988, 37207, 21465, 26093, 24207, 30044, 24676, 32110, 23167,
- 32490, 32493, 36713, 21927, 23459, 24748, 26059, [12126, 29572], 36873,
- 30307, 30505, 32474, 38772, 34203, 23398, [12147, 31348], 38634,
- [12174, 34880], 21195, 29071, 24490, 26092, 35810, 23547, 39535, 24033,
- 27529, 27739, 35757, 35759, 36874, 36805, 21387, 25276, 40486, 40493,
- 21568, 20011, 33469, [12123, 29273], 34460, 23830, 34905, 28079, 38597,
- 21713, 20122, 35766, 28937, 21693, 38409, 28895, 28153, 30416, 20005,
- 30740, 34578, 23721, 24310, [12180, 35328], 39068, 38414, 28814, 27839,
- 22852, 25513, 30524, 34893, 28436, 33395, 22576, 29141, 21388, 30746,
- 38593, 21761, 24422, 28976, 23476, 35866, 39564, 27523, 22830, 40495,
- 31207, 26472, 25196, 20335, 30113, [12154, 32650], 27915, 38451, 27687,
- 20208, 30162, 20859, 26679, 28478, 36992, 33136, 22934, 29814, 25671,
- 23591, 36965, 31377, 35875, 23002, 21676, 33280, 33647, 35201, 32768,
- 26928, 22094, 32822, 29239, 37326, 20918, 20063, 39029, 25494, 19994,
- 21494, 26355, 33099, 22812, 28082, [12032, 19968], 22777, 21307, 25558,
- 38129, 20381, 20234, [12176, 34915], 39056, 22839, 36951, 31227, 20202,
- 33008, 30097, 27778, 23452, 23016, 24413, 26885, 34433, 20506, 24050,
- [12036, 20057], 30691, 20197, 33402, 25233, 26131, [12194, 37009], 23673,
- 20159, 24441, 33222, 36920, 32900, 30123, 20134, 35028, 24847, 27589,
- 24518, 20041, 30410, 28322, 35811, 35758, 35850, 35793, 24322, 32764,
- 32716, 32462, 33589, 33643, 22240, 27575, [12211, 38899], 38452, 23035,
- 21535, 38134, 28139, 23493, 39278, 23609, 24341, 38544, 21360, 33521,
- 27185, 23156, 40560, 24212, 32552, 33721, {f: 2, c: 33828}, 33639, 34631,
- 36814, 36194, 30408, 24433, 39062, 30828, 26144, 21727, 25317, 20323,
- 33219, 30152, 24248, 38605, 36362, 34553, 21647, 27891, 28044, 27704,
- 24703, 21191, [12132, 29992], 24189, 20248, 24736, 24551, 23588, 30001,
- 37038, 38080, 29369, 27833, 28216, [12195, 37193], 26377, 21451, 21491,
- 20305, 37321, 35825, [12060, 21448], 24188, 36802, 28132, 20110, 30402,
- 27014, 34398, 24858, 33286, 20313, 20446, 36926, 40060, 24841, 28189,
- 28180, 38533, 20104, 23089, [12204, 38632], 19982, 23679, 31161, 23431,
- 35821, [12155, 32701], [12127, 29577], 22495, 33419, 37057, 21505, 36935,
- 21947, 23786, 24481, 24840, 27442, 29425, 32946, 35465, 28020, 23507,
- 35029, 39044, 35947, 39533, 40499, 28170, 20900, 20803, 22435, 34945,
- 21407, 25588, 36757, 22253, 21592, 22278, 29503, 28304, 32536, 36828,
- 33489, 24895, 24616, 38498, [12104, 26352], 32422, 36234, 36291, 38053,
- 23731, 31908, [12105, 26376], 24742, 38405, 32792, 20113, 37095, 21248,
- 38504, 20801, 36816, 34164, 37213, 26197, 38901, 23381, 21277, 30776,
- 26434, 26685, 21705, 28798, 23472, 36733, 20877, 22312, 21681, 25874,
- 26242, 36190, 36163, 33039, 33900, 36973, 31967, 20991, 34299, 26531,
- 26089, 28577, 34468, 36481, 22122, 36896, 30338, 28790, 29157, 36131,
- 25321, 21017, 27901, 36156, 24590, 22686, 24974, 26366, 36192, 25166,
- 21939, 28195, 26413, 36711, 38113, 38392, 30504, 26629, 27048, 21643,
- 20045, 28856, 35784, 25688, 25995, 23429, 31364, 20538, 23528, 30651,
- 27617, 35449, 31896, 27838, 30415, 26025, 36759, 23853, 23637, 34360,
- 26632, 21344, 25112, 31449, 28251, 32509, 27167, 31456, 24432, 28467,
- 24352, 25484, 28072, 26454, 19976, 24080, 36134, 20183, 32960, 30260,
- 38556, 25307, 26157, 25214, 27836, 36213, 29031, 32617, 20806, 32903,
- 21484, 36974, 25240, 21746, 34544, 36761, 32773, 38167, 34071, 36825,
- 27993, 29645, 26015, 30495, 29956, 30759, 33275, 36126, 38024, 20390,
- 26517, 30137, 35786, 38663, 25391, 38215, 38453, 33976, 25379, 30529,
- 24449, 29424, 20105, 24596, 25972, 25327, 27491, 25919, 24103, 30151,
- 37073, 35777, 33437, 26525, [12096, 25903], 21553, 34584, 30693, 32930,
- 33026, 27713, 20043, 32455, 32844, 30452, 26893, 27542, 25191, 20540,
- 20356, 22336, 25351, [12108, 27490], 36286, 21482, 26088, 32440, 24535,
- 25370, 25527, [12164, 33267], 33268, 32622, 24092, 23769, 21046, 26234,
- 31209, 31258, 36136, 28825, 30164, 28382, 27835, 31378, 20013, 30405,
- 24544, 38047, 34935, 32456, 31181, 32959, 37325, 20210, 20247,
- [12168, 33311], 21608, 24030, 27954, 35788, 31909, 36724, 32920, 24090,
- 21650, 30385, 23449, 26172, 39588, 29664, 26666, 34523, 26417, 29482,
- 35832, 35803, 36880, [12149, 31481], 28891, 29038, 25284, 30633, 22065,
- 20027, 33879, 26609, 21161, 34496, 36142, 38136, 31569, 20303, 27880,
- 31069, 39547, 25235, [12118, 29226], 25341, 19987, 30742, 36716, 25776,
- 36186, 31686, 26729, 24196, 35013, 22918, 25758, 22766, 29366, 26894,
- 38181, 36861, 36184, 22368, 32512, 35846, 20934, 25417, 25305, 21331,
- 26700, 29730, 33537, 37196, 21828, 30528, 28796, 27978, 20857, 21672,
- 36164, 23039, 28363, 28100, 23388, 32043, 20180, 31869, 28371,
- [12070, 23376], [12163, 33258], 28173, 23383, 39683, 26837, 36394, 23447,
- 32508, 24635, 32437, 37049, [12187, 36208], 22863, 25549, 31199,
- [12188, 36275], 21330, 26063, 31062, 35781, 38459, 32452, 38075, 32386,
- 22068, 37257, 26368, 32618, 23562, 36981, 26152, 24038, 20304, 26590,
- 20570, 20316, 22352, 24231, 20109, 19980, 20800, 19984, 24319, 21317,
- 19989, 20120, 19998, [12224, 39730], 23404, 22121, [12033, 20008], 31162,
- [12035, 20031], [12052, 21269], 20039, 22829, [12120, 29243], 21358, 27664,
- 22239, 32996, 39319, 27603, 30590, 40727, [12034, 20022], 20127, 40720,
- 20060, 20073, 20115, 33416, 23387, 21868, 22031, 20164, 21389, 21405,
- 21411, 21413, 21422, 38757, 36189, [12053, 21274], 21493, 21286, 21294,
- 21310, 36188, 21350, 21347, 20994, 21000, 21006, 21037, 21043,
- {f: 2, c: 21055}, 21068, 21086, 21089, 21084, 33967, 21117, 21122, 21121,
- 21136, 21139, [12044, 20866], 32596, 20155, 20163, 20169, 20162, 20200,
- 20193, 20203, 20190, 20251, 20211, 20258, 20324, 20213, 20261, 20263,
- 20233, 20267, 20318, 20327, 25912, 20314, 20317, 20319, 20311, 20274,
- 20285, 20342, 20340, 20369, 20361, 20355, 20367, 20350, 20347, 20394,
- 20348, 20396, 20372, 20454, 20456, 20458, 20421, 20442, 20451, 20444,
- 20433, 20447, 20472, 20521, 20556, 20467, 20524, 20495, 20526, 20525,
- 20478, 20508, 20492, 20517, 20520, 20606, 20547, 20565, 20552, 20558,
- 20588, 20603, 20645, 20647, 20649, 20666, 20694, 20742, 20717, 20716,
- 20710, 20718, 20743, 20747, 20189, 27709, 20312, 20325, 20430,
- [12245, 40864], 27718, 31860, 20846, 24061, 40649, 39320, 20865, 22804,
- [12051, 21241], 21261, 35335, 21264, 20971, 22809, 20821, [12039, 20128],
- 20822, 20147, 34926, 34980, 20149, 33044, 35026, 31104, 23348, 34819,
- 32696, [12046, 20907], 20913, 20925, 20924, 20935, [12045, 20886], 20898,
- 20901, 35744, {f: 2, c: 35750}, 35754, {f: 2, c: 35764}, 35767,
- {f: 2, c: 35778}, 35787, 35791, 35790, {f: 3, c: 35794}, 35798,
- {f: 2, c: 35800}, 35804, {f: 2, c: 35807}, 35812, {f: 2, c: 35816}, 35822,
- 35824, 35827, 35830, 35833, 35836, {f: 2, c: 35839}, 35842, 35844, 35847,
- 35852, 35855, {f: 2, c: 35857}, {f: 3, c: 35860}, 35865, 35867, 35864,
- 35869, {f: 3, c: 35871}, 35877, 35879, {f: 2, c: 35882}, {f: 2, c: 35886},
- {f: 2, c: 35890}, {f: 2, c: 35893}, [12057, 21353], 21370, 38429, 38434,
- 38433, 38449, 38442, 38461, 38460, 38466, 38473, 38484, 38495, 38503,
- 38508, 38514, 38516, 38536, 38541, 38551, 38576, 37015, 37019, 37021,
- 37017, 37036, 37025, 37044, 37043, 37046, 37050, 37048, 37040, 37071,
- 37061, 37054, 37072, 37060, 37063, 37075, 37094, 37090, 37084, 37079,
- 37083, 37099, 37103, 37118, 37124, 37154, 37150, 37155, 37169, 37167,
- 37177, 37187, 37190, 21005, 22850, 21154, {f: 2, c: 21164}, 21182, 21759,
- 21200, 21206, 21232, 21471, 29166, 30669, [12085, 24308], [12048, 20981],
- 20988, [12223, 39727], [12059, 21430], 24321, 30042, 24047, 22348, 22441,
- 22433, 22654, 22716, 22725, 22737, 22313, 22316, 22314, 22323, 22329,
- {f: 2, c: 22318}, 22364, 22331, 22338, 22377, 22405, 22379, 22406, 22396,
- 22395, 22376, 22381, 22390, 22387, 22445, 22436, 22412, 22450, 22479,
- 22439, 22452, 22419, 22432, 22485, 22488, 22490, 22489, 22482, 22456,
- 22516, 22511, 22520, 22500, 22493, 22539, 22541, 22525, 22509, 22528,
- 22558, 22553, 22596, 22560, 22629, 22636, 22657, 22665, 22682, 22656,
- 39336, 40729, 25087, 33401, 33405, 33407, 33423, 33418, 33448, 33412,
- 33422, 33425, 33431, 33433, 33451, 33464, 33470, 33456, 33480, 33482,
- 33507, 33432, 33463, 33454, {f: 2, c: 33483}, 33473, 33449, 33460, 33441,
- 33450, 33439, 33476, 33486, 33444, 33505, 33545, 33527, 33508, 33551,
- 33543, 33500, 33524, 33490, 33496, 33548, 33531, 33491, 33553, 33562,
- 33542, {f: 2, c: 33556}, 33504, 33493, 33564, 33617, {f: 2, c: 33627},
- 33544, 33682, 33596, 33588, 33585, 33691, 33630, 33583, 33615, 33607,
- 33603, 33631, 33600, 33559, 33632, 33581, 33594, 33587, 33638, 33637,
- 33640, 33563, 33641, 33644, 33642, {f: 2, c: 33645}, 33712, 33656,
- {f: 2, c: 33715}, 33696, 33706, 33683, 33692, 33669, 33660, 33718, 33705,
- 33661, 33720, 33659, 33688, 33694, 33704, 33722, 33724, 33729, 33793,
- 33765, 33752, 22535, 33816, 33803, 33757, 33789, 33750, 33820, 33848,
- 33809, 33798, 33748, 33759, 33807, 33795, {f: 2, c: 33784}, 33770, 33733,
- 33728, 33830, 33776, 33761, 33884, 33873, 33882, 33881, 33907,
- {f: 2, c: 33927}, 33914, 33929, 33912, 33852, 33862, 33897, 33910, 33932,
- 33934, 33841, 33901, 33985, 33997, 34000, 34022, 33981, 34003, 33994,
- 33983, 33978, 34016, 33953, 33977, 33972, 33943, 34021, 34019, 34060,
- 29965, 34104, 34032, 34105, 34079, 34106, 34134, 34107, 34047, 34044,
- 34137, 34120, 34152, 34148, 34142, 34170, 30626, 34115, 34162, 34171,
- 34212, 34216, 34183, 34191, 34169, 34222, 34204, 34181, 34233, 34231,
- 34224, 34259, 34241, 34268, 34303, 34343, 34309, 34345, 34326, 34364,
- [12086, 24318], 24328, 22844, 22849, 32823, 22869, 22874, 22872, 21263,
- [12074, 23586], 23589, 23596, 23604, 25164, 25194, 25247, 25275, 25290,
- 25306, 25303, 25326, 25378, 25334, 25401, 25419, 25411, 25517, 25590,
- 25457, 25466, 25486, 25524, 25453, 25516, 25482, 25449, 25518, 25532,
- 25586, 25592, 25568, 25599, 25540, 25566, 25550, 25682, 25542, 25534,
- 25669, 25665, 25611, 25627, 25632, 25612, 25638, 25633, 25694, 25732,
- 25709, 25750, 25722, {f: 2, c: 25783}, 25753, 25786, 25792, 25808, 25815,
- 25828, 25826, 25865, 25893, 25902, [12087, 24331], 24530, 29977, 24337,
- 21343, 21489, 21501, 21481, 21480, 21499, 21522, 21526, 21510, 21579,
- {f: 3, c: 21586}, 21590, 21571, 21537, 21591, 21593, 21539, 21554, 21634,
- 21652, 21623, 21617, 21604, {f: 2, c: 21658}, 21636, 21622, 21606, 21661,
- 21712, 21677, 21698, 21684, 21714, 21671, 21670, {f: 2, c: 21715}, 21618,
- 21667, 21717, 21691, 21695, 21708, {f: 2, c: 21721}, 21724,
- {f: 2, c: 21673}, 21668, 21725, 21711, 21726, 21787, 21735, 21792, 21757,
- 21780, 21747, {f: 2, c: 21794}, 21775, 21777, 21799, 21802, 21863, 21903,
- 21941, 21833, 21869, 21825, 21845, 21823, 21840, 21820, 21815, 21846,
- {f: 3, c: 21877}, 21811, 21808, 21852, 21899, 21970, 21891, 21937, 21945,
- 21896, 21889, 21919, 21886, 21974, 21905, 21883, 21983, {f: 2, c: 21949},
- 21908, 21913, 21994, 22007, 21961, 22047, 21969, {f: 2, c: 21995}, 21972,
- 21990, 21981, 21956, 21999, 21989, {f: 2, c: 22002}, {f: 2, c: 21964},
- 21992, 22005, 21988, 36756, 22046, 22024, 22028, 22017, 22052, 22051,
- 22014, 22016, 22055, 22061, 22104, 22073, 22103, 22060, 22093, 22114,
- 22105, 22108, 22092, 22100, 22150, 22116, 22129, 22123, {f: 2, c: 22139},
- 22149, 22163, 22191, 22228, [12062, 22231], 22237, 22241, 22261, 22251,
- 22265, 22271, 22276, 22282, 22281, 22300, 24079, 24089, 24084, 24081,
- 24113, {f: 2, c: 24123}, 24119, 24132, 24148, 24155, 24158, 24161, 23692,
- 23674, 23693, 23696, 23702, 23688, {f: 2, c: 23704}, 23697, 23706, 23708,
- 23733, 23714, 23741, 23724, 23723, 23729, 23715, 23745, 23735, 23748,
- 23762, 23780, 23755, 23781, {f: 2, c: 23810}, 23847, 23846, 23854, 23844,
- 23838, 23814, 23835, 23896, 23870, 23860, 23869, 23916, 23899, 23919,
- 23901, 23915, 23883, 23882, 23913, 23924, 23938, 23961, 23965, 35955,
- 23991, 24005, [12091, 24435], 24439, 24450, 24455, 24457, 24460, 24469,
- 24473, 24476, 24488, 24493, 24501, 24508, 34914, [12090, 24417], 29357,
- 29360, 29364, {f: 2, c: 29367}, 29379, 29377, 29390, 29389, 29394, 29416,
- 29423, 29417, 29426, 29428, 29431, 29441, 29427, 29443, {f: 2, c: 29434},
- 29463, 29459, 29473, 29450, 29470, 29469, 29461, 29474, 29497, 29477,
- 29484, 29496, 29489, 29520, 29517, 29527, 29536, 29548, 29551, 29566,
- [12167, 33307], 22821, 39143, 22820, [12065, 22786], 39267,
- {f: 6, c: 39271}, 39284, 39287, 39293, 39296, 39300, 39303, 39306, 39309,
- {f: 2, c: 39312}, {f: 3, c: 39315}, 24192, 24209, 24203, 24214, 24229,
- 24224, 24249, 24245, 24254, 24243, 36179, 24274, 24273, 24283, 24296,
- 24298, 33210, 24516, 24521, 24534, 24527, 24579, 24558, 24580, 24545,
- 24548, 24574, {f: 2, c: 24581}, 24554, 24557, 24568, 24601, 24629, 24614,
- 24603, 24591, 24589, 24617, 24619, 24586, 24639, 24609, {f: 2, c: 24696},
- 24699, 24698, 24642, 24682, 24701, 24726, 24730, 24749, 24733, 24707,
- 24722, 24716, 24731, 24812, 24763, 24753, 24797, 24792, 24774, 24794,
- 24756, 24864, 24870, 24853, 24867, 24820, 24832, 24846, 24875, 24906,
- 24949, 25004, 24980, 24999, 25015, 25044, 25077, 24541, 38579, 38377,
- 38379, 38385, 38387, {f: 2, c: 38389}, 38396, 38398, {f: 2, c: 38403},
- 38406, 38408, {f: 4, c: 38410}, 38415, 38418, {f: 3, c: 38421},
- {f: 2, c: 38425}, 20012, [12121, 29247], 25109, 27701, 27732, 27740, 27722,
- 27811, 27781, 27792, 27796, 27788, {f: 2, c: 27752}, 27764, 27766, 27782,
- 27817, 27856, 27860, 27821, {f: 2, c: 27895}, 27889, 27863, 27826, 27872,
- 27862, 27898, 27883, 27886, 27825, 27859, 27887, 27902, 27961, 27943,
- 27916, 27971, 27976, 27911, 27908, 27929, 27918, 27947, 27981, 27950,
- 27957, 27930, 27983, 27986, 27988, 27955, 28049, 28015, 28062, 28064,
- 27998, {f: 2, c: 28051}, 27996, 28000, 28028, 28003, 28186, 28103, 28101,
- 28126, 28174, 28095, 28128, 28177, 28134, 28125, 28121, 28182, 28075,
- 28172, 28078, 28203, 28270, 28238, 28267, 28338, 28255, 28294,
- {f: 2, c: 28243}, 28210, 28197, 28228, 28383, 28337, 28312, 28384, 28461,
- 28386, 28325, 28327, 28349, 28347, 28343, 28375, 28340, 28367, 28303,
- 28354, 28319, 28514, {f: 2, c: 28486}, 28452, 28437, 28409, 28463, 28470,
- 28491, 28532, 28458, 28425, 28457, 28553, 28557, 28556, 28536, 28530,
- 28540, 28538, 28625, 28617, 28583, 28601, 28598, 28610, 28641, 28654,
- 28638, 28640, 28655, 28698, 28707, 28699, 28729, 28725, 28751, 28766,
- [12071, 23424], 23428, 23445, 23443, 23461, 23480, 29999, 39582, 25652,
- 23524, 23534, 35120, 23536, 36423, 35591, 36790, 36819, 36821, 36837,
- 36846, 36836, 36841, 36838, 36851, 36840, 36869, 36868, 36875, 36902,
- 36881, 36877, 36886, 36897, {f: 2, c: 36917}, 36909, 36911, 36932,
- {f: 2, c: 36945}, 36944, 36968, 36952, 36962, 36955, 26297, 36980, 36989,
- 36994, 37000, 36995, 37003, [12089, 24400], 24407, 24406, 24408, 23611,
- 21675, 23632, 23641, 23409, 23651, 23654, 32700, 24362, 24361, 24365,
- 33396, 24380, 39739, [12076, 23662], 22913, 22915, 22925, {f: 2, c: 22953},
- 22947, 22935, 22986, 22955, 22942, 22948, 22994, 22962, 22959, 22999,
- 22974, {f: 2, c: 23045}, 23005, 23048, 23011, 23000, 23033, 23052, 23049,
- 23090, 23092, 23057, 23075, 23059, 23104, 23143, 23114, 23125, 23100,
- 23138, 23157, 33004, 23210, 23195, 23159, 23162, 23230, 23275, 23218,
- 23250, 23252, 23224, 23264, 23267, 23281, 23254, 23270, 23256, 23260,
- 23305, 23319, 23318, 23346, 23351, 23360, 23573, 23580, 23386, 23397,
- 23411, 23377, 23379, 23394, 39541, {f: 2, c: 39543}, 39546, 39551, 39549,
- {f: 2, c: 39552}, 39557, 39560, 39562, 39568, {f: 2, c: 39570}, 39574,
- 39576, {f: 3, c: 39579}, {f: 2, c: 39583}, {f: 2, c: 39586}, 39589, 39591,
- 32415, 32417, 32419, 32421, {f: 2, c: 32424}, 32429, 32432, 32446,
- {f: 3, c: 32448}, 32457, {f: 2, c: 32459}, 32464, 32468, 32471, 32475,
- {f: 2, c: 32480}, 32488, 32491, {f: 2, c: 32494}, {f: 2, c: 32497}, 32525,
- 32502, {f: 2, c: 32506}, 32510, {f: 3, c: 32513}, {f: 2, c: 32519},
- {f: 2, c: 32523}, 32527, {f: 2, c: 32529}, 32535, 32537, 32540, 32539,
- 32543, {f: 7, c: 32545}, {f: 4, c: 32554}, {f: 5, c: 32559}, 32565,
- [12083, 24186], 30079, [12078, 24027], 30014, 37013, 29582, 29585, 29614,
- 29602, 29599, 29647, 29634, 29649, 29623, 29619, 29632, 29641, 29640,
- 29669, 29657, 39036, 29706, 29673, 29671, 29662, 29626, 29682, 29711,
- 29738, 29787, 29734, 29733, 29736, 29744, 29742, 29740, 29723, 29722,
- 29761, 29788, 29783, 29781, 29785, 29815, 29805, 29822, 29852, 29838,
- {f: 2, c: 29824}, 29831, 29835, 29854, {f: 2, c: 29864}, 29840, 29863,
- 29906, 29882, {f: 3, c: 38890}, 26444, 26451, 26462, 26440, 26473, 26533,
- 26503, 26474, 26483, 26520, 26535, 26485, 26536, 26526, 26541, 26507,
- 26487, 26492, 26608, 26633, 26584, 26634, 26601, 26544, 26636, 26585,
- 26549, 26586, 26547, 26589, 26624, 26563, 26552, 26594, 26638, 26561,
- 26621, {f: 2, c: 26674}, {f: 2, c: 26720}, 26702, 26722, 26692, 26724,
- 26755, 26653, 26709, 26726, 26689, 26727, 26688, 26686, 26698, 26697,
- 26665, 26805, 26767, 26740, 26743, 26771, 26731, 26818, 26990, 26876,
- {f: 2, c: 26911}, 26873, 26916, 26864, 26891, 26881, 26967, 26851, 26896,
- 26993, 26937, 26976, 26946, 26973, 27012, 26987, 27008, 27032, 27000,
- 26932, 27084, {f: 2, c: 27015}, 27086, 27017, 26982, 26979, 27001, 27035,
- 27047, 27067, 27051, 27053, 27092, 27057, 27073, 27082, 27103, 27029,
- 27104, 27021, 27135, 27183, 27117, {f: 2, c: 27159}, 27237, 27122, 27204,
- 27198, 27296, 27216, 27227, 27189, 27278, 27257, 27197, 27176, 27224,
- 27260, 27281, 27280, 27305, 27287, 27307, 29495, 29522, {f: 2, c: 27521},
- 27527, 27524, {f: 2, c: 27538}, 27533, {f: 2, c: 27546}, 27553, 27562,
- 36715, 36717, {f: 3, c: 36721}, {f: 2, c: 36725}, 36728, 36727,
- {f: 2, c: 36729}, 36732, 36734, {f: 2, c: 36737}, 36740, 36743, 36747,
- {f: 3, c: 36749}, 36760, 36762, 36558, 25099, 25111, 25115, 25119, 25122,
- 25121, 25125, 25124, 25132, 33255, 29935, 29940, 29951, 29967, 29969,
- 29971, [12097, 25908], {f: 3, c: 26094}, 26122, 26137, 26482, 26115, 26133,
- 26112, 28805, 26359, 26141, 26164, 26161, 26166, 26165, 32774, 26207,
- 26196, 26177, 26191, 26198, 26209, 26199, 26231, 26244, 26252, 26279,
- 26269, 26302, {f: 2, c: 26331}, 26342, 26345, {f: 2, c: 36146}, 36150,
- 36155, 36157, 36160, {f: 2, c: 36165}, {f: 2, c: 36168}, 36167, 36173,
- 36181, 36185, 35271, {f: 3, c: 35274}, {f: 4, c: 35278}, 29294, 29343,
- 29277, 29286, 29295, {f: 2, c: 29310}, 29316, 29323, 29325, 29327, 29330,
- 25352, 25394, 25520, 25663, 25816, 32772, 27626, 27635, 27645, 27637,
- 27641, 27653, 27655, 27654, 27661, 27669, {f: 3, c: 27672}, 27681, 27689,
- 27684, 27690, 27698, 25909, 25941, 25963, 29261, 29266, 29270, 29232,
- 34402, 21014, 32927, 32924, 32915, 32956, 26378, 32957, 32945, 32939,
- 32941, 32948, 32951, {f: 4, c: 32999}, 32987, 32962, 32964, 32985, 32973,
- 32983, 26384, 32989, 33003, 33009, 33012, 33005, {f: 2, c: 33037}, 33010,
- 33020, 26389, 33042, 35930, 33078, 33054, 33068, 33048, 33074, 33096,
- 33100, 33107, 33140, {f: 2, c: 33113}, 33137, 33120, 33129,
- {f: 2, c: 33148}, 33133, 33127, 22605, 23221, 33160, 33154, 33169, 28373,
- 33187, 33194, 33228, 26406, 33226, 33211, 33217, 33190, 27428, 27447,
- 27449, 27459, 27462, 27481, {f: 3, c: 39121}, 39125, {f: 2, c: 39129},
- [12110, 27571], 24384, 27586, 35315, 26000, 40785, 26003, 26044, 26054,
- 26052, 26051, 26060, 26062, 26066, 26070, 28800, 28828, 28822, 28829,
- 28859, 28864, 28855, 28843, 28849, 28904, 28874, 28944, 28947, 28950,
- 28975, 28977, 29043, 29020, 29032, 28997, 29042, 29002, 29048, 29050,
- 29080, 29107, 29109, 29096, 29088, 29152, 29140, 29159, 29177, 29213,
- 29224, 28780, 28952, 29030, 29113, 25150, 25149, 25155, {f: 2, c: 25160},
- 31035, 31040, 31046, 31049, {f: 2, c: 31067}, 31059, 31066, 31074, 31063,
- 31072, 31087, 31079, 31098, 31109, 31114, 31130, 31143, 31155, 24529,
- 24528, 24636, 24669, 24666, 24679, 24641, 24665, 24675, 24747, 24838,
- 24845, 24925, 25001, 24989, 25035, 25041, 25094, 32896, [12160, 32895],
- 27795, 27894, 28156, 30710, 30712, 30720, 30729, {f: 2, c: 30743}, 30737,
- 26027, 30765, {f: 2, c: 30748}, {f: 3, c: 30777}, 30751, 30780, 30757,
- 30764, 30755, 30761, 30798, 30829, {f: 2, c: 30806}, 30758, 30800, 30791,
- 30796, 30826, 30875, 30867, 30874, 30855, 30876, 30881, 30883, 30898,
- 30905, 30885, 30932, 30937, 30921, 30956, 30962, 30981, 30964, 30995,
- 31012, 31006, 31028, 40859, [12235, 40697], {f: 2, c: 40699}, 30449, 30468,
- 30477, 30457, {f: 2, c: 30471}, 30490, 30498, 30489, 30509, 30502, 30517,
- 30520, {f: 2, c: 30544}, 30535, 30531, 30554, 30568, 30562, 30565, 30591,
- 30605, 30589, 30592, 30604, 30609, {f: 2, c: 30623}, 30640, 30645, 30653,
- 30010, 30016, 30030, 30027, 30024, 30043, 30066, 30073, 30083, 32600,
- 32609, 32607, 35400, 32616, 32628, 32625, 32633, 32641, 32638, 30413,
- 30437, 34866, {f: 3, c: 38021}, 38027, 38026, {f: 2, c: 38028},
- {f: 2, c: 38031}, 38036, 38039, 38037, {f: 3, c: 38042}, {f: 2, c: 38051},
- 38059, 38058, 38061, 38060, {f: 2, c: 38063}, 38066, 38068,
- {f: 5, c: 38070}, {f: 2, c: 38076}, 38079, 38084, {f: 7, c: 38088},
- {f: 3, c: 38096}, {f: 3, c: 38101}, 38105, 38104, 38107, {f: 3, c: 38110},
- 38114, {f: 2, c: 38116}, {f: 2, c: 38119}, 38122, 38121, 38123,
- {f: 2, c: 38126}, {f: 3, c: 38131}, 38135, 38137, {f: 2, c: 38140}, 38143,
- 38147, 38146, {f: 2, c: 38150}, {f: 2, c: 38153}, {f: 3, c: 38157},
- {f: 5, c: 38162}, 38168, 38171, {f: 3, c: 38173}, 38178, {f: 2, c: 38186},
- 38185, 38188, {f: 2, c: 38193}, 38196, {f: 3, c: 38198}, 38204,
- {f: 2, c: 38206}, 38210, 38197, {f: 3, c: 38212}, 38217, 38220,
- {f: 2, c: 38222}, {f: 3, c: 38226}, {f: 4, c: 38230}, 38235,
- {f: 2, c: 38238}, 38237, {f: 2, c: 38241}, {f: 9, c: 38244}, 38255,
- {f: 3, c: 38257}, 38202, 30695, 30700, 38601, 31189, 31213, 31203, 31211,
- 31238, 23879, 31235, 31234, 31262, 31252, 31289, 31287, 31313, 40655,
- 39333, 31344, 30344, 30350, 30355, 30361, 30372, 29918, 29920, 29996,
- 40480, 40482, {f: 5, c: 40488}, 40498, 40497, 40502, 40504, 40503,
- {f: 2, c: 40505}, 40510, {f: 2, c: 40513}, 40516, {f: 4, c: 40518},
- {f: 2, c: 40523}, 40526, 40529, 40533, 40535, {f: 3, c: 40538}, 40542,
- 40547, {f: 7, c: 40550}, 40561, 40557, 40563, [12135, 30098], 30100, 30102,
- 30112, 30109, 30124, 30115, {f: 2, c: 30131}, 30136, 30148, 30129, 30128,
- 30147, 30146, 30166, 30157, 30179, 30184, 30182, 30180, 30187, 30183,
- 30211, 30193, 30204, 30207, 30224, 30208, 30213, 30220, 30231, 30218,
- 30245, 30232, 30229, 30233, 30235, 30268, 30242, 30240, 30272, 30253,
- 30256, 30271, 30261, 30275, 30270, 30259, 30285, 30302, 30292, 30300,
- 30294, 30315, 30319, 32714, 31462, {f: 2, c: 31352}, 31360, 31366, 31368,
- 31381, 31398, 31392, 31404, 31400, 31405, 31411, 34916, 34921, 34930,
- 34941, 34943, 34946, 34978, 35014, 34999, 35004, 35017, 35042, 35022,
- 35043, 35045, 35057, 35098, 35068, 35048, 35070, 35056, 35105, 35097,
- 35091, 35099, 35082, 35124, 35115, 35126, 35137, 35174, 35195,
- [12134, 30091], 32997, 30386, 30388, 30684, [12158, 32786], 32788, 32790,
- 32796, 32800, 32802, {f: 3, c: 32805}, 32809, 32808, 32817, 32779, 32821,
- 32835, 32838, 32845, 32850, 32873, 32881, 35203, 39032, 39040, 39043,
- 39049, {f: 2, c: 39052}, 39055, 39060, {f: 2, c: 39066}, {f: 2, c: 39070},
- {f: 2, c: 39073}, {f: 2, c: 39077}, [12172, 34381], 34388, 34412, 34414,
- 34431, 34426, 34428, 34427, 34472, 34445, 34443, 34476, 34461, 34471,
- 34467, 34474, 34451, 34473, 34486, 34500, 34485, 34510, 34480, 34490,
- 34481, 34479, 34505, 34511, 34484, 34537, {f: 2, c: 34545}, 34541, 34547,
- 34512, 34579, 34526, 34548, 34527, 34520, 34513, 34563, 34567, 34552,
- 34568, 34570, 34573, 34569, 34595, 34619, 34590, 34597, 34606, 34586,
- 34622, 34632, 34612, 34609, 34601, 34615, 34623, 34690, 34594,
- {f: 2, c: 34685}, 34683, 34656, 34672, 34636, 34670, 34699, 34643, 34659,
- 34684, 34660, 34649, 34661, 34707, 34735, 34728, 34770, 34758, 34696,
- 34693, 34733, 34711, 34691, 34731, 34789, 34732, 34741, 34739, 34763,
- 34771, 34749, 34769, 34752, 34762, 34779, 34794, 34784, 34798, 34838,
- 34835, 34814, 34826, 34843, 34849, 34873, 34876, [12152, 32566], 32578,
- {f: 2, c: 32580}, 33296, 31482, 31485, 31496, {f: 2, c: 31491}, 31509,
- 31498, 31531, 31503, 31559, 31544, 31530, 31513, 31534, 31537, 31520,
- 31525, 31524, 31539, 31550, 31518, 31576, 31578, 31557, 31605, 31564,
- 31581, 31584, 31598, 31611, 31586, 31602, 31601, 31632, {f: 2, c: 31654},
- 31672, 31660, 31645, 31656, 31621, 31658, 31644, 31650, 31659, 31668,
- 31697, 31681, 31692, 31709, 31706, {f: 2, c: 31717}, 31722, 31756, 31742,
- 31740, 31759, 31766, 31755, 31775, 31786, 31782, 31800, 31809, 31808,
- 33278, {f: 2, c: 33281}, 33284, 33260, 34884, {f: 3, c: 33313}, 33325,
- 33327, 33320, 33323, 33336, 33339, {f: 2, c: 33331}, 33342, 33348, 33353,
- 33355, 33359, 33370, 33375, 33384, 34942, 34949, 34952, 35032, 35039,
- 35166, 32669, 32671, 32679, {f: 2, c: 32687}, 32690, 31868, 25929, 31889,
- 31901, 31900, 31902, 31906, 31922, {f: 2, c: 31932}, 31937, 31943,
- {f: 2, c: 31948}, 31944, 31941, 31959, 31976, [12169, 33390], 26280, 32703,
- 32718, 32725, 32741, 32737, 32742, 32745, 32750, 32755, [12151, 31992],
- 32119, 32166, 32174, 32327, 32411, 40632, 40628, 36211, 36228, 36244,
- 36241, 36273, 36199, 36205, 35911, 35913, 37194, 37200, {f: 2, c: 37198},
- 37220, 37218, 37217, 37232, 37225, 37231, {f: 2, c: 37245}, 37234, 37236,
- 37241, 37260, 37253, 37264, 37261, 37265, {f: 2, c: 37282}, 37290,
- {f: 3, c: 37293}, 37301, 37300, 37306, [12183, 35925], 40574, 36280, 36331,
- 36357, 36441, 36457, 36277, 36287, 36284, 36282, 36292, {f: 2, c: 36310},
- 36314, 36318, {f: 2, c: 36302}, 36315, 36294, 36332, {f: 2, c: 36343},
- 36323, 36345, 36347, 36324, 36361, 36349, 36372, 36381, 36383, 36396,
- 36398, 36387, 36399, 36410, 36416, 36409, 36405, 36413, 36401, 36425,
- {f: 2, c: 36417}, {f: 2, c: 36433}, 36426, 36464, 36470, 36476, 36463,
- 36468, 36485, 36495, 36500, 36496, 36508, 36510, [12184, 35960], 35970,
- 35978, 35973, 35992, 35988, 26011, 35286, 35294, 35290, 35292, 35301,
- 35307, 35311, 35390, 35622, 38739, 38633, 38643, 38639, 38662, 38657,
- 38664, 38671, 38670, 38698, 38701, 38704, 38718, 40832, 40835,
- {f: 6, c: 40837}, 40844, 40702, 40715, 40717, [12203, 38585],
- {f: 2, c: 38588}, 38606, 38610, 30655, 38624, 37518, 37550, 37576, 37694,
- 37738, 37834, 37775, 37950, 37995, 40063, 40066, {f: 4, c: 40069}, 31267,
- 40075, 40078, {f: 3, c: 40080}, {f: 2, c: 40084}, {f: 2, c: 40090},
- {f: 6, c: 40094}, {f: 5, c: 40101}, 40107, {f: 2, c: 40109},
- {f: 8, c: 40112}, {f: 4, c: 40122}, {f: 4, c: 40132}, {f: 7, c: 40138},
- {f: 3, c: 40147}, {f: 3, c: 40151}, {f: 2, c: 40156}, 40159, 40162, 38780,
- 38789, {f: 2, c: 38801}, 38804, 38831, 38827, 38819, 38834, 38836, 39601,
- 39600, 39607, 40536, 39606, 39610, 39612, 39617, 39616, 39621, 39618,
- {f: 2, c: 39627}, 39633, 39749, 39747, 39751, 39753, 39752, 39757, 39761,
- 39144, 39181, 39214, 39253, 39252, [12221, 39647], 39649, 39654, 39663,
- 39659, 39675, 39661, 39673, 39688, 39695, 39699, 39711, 39715,
- {f: 2, c: 40637}, 32315, 40578, {f: 2, c: 40583}, 40587, 40594, 37846,
- 40605, 40607, {f: 3, c: 40667}, 40672, 40671, 40674, 40681, 40679, 40677,
- 40682, 40687, 40738, 40748, 40751, 40761, 40759, {f: 2, c: 40765}, 40772,
- 12295, {s: 13}, 30362, 34297, 31001, 24859, 39599, 35158, 22761, 32631,
- 25850, 25943, 38930, 36774, 32070, 24171, 32129, 37770, 35607, 39165,
- 23542, 22577, 39825, 36649, [12185, 35997], 37575, 29437, 20633, 24970,
- 32179, 31558, 30050, 25987, 24163, 38281, 37002, 32232, 36022, 35722,
- 36783, 36782, 27161, 40009, 30303, 28693, 28657, 36051, 25839, 39173,
- 25765, 37474, 37457, 39361, 35036, 36001, 21443, 34870, 27544, 24922,
- 24920, 29158, 33980, 33369, 20489, 28356, 21408, 20596, 28204, 23652,
- 35435, 25881, 25723, 34796, 39262, 35730, 32399, 37855, 29987, 38369,
- 39019, 22580, 22039, [12199, 38263], 20767, 33144, 24288, 26274, 37396,
- [12190, 36554], 24505, 22645, 38515, 35183, 31281, 25074, 35488, 39425,
- 36978, 39347, [12242, 40786], 29118, 34909, 34802, 23541, 30087, 36490,
- 31820, 32162, 37276, 37604, 38619, 30990, 20786, 35320, 34389, 20659,
- 30241, 38358, 21109, 37656, 32020, 32189, 36781, 35422, 36060, 32880,
- 24478, 21474, 36517, 31428, 37679, 36948, 24118, 36024, 25812, 21934,
- 37170, 25763, 33213, 24986, 35477, 24392, 30070, 25803, 40680, 34153,
- 27284, 25623, 23798, 31153, 23566, 29128, 37159, 25973, 28364, 36958,
- 32224, 39003, 40670, 22666, 38651, 28593, 37347, 35519, 35548, 37336,
- 38914, 37664, 35330, 26481, 21205, 26847, 20941, [12222, 39717], 29346,
- 29544, 35712, 36077, 37709, 37723, 26039, 32222, 38538, 23565, 22136,
- 38931, 37389, 22890, 22702, 40285, 38989, 35355, 24801, 39187, 20818,
- 29246, 39180, 36019, 30332, 32624, 38309, 31020, 37353, 29033, 31684,
- 36009, 39151, 35370, 32033, [12214, 39131], 35513, 24290, 36027, 32027,
- 22707, 22894, 24996, 31966, 35920, 26963, 37586, [12213, 39080], 30219,
- 39342, 32299, 35575, 40179, 33178, 36667, 25771, 36628, 36070, 24489,
- 36000, 35331, 23142, 32283, 35442, 37411, 33995, 24185, 36245, 36123,
- 23713, 21083, 37628, 32177, 23831, 37804, 25841, 40255, 38307, 37499,
- 20491, 32102, 40852, 38799, 36002, 37390, 28317, 27083, 36092, 34865,
- 39015, 21102, 38364, 35264, 39208, 24931, 36011, 24291, 35215, 27512,
- [12244, 40860], 38312, 36556, 35437, 27331, 36020, 21130, 36645, 37707,
- 22283, 36942, 39405, 38867, 28450, 34399, 38305, 40372, 36032, 36703,
- 40251, 32005, 22778, 35703, 28396, 22057, 33775, 30059, 21123, 35441,
- 25079, 22750, 27489, 29872, 36996, 32233, 35594, 25582, 36637, 36036,
- 31330, 26371, 29172, 21295, 35569, 35496, 32362, 33911, 28222, 29554,
- 36008, 31117, 25802, 27231, 31309, 39249, 35663, 40388, 32318, 32221,
- 26997, 36655, 32026, 25824, 24190, 34186, 21137, 28639, 35336, 35352,
- 38555, 32380, 32000, 22846, 33698, 38960, 36040, 37440, 20729, 39381,
- 27570, 30435, 22533, 31627, 38291, 33393, 32216, 32365, 27298, 40572,
- 25536, 25791, 31777, 20745, 34214, 27323, 37970, 36368, 36068,
- [12178, 35211], 37749, 33382, 21133, 39198, 28472, 28666, 28567, 23559,
- 28479, 34083, 27123, 22892, 35611, 37292, 33184, 28550, 39509, 23308,
- 25898, 37496, 30703, 20709, 39171, 32371, 32094, 36686, 36611, 38542,
- 31680, 28500, 32080, 35489, 32202, 37670, 20677, 35641, 36914, 29180,
- 30433, 21185, 33686, 39912, 39514, 32147, 38968, 37857, 24465, 30169,
- 31478, 31998, 33290, 39378, 33289, 25818, 37624, 25084, 21127, 40273,
- 32121, 35258, 35363, 32118, 37406, 36557, 39423, 38283, 20977, 38982,
- 27579, 35506, 22718, 25031, 25715, 24235, 35122, 35463, 22602, 20744,
- 23532, 31014, 26336, 34407, 24011, 31418, 39243, 28528, 25844, 38346,
- 34847, 33240, 33802, 20358, 36084, 34253, 27396, 25876, 31811, 38348,
- 34349, 28734, 35733, 25900, 35261, 25078, 32412, 29211, 28651, 25736,
- 21214, 28551, 27138, 37939, 22744, 39006, 31852, 38626, 28757, 35023,
- 39881, 31150, 40599, 21426, 21237, 31019, 27511, 28701, 38584, 20486,
- 32879, 34030, 36899, 37934, 24976, 28451, 31806, 25986, 33225, 37832,
- 25088, 29001, 32244, 31975, 20841, 36635, 35538, 30274, 36988, 37904,
- 29557, 33256, 37168, 40023, 36035, 40801, 37428, 38728, 23994, 38936,
- 39230, 21129, [12243, 40845], 32894, 22184, 31840, 22751, 25871, 38580,
- 27155, 23105, 25695, 31757, 34310, 30439, 39025, 24300, 29200, 25796,
- 28407, 34396, 39791, 36034, 37682, 38520, 39522, 37569, 23650, 32311,
- 24942, 28670, 32209, 24018, 25891, 23423, 28772, 20098, 25476, 36650,
- 20523, 20374, 28138, 32184, 35542, 34367, 32645, 37007, 38012, 31854,
- 39486, 39409, 32097, 23229, 29802, 30908, 34718, [12218, 39340], 39393,
- 21966, 36023, [12230, 40613], 36067, 36993, 30622, 39237, 34875, 28415,
- 35646, 37672, 37466, 36031, 37762, [12200, 38272], 24758, 20497, 37683,
- 22818, 35598, 24396, 35219, 32191, 32236, 24287, 28357, 25003, 38313,
- 40180, 37528, 35628, 35584, 30045, 37385, 32013, 38627, 25747, 33126,
- 24817, 39719, 39186, 25836, 33193, 25862, 37312, [12227, 40165], 32886,
- 22169, 38007, 37811, 27320, 29552, 23527, 25840, 28632, 37397, 32016,
- 33215, 28611, 36786, 30247, 35582, 27472, 40407, 27590, 22036, 28442,
- 30436, 40848, 36064, 22132, 40300, 39449, 39108, 38971, 36007, 34315,
- 24977, 35413, 28497, 38935, 25778, 37610, 20693, 27192, 35676, 33229,
- [12241, 40778], 39438, 35912, 21843, 27683, 35350, 29309, 37370, 37467,
- 36983, 31805, 35609, 37666, 37463, 28154, 35700, 22649, 27085, 21958,
- 22715, 34196, 25654, 37740, 27211, 21932, 20689, 32761, 31429, 31434,
- 27453, 35242, 23522, 36629, 27691, 20670, 38915, 35531, 24950, 29898,
- 31406, 36264, 21312, 36544, 39493, 40818, 39028, 27402, 21240, 40306,
- 30906, 35731, 39250, 25854, 32350, 29105, 38860, 35469, 32009, 27054,
- 32104, 36575, 37613, 38287, 28516, 28753, 34217, 39955, 36093, 20632,
- 21930, 39479, 25475, 28544, 27578, 32023, 31721, 26348, 38275, 38493,
- 36109, 32341, 20663, 36062, 29138, 32057, 36050, 25448, 25885, 25086,
- 35373, 32051, 23529, 23352, 33102, 28402, 32882, 32361, 21213, 32854,
- 24107, 29509, 28629, 35433, 26178, 34645, 23526, 35672, 39387, 21218,
- 36969, 37323, 39166, 35222, 35430, 22781, 29560, 27166, 36664, 26360,
- 36118, 23660, 34899, 27193, 31466, 25976, 24101, 38617, 35504, 38918,
- 35500, 30889, 29197, 32114, 39164, 39686, 32883, 24939, 38924, 35359,
- 35494, 25851, 34311, 35380, 32901, 38614, 38568, 32143, 27506, 23403,
- 25613, 32302, 29795, 37782, 29562, 25787, 33274, 24907, 25892, 36010,
- 30321, 28760, 22727, 35674, 35527, 22022, 28271, 29145, 28644, 32295,
- 35342, 39472, 35588, 37563, 38988, 39636, 26781, 36028, 37941, 24307,
- 32893, 28916, 37509, 32113, 38957, 22294, 22615, 22296, 38973, 40213,
- 39345, 39389, 27234, 31402, 35178, 24398, 28771, 38929, 33836, 32178,
- [12209, 38859], 36949, 22285, 29234, 28656, 32173, 33894, 20553, 20702,
- 32239, 35586, 34907, 32862, 32011, 31337, 21839, 25790, 34680, 28198,
- 31401, 21978, 37794, 28879, 35491, 28961, 34154, 22626, 38695, 21209,
- 35492, 37675, 29351, 35186, 32722, 37521, 25138, 32048, 34662, 36676,
- 23805, 20448, 29433, 22151, 37697, 39854, 32406, 36066, 37532, 38289,
- 39023, 38570, 29694, 29563, 32291, 39201, 25010, 32171, 38002, 37129,
- 35443, 38911, 38917, 34157, 22210, 37559, 26313, 22063, 21332, 25406,
- 33029, 35559, 23531, 28681, 35613, 37573, 37313, 33288, 37561, 32137,
- 38920, 35377, 32210, 32396, 36562, 25080, 36984, 30316, 32098, 23416,
- 21211, 35426, 23563, 39348, 35347, 35338, 36956, 22739, 40201, 40232,
- 21854, 20126, 35357, 38329, 40573, 22196, 38996, 38331, 33399, 21421,
- 30831, 35578, 39511, 40230, 26954, 25562, 30221, 38525, 30306, 39178,
- 27171, 22575, 35617, 34277, 29242, [12212, 38913], 26989, 33865, 37291,
- 37541, 38948, 36986, 20736, 34811, 34269, 20740, 25014, 32681, 35427,
- 35696, 35516, 35695, 32377, 34093, 38512, 37504, 39154, 38577, 27387,
- 23344, 40441, 25033, 32403, 29801, 34722, 29151, 29074, 34821, 36111,
- 31310, 21938, 25793, 20653, 30320, 36404, 20778, 24962, 37109, 37438,
- 29494, 35480, 36671, 39192, [12226, 39770], 28417, 33287, 23996, 35486,
- 39729, 29508, 35709, 38928, 39341, 40219, 28149, 36677, 22290, 21729,
- 22291, 32227, 36960, 39000, 32004, 36493, 38000, 38322, 38642, 37142,
- 38549, 36939, 34292, 37270, 26248, 38620, 36617, 25890, 26283, 36106,
- 36124, 33247, 38015, 26839, 31432, 36012, 25799, 21063, 28580, 36042,
- 36104, 36555, 37720, 38296, 35408, 40779, 20661, 27656, 30430, 26028,
- 36670, 23940, 26855, 25136, 32187, 24373, 28466, 24115, 36076, 33081,
- 36249, 34756, 36685, 37754, 36889, 35998, 37341, 20597, 35386, 37806,
- 38499, 24128, 30309, 37165, 35657, 32340, 32887, 22519, 34937, 32025,
- 25711, 25842, 24159, 36074, 28399, 37912, 32066, 31278, 33131, 34886,
- 35589, 36600, 30394, 26205, 39519, 35576, 35461, 29165, 30682, 22225,
- 36015, 37956, 31689, 39376, 23560, 30938, 36681, 36090, 27137, 33674,
- 35037, 22941, 22767, 29376, 37648, 36101, 22684, 32180, 35524, 28310,
- 28609, 36039, 28460, 32156, 32317, 32305, 37138, 35419, 32068, 38013,
- 21959, 21401, 21428, 38760, 36107, 21293, 21297, 36094, 21060, 21132,
- 21108, 20660, 20480, 20630, 20757, 20738, 20756, 20796, 20791, 20712,
- 20674, 20795, 20752, 20794, 20681, 31988, 40652, 22213, 40172, 35131,
- 33248, 35329, 35344, 35340, 35349, 35635, 35406, 35365, 35393, 35382,
- 35398, 35412, 35416, 35410, 35462, 35460, 35455, 35440, 35452, 35445,
- 35436, 35438, 35533, 35554, 35425, 35482, 35493, {f: 2, c: 35473}, 35535,
- 35537, 35529, 35547, 35543, 35522, 35510, 35574, 35563, 35604, 35585,
- 35556, 35565, 35580, 35571, 35558, 35566, 35550, 35624, 35740, 35606,
- 35610, 35600, 35627, 35629, 35670, 35673, 35662, 35742, 35691, 35734,
- 38488, 37178, 37140, 37172, 37087, 37174, 37126, 37192, 33467, 21233,
- 24048, 22538, 22745, 22754, 22752, 22746, 22497, 22607, 22550, 22610,
- 22557, 22628, 34188, 34131, 34294, 33703, 33799, 34031, 33511, 34338,
- 34086, 22603, 29026, 34136, 34045, 34126, 34184, 34234, 29334, 28366,
- 34113, 34254, 34130, 33984, 33874, 33892, 33940, 33845, 34207, 34133,
- 40367, 33939, 32264, 34118, 34146, 34078, 39488, 34362, 37795, 34167,
- 34334, 34298, 34308, 34282, 34330, 22889, 23607, 25451, 25718, 25759,
- 25681, 25692, 25779, 25860, 25878, 25847, 25852, 25883, 22064, 22072,
- 22216, 22182, 21764, 21692, 22144, 22109, 22112, 22069, 22006, 22118,
- 22130, 22156, 22117, 22044, 22062, 21993, 22038, 22208, 22029, 22195,
- 22209, 22127, 36705, 22198, 22165, 22279, 24131, 24172, 24152, 24151,
- 23943, 23796, 23888, 23852, 23975, 23968, 23959, 23821, 23992, 23937,
- 24020, 24480, 29559, 29505, 29546, 29499, 29547, 29568, 29564, 39136,
- 39219, 39145, 39228, {f: 2, c: 39146}, 39149, 39156, 39177, 39185, 39195,
- 39223, 39231, 39235, {f: 3, c: 39240}, 39244, 39266, 24289, 36065, 25082,
- 25006, 24938, 24894, 24757, 24884, 25036, 24927, 25064, 24827, 24887,
- 24818, 24947, 24860, 24978, 38274, 38278, 38344, 38286, 38292, 38284,
- 38373, 38317, 38315, 39726, 38316, 38334, 38326, 39721, 38335, 38333,
- 38332, 38339, 38347, 38356, 38352, 38357, 38366, 28739, 28505, 28711,
- 28696, 28668, 28039, 28025, 28254, 28590, 28687, 28408, 28527, 28150,
- 28543, 28678, 28576, 28683, 28775, 28740, 28677, 28535, 28704, 28703,
- 28722, 28712, 28765, 39467, 36999, 36885, 37008, 23656, 24371, 23285,
- 23255, 23296, 23149, 23304, 23372, 23207, 23291, 23307, 23329, 23338,
- 23321, 39380, 39391, 39385, 39478, 39515, 39377, 39384, 39501, 39498,
- 39394, 39530, 39439, 39437, 39429, 39490, 39469, 39446, 39489, 39470,
- 39480, {f: 2, c: 39491}, 39503, 39525, 39524, 31993, 32006, 32002,
- {f: 2, c: 32007}, 32394, 32028, 32021, 32019, 32058, 32050, 32049, 32272,
- 32060, 32064, 32063, 32093, 32078, 32115, 32134, 32131, 32136, 32190,
- 32186, 32203, 32212, 32196, 32158, 32172, 32185, 32163, 32176, 32199,
- 32217, 32215, 32249, 32242, 32354, 32230, 32246, 32241, 32267, 32225,
- 32265, 32285, 32287, 32286, 32301, 32266, 32273, 32381, 32313, 32309,
- 32306, 32326, 32325, 32392, 32346, 32338, 32366, 32382, 32368, 32367,
- 32408, 29859, 29771, 29903, 38922, 29885, 29759, 29833, 29862, 29908,
- 29914, 38873, 38878, 38876, 27050, 27370, 26776, 26838, 27141, 26783,
- 27355, 27379, 27368, 27359, 27273, 26895, 27208, 26984, 27071, 27194,
- 27292, 27410, 27422, 27357, 27111, 27407, 27414, 27372, 27354, 27384,
- 27315, 27367, 27299, 27347, 27358, 27556, 27550, 27566, 27563, 27567,
- 36564, 36571, 36594, 36603, 36708, 36601, 36604, 36587, 36580, 36706,
- 36602, 36606, 36618, 36615, 36613, 36626, 36646, {f: 2, c: 36638}, 36636,
- 36659, 36678, 36692, 25108, 25127, 29964, 26311, 26308, 26249, 26326,
- 36033, 36016, 36026, 36029, 36100, 36018, 36037, 36112, 36049, 36058,
- 36053, 36075, 36071, 36091, 35224, 35244, 35233, 35263, 35238, 35247,
- 35250, 35255, 27647, 27660, 27692, 29272, 26407, 33110, 33242, 33051,
- 33214, 33121, 33231, 27487, {f: 2, c: 39086}, 39094, 39100, 39110, 39112,
- 36674, 40783, 26005, 29036, 29010, 29079, 29121, 29148, 29182, 31152,
- 31118, 31146, 25055, 24932, 25059, 25095, 28585, 30959, 30893, 30824,
- 30904, 31018, 31025, 30820, 30973, 30951, 30947, 40853, 30616, 30558,
- 30652, 32646, 32648, {f: 3, c: 37330}, 37337, 37335, 37333, 37367, 37351,
- 37348, 37702, 37365, 37369, 37384, 37414, 37445, 37393, 37392, 37377,
- 37415, 37380, 37413, 37376, 37434, 37478, 37431, 37427, 37461, 37437,
- 37432, 37470, {f: 2, c: 37484}, 37439, 37984, 37424, 37449, 37448, 37453,
- 37422, 37433, 37944, 37548, 37536, 37498, 37546, 37614, 37583, 37891,
- 37603, 37946, 37553, 37542, 37799, 37526, 37580, 37545, 37877, 37523,
- 37503, 37801, 37530, 37658, 37547, 37507, 37899, 37544, 37539, 37906,
- 37688, 37617, 37847, 37605, 37616, 37615, 37608, 37564, 37597, 37622,
- {f: 2, c: 37926}, 37571, 37599, 37606, 37650, 37638, 37737, 37659, 37696,
- 37633, 37653, 37678, 37699, {f: 2, c: 37639}, 37663, 37657, 37733, 37703,
- 37750, 37716, 37732, 37802, 37744, 37764, 37860, 37848, 37928, 37767,
- 37836, 37784, 37816, 37823, 37798, 37808, 37813, 37964, 37858,
- {f: 2, c: 37852}, 37837, 37854, 37827, 37831, 37841, 37908, 37917, 37879,
- 37989, 37907, 37997, 37920, 38009, 37881, 37913, 37962, 37938, 37951,
- 37972, 37987, 37758, 31329, 40169, 40182, 40199, 40198, 40227, 40327,
- 40469, 40221, 40223, 40421, 40239, 40409, 40240, 40258, 40478, 40275,
- 40477, 40288, 40274, 40435, 40284, 40289, 40339, 40298, 40303, 40329,
- 40344, 40346, 40384, 40357, 40361, 40386, 40380, 40474, 40403, 40410,
- 40431, 40422, 40434, 40440, 40460, 40442, 40475, 30308, 30296, 30311,
- 30210, {f: 2, c: 30278}, 30281, 30238, 30267, {f: 2, c: 30317}, 30313,
- 30322, 31431, 31414, 35168, 35123, 35165, 35143, 35128, 35172, 30392,
- 32814, 32812, 32889, 32885, 38919, {f: 2, c: 38926}, 38945, 38940, 28481,
- 38950, 38967, 38990, 38995, 39027, 39010, 39001, 39013, 39020, 39024,
- 34787, 34822, 34566, 34851, 34806, 34554, 34799, 34692, 34832, 34760,
- 34833, 34747, 34766, 32588, 31716, 31591, 31849, 31731, 31744, 31691,
- 31836, 31774, 31787, 31779, 31850, 31839, 33380, 33387, 35018, 32677,
- 31986, 31990, 31965, 32310, 40617, 36274, 37317, 37315, 40570, 36489,
- 36428, 36498, 36474, 36437, 36506, 36491, 36499, 36497, 36513, 36451,
- 36522, 36518, 35316, 35318, 38746, 38722, 38717, 38724, 40788, 40799,
- 40793, 40800, 40796, 40806, 40812, 40810, 40823, [12236, 40701], 40703,
- 40713, 35726, 38014, 37864, 39799, 39796, 39809, 39811, 39822, 40056,
- 31308, 39826, 40031, 39824, 39853, 39834, 39850, 39838, 40045, 39851,
- 39837, 40024, 39873, 40058, 39985, 39993, 39971, 39991, 39872, 39882,
- 39879, 39933, 39894, {f: 2, c: 39914}, 39905, 39908, 39911, 39901, 39906,
- 39920, 39899, 39924, 39892, 40029, 39944, 39952, 39949, 39954, 39945,
- 39935, 39968, 39986, 39981, 39976, 39973, 39977, 39987, 39998, 40008,
- 39995, 39989, 40005, 40022, 40020, 40018, 40039, 38851, 38845, 38857,
- 40379, 39631, 39638, 39637, 39768, 39758, 39255, 39260, 39714, 40695,
- 40690, 35180, 38342, 37686, 24390, 34068, 32404, 40803, 22137, 40725,
- 22081, 39662, 35079, 31296, 39091, 38308, 39693, 36852, 24409, 31339,
- 39138, 20642, 34193, 20760, 25458, 21067, 30543, 32397, 26310, 30637,
- [12228, 40565], 22217, 40692, 28635, 25054, 30663, 28720, 40629, 34890,
- 38370, 38854, 31844, 32308, 38822, 40623, 22220, 39089, 27311, 32590,
- 31984, 20418, 32363, 40569, 22190, 39706, 33903, 31142, 31858, 39634,
- 38587, 32251, 35069, 30787, {f: 10, c: 8560}, {f: 2, c: 714}, 729, 8211,
- 8213, 8229, 8245, 8453, 8457, {f: 4, c: 8598}, 8725, 8735, 8739, 8786,
- {f: 2, c: 8806}, 8895, {f: 36, c: 9552}, {f: 15, c: 9601}, {f: 3, c: 9619},
- {f: 2, c: 9660}, {f: 4, c: 9698}, 9737, 8853, 12306, {f: 2, c: 12317},
- {f: 9, c: 12321}, 12963, {f: 2, c: 13198}, {f: 3, c: 13212}, 13217, 13252,
- 13262, {f: 2, c: 13265}, 13269, 65072, 65506, 65508, 8481, 12849, 8208,
- 12540, {f: 2, c: 12443}, {f: 2, c: 12541}, 12294, {f: 2, c: 12445},
- {f: 10, c: 65097}, {f: 4, c: 65108}, {f: 14, c: 65113}, {f: 4, c: 65128},
- 12350, {f: 12, c: 12272}, 19970, {f: 3, c: 19972}, 19983, 19986, 19991,
- {f: 3, c: 19999}, 20003, 20006, 20009, {f: 2, c: 20014}, 20017, 20019,
- 20021, 20023, 20028, {f: 3, c: 20032}, 20036, 20038, 20042, 20049, 20053,
- 20055, {f: 2, c: 20058}, {f: 4, c: 20066}, {f: 2, c: 20071},
- {f: 6, c: 20074}, 20082, {f: 10, c: 20084}, {f: 3, c: 20095},
- {f: 2, c: 20099}, [12037, 20101], 20103, 20106, 20112, {f: 2, c: 20118},
- 20121, {f: 2, c: 20124}, 20131, 20138, {f: 3, c: 20143}, 20148,
- {f: 4, c: 20150}, {f: 3, c: 20156}, 20168, 20172, {f: 2, c: 20175}, 20178,
- {f: 3, c: 20186}, 20192, 20194, {f: 2, c: 20198}, 20201, {f: 3, c: 20205},
- 20209, 20212, {f: 3, c: 20216}, 20220, 20222, 20224, {f: 7, c: 20226},
- {f: 2, c: 20235}, {f: 5, c: 20242}, {f: 2, c: 20252}, 20257, 20259,
- {f: 2, c: 20264}, {f: 3, c: 20268}, 20273, 20275, 20277, 20279, 20281,
- 20283, {f: 5, c: 20286}, {f: 2, c: 20292}, {f: 6, c: 20295}, 20306, 20308,
- 20310, {f: 2, c: 20321}, 20326, 20328, {f: 2, c: 20330}, {f: 2, c: 20333},
- {f: 2, c: 20337}, 20341, {f: 4, c: 20343}, 20349, {f: 3, c: 20352}, 20357,
- 20359, 20362, 20364, 20366, 20368, {f: 2, c: 20370}, 20373,
- {f: 3, c: 20376}, 20380, {f: 2, c: 20382}, {f: 2, c: 20385}, 20388, 20395,
- 20397, {f: 5, c: 20400}, {f: 9, c: 20406}, {f: 2, c: 20416},
- {f: 4, c: 20422}, {f: 3, c: 20427}, {f: 5, c: 20434}, 20441, 20443, 20450,
- {f: 2, c: 20452}, 20455, {f: 2, c: 20459}, 20464, 20466, {f: 4, c: 20468},
- 20473, {f: 3, c: 20475}, 20479, {f: 5, c: 20481}, {f: 2, c: 20487}, 20490,
- 20494, 20496, 20499, {f: 3, c: 20501}, 20507, {f: 2, c: 20509}, 20512,
- {f: 3, c: 20514}, 20519, {f: 11, c: 20527}, 20539, 20541, {f: 4, c: 20543},
- {f: 3, c: 20548}, {f: 2, c: 20554}, 20557, {f: 5, c: 20560},
- {f: 4, c: 20566}, 20571, {f: 8, c: 20573}, {f: 6, c: 20582},
- {f: 7, c: 20589}, {f: 3, c: 20600}, {f: 2, c: 20604}, {f: 4, c: 20609},
- {f: 2, c: 20614}, {f: 4, c: 20617}, {f: 8, c: 20622}, 20631,
- {f: 8, c: 20634}, 20644, 20646, {f: 2, c: 20650}, {f: 4, c: 20654}, 20662,
- {f: 2, c: 20664}, {f: 2, c: 20668}, {f: 3, c: 20671}, {f: 2, c: 20675},
- {f: 3, c: 20678}, {f: 5, c: 20682}, 20688, {f: 3, c: 20690},
- {f: 3, c: 20695}, {f: 3, c: 20699}, {f: 6, c: 20703}, {f: 3, c: 20713},
- {f: 4, c: 20719}, 20724, {f: 3, c: 20726}, 20730, {f: 4, c: 20732}, 20737,
- 20739, 20741, 20746, {f: 4, c: 20748}, 20753, 20755, {f: 2, c: 20758},
- {f: 6, c: 20761}, 20768, {f: 8, c: 20770}, {f: 7, c: 20779},
- {f: 4, c: 20787}, {f: 2, c: 20792}, {f: 2, c: 20797}, 20802, 20807, 20810,
- 20812, {f: 3, c: 20814}, 20819, {f: 3, c: 20823}, 20827, {f: 5, c: 20829},
- {f: 2, c: 20835}, {f: 2, c: 20838}, 20842, 20847, 20850, 20858,
- {f: 2, c: 20862}, {f: 2, c: 20867}, {f: 2, c: 20870}, {f: 2, c: 20874},
- {f: 4, c: 20878}, {f: 2, c: 20883}, 20888, 20890, {f: 3, c: 20893}, 20897,
- 20899, {f: 5, c: 20902}, {f: 2, c: 20909}, 20916, {f: 3, c: 20920},
- {f: 2, c: 20926}, {f: 3, c: 20929}, 20933, 20936, 20938, 20942, 20944,
- {f: 9, c: 20946}, 20956, {f: 2, c: 20958}, {f: 2, c: 20962},
- {f: 6, c: 20965}, 20972, 20974, 20978, 20980, 20983, 20990,
- {f: 2, c: 20996}, 21001, {f: 2, c: 21003}, {f: 2, c: 21007},
- {f: 3, c: 21011}, 21020, {f: 2, c: 21022}, {f: 3, c: 21025},
- {f: 3, c: 21029}, 21034, 21036, 21039, {f: 2, c: 21041}, {f: 2, c: 21044},
- 21052, 21054, {f: 2, c: 21061}, {f: 2, c: 21064}, {f: 2, c: 21070},
- {f: 2, c: 21074}, 21077, {f: 4, c: 21079}, 21085, {f: 2, c: 21087},
- {f: 3, c: 21090}, 21094, 21096, {f: 3, c: 21099}, {f: 2, c: 21104}, 21107,
- {f: 7, c: 21110}, 21118, 21120, {f: 3, c: 21124}, 21131, {f: 2, c: 21134},
- 21138, {f: 7, c: 21140}, 21148, {f: 4, c: 21156}, {f: 3, c: 21166},
- {f: 10, c: 21172}, 21184, 21186, {f: 3, c: 21188}, 21192, 21194,
- {f: 4, c: 21196}, 21201, {f: 2, c: 21203}, 21207, 21210, 21212,
- {f: 2, c: 21216}, 21219, {f: 11, c: 21221}, {f: 3, c: 21234},
- {f: 2, c: 21238}, {f: 3, c: 21243}, {f: 4, c: 21249}, 21255,
- {f: 4, c: 21257}, 21262, {f: 4, c: 21265}, 21272, {f: 2, c: 21275},
- {f: 2, c: 21278}, 21282, {f: 2, c: 21284}, {f: 3, c: 21287},
- {f: 2, c: 21291}, 21296, {f: 6, c: 21298}, [12054, 21304],
- {f: 2, c: 21308}, 21314, 21316, 21318, {f: 3, c: 21323}, 21328,
- {f: 2, c: 21336}, 21339, 21341, 21349, 21352, 21354, {f: 2, c: 21356},
- 21362, 21366, 21369, {f: 4, c: 21371}, {f: 2, c: 21376}, 21379,
- {f: 2, c: 21383}, 21386, {f: 7, c: 21390}, {f: 2, c: 21398},
- {f: 2, c: 21403}, 21406, 21409, 21412, 21415, {f: 3, c: 21418},
- {f: 3, c: 21423}, 21427, 21429, {f: 4, c: 21431}, {f: 3, c: 21436}, 21440,
- {f: 4, c: 21444}, {f: 3, c: 21454}, {f: 2, c: 21458}, 21461, 21466,
- {f: 3, c: 21468}, 21473, 21479, 21492, 21498, {f: 3, c: 21502}, 21506,
- 21509, 21511, 21515, 21524, {f: 3, c: 21528}, 21532, 21538,
- {f: 2, c: 21540}, 21546, 21552, 21555, {f: 2, c: 21558}, 21562, 21565,
- 21567, {f: 2, c: 21569}, {f: 2, c: 21572}, 21575, 21577, {f: 4, c: 21580},
- 21585, 21594, {f: 5, c: 21597}, 21603, 21605, 21607, {f: 8, c: 21609},
- 21620, {f: 2, c: 21625}, {f: 2, c: 21630}, 21633, 21635, 21637,
- {f: 4, c: 21639}, 21645, 21649, 21651, {f: 2, c: 21655}, 21660,
- {f: 5, c: 21662}, 21669, 21678, 21680, 21682, {f: 3, c: 21685},
- {f: 2, c: 21689}, 21694, 21699, 21701, {f: 2, c: 21706}, 21718, 21720,
- 21723, 21728, {f: 3, c: 21730}, {f: 2, c: 21739}, {f: 3, c: 21743},
- {f: 6, c: 21748}, 21755, 21758, 21760, {f: 2, c: 21762}, 21765, 21768,
- {f: 5, c: 21770}, {f: 2, c: 21778}, {f: 6, c: 21781}, {f: 4, c: 21788},
- 21793, {f: 2, c: 21797}, {f: 2, c: 21800}, 21803, 21805, 21810,
- {f: 3, c: 21812}, {f: 4, c: 21816}, 21821, 21824, 21826, 21829,
- {f: 2, c: 21831}, {f: 4, c: 21835}, {f: 2, c: 21841}, 21844,
- {f: 5, c: 21847}, 21853, {f: 2, c: 21855}, {f: 2, c: 21858},
- {f: 2, c: 21864}, 21867, {f: 6, c: 21871}, {f: 2, c: 21881}, 21885, 21887,
- {f: 2, c: 21893}, {f: 3, c: 21900}, 21904, {f: 2, c: 21906},
- {f: 3, c: 21909}, {f: 2, c: 21914}, 21918, {f: 7, c: 21920},
- {f: 2, c: 21928}, 21931, 21933, {f: 2, c: 21935}, 21940, 21942, 21944,
- 21946, 21948, {f: 5, c: 21951}, 21960, {f: 2, c: 21962}, {f: 2, c: 21967},
- 21973, {f: 3, c: 21975}, 21979, 21982, 21984, 21986, 21991,
- {f: 2, c: 21997}, {f: 2, c: 22000}, 22004, {f: 5, c: 22008}, 22015,
- {f: 4, c: 22018}, 22023, {f: 2, c: 22026}, {f: 4, c: 22032}, 22037,
- {f: 2, c: 22041}, 22045, {f: 3, c: 22048}, {f: 2, c: 22053}, 22056,
- {f: 2, c: 22058}, 22067, 22071, 22074, {f: 3, c: 22076}, 22080,
- {f: 10, c: 22082}, {f: 5, c: 22095}, {f: 2, c: 22101}, {f: 2, c: 22106},
- {f: 2, c: 22110}, 22113, 22115, 22119, {f: 2, c: 22125}, 22128, 22131,
- 22133, 22135, 22138, {f: 3, c: 22141}, {f: 4, c: 22145}, {f: 4, c: 22152},
- 22157, {f: 3, c: 22160}, 22164, {f: 3, c: 22166}, {f: 9, c: 22170},
- {f: 2, c: 22180}, 22183, {f: 5, c: 22185}, {f: 3, c: 22192}, 22197,
- {f: 4, c: 22200}, {f: 3, c: 22205}, {f: 2, c: 22211}, {f: 2, c: 22214},
- 22219, {f: 4, c: 22221}, {f: 2, c: 22226}, {f: 2, c: 22229},
- {f: 2, c: 22232}, 22236, 22243, {f: 6, c: 22245}, 22252, {f: 2, c: 22254},
- {f: 2, c: 22258}, {f: 3, c: 22262}, {f: 2, c: 22267}, {f: 3, c: 22272},
- 22277, 22284, {f: 4, c: 22286}, {f: 2, c: 22292}, 22295, {f: 3, c: 22297},
- {f: 2, c: 22301}, {f: 3, c: 22304}, {f: 4, c: 22308}, 22315,
- {f: 2, c: 22321}, {f: 5, c: 22324}, {f: 2, c: 22332}, 22335, 22337,
- {f: 4, c: 22339}, {f: 2, c: 22344}, 22347, {f: 5, c: 22354},
- {f: 2, c: 22360}, {f: 2, c: 22370}, 22373, 22375, 22380, 22382,
- {f: 3, c: 22384}, {f: 2, c: 22388}, {f: 3, c: 22392}, {f: 5, c: 22397},
- {f: 4, c: 22407}, {f: 5, c: 22413}, {f: 7, c: 22420}, {f: 4, c: 22428},
- 22437, 22440, 22442, 22444, {f: 3, c: 22447}, 22451, {f: 3, c: 22453},
- {f: 9, c: 22457}, {f: 7, c: 22468}, {f: 2, c: 22476}, {f: 2, c: 22480},
- 22483, {f: 2, c: 22486}, {f: 2, c: 22491}, 22494, {f: 2, c: 22498},
- {f: 8, c: 22501}, 22510, {f: 4, c: 22512}, {f: 2, c: 22517},
- {f: 2, c: 22523}, {f: 2, c: 22526}, 22529, {f: 2, c: 22531},
- {f: 2, c: 22536}, 22540, {f: 3, c: 22542}, {f: 3, c: 22546},
- {f: 2, c: 22551}, {f: 3, c: 22554}, 22559, {f: 2, c: 22562},
- {f: 5, c: 22565}, {f: 4, c: 22571}, {f: 2, c: 22578}, {f: 14, c: 22582},
- {f: 5, c: 22597}, 22606, 22608, 22611, {f: 2, c: 22613}, {f: 5, c: 22617},
- {f: 3, c: 22623}, 22627, {f: 5, c: 22630}, {f: 8, c: 22637},
- {f: 3, c: 22646}, {f: 4, c: 22650}, 22655, 22658, 22660, {f: 3, c: 22662},
- {f: 7, c: 22667}, {f: 5, c: 22676}, 22683, 22685, {f: 8, c: 22688},
- {f: 4, c: 22698}, {f: 4, c: 22703}, {f: 7, c: 22708}, 22717,
- {f: 2, c: 22719}, {f: 3, c: 22722}, 22726, {f: 9, c: 22728}, 22738, 22740,
- {f: 2, c: 22742}, {f: 3, c: 22747}, 22753, 22755, {f: 4, c: 22757}, 22762,
- 22765, {f: 2, c: 22769}, {f: 2, c: 22772}, {f: 2, c: 22775},
- {f: 2, c: 22779}, {f: 4, c: 22782}, 22787, {f: 2, c: 22789},
- {f: 2, c: 22792}, [12066, 22794], {f: 2, c: 22795}, 22798,
- {f: 4, c: 22800}, {f: 2, c: 22807}, 22811, {f: 2, c: 22813},
- {f: 2, c: 22816}, 22819, 22822, 22824, 22828, 22832, {f: 2, c: 22834},
- {f: 2, c: 22837}, 22843, 22845, {f: 2, c: 22847}, 22851, {f: 2, c: 22853},
- 22858, {f: 2, c: 22860}, 22864, {f: 2, c: 22866}, 22873, {f: 5, c: 22875},
- 22881, {f: 2, c: 22883}, {f: 3, c: 22886}, 22891, 22893, {f: 4, c: 22895},
- 22901, 22903, {f: 3, c: 22906}, {f: 3, c: 22910}, 22917, 22921,
- {f: 2, c: 22923}, {f: 4, c: 22926}, {f: 2, c: 22932}, 22936,
- {f: 3, c: 22938}, {f: 4, c: 22943}, {f: 2, c: 22950}, {f: 2, c: 22956},
- {f: 2, c: 22960}, {f: 6, c: 22963}, 22970, {f: 2, c: 22972},
- {f: 7, c: 22975}, {f: 3, c: 22983}, {f: 4, c: 22988}, {f: 2, c: 22997},
- 23001, 23003, {f: 5, c: 23006}, 23012, {f: 2, c: 23014}, {f: 3, c: 23017},
- {f: 12, c: 23021}, 23034, {f: 3, c: 23036}, 23040, 23042, {f: 2, c: 23050},
- {f: 4, c: 23053}, 23058, {f: 4, c: 23060}, {f: 3, c: 23065},
- {f: 2, c: 23069}, {f: 2, c: 23073}, 23076, {f: 3, c: 23078},
- {f: 7, c: 23082}, 23091, 23093, {f: 5, c: 23095}, {f: 3, c: 23101},
- {f: 4, c: 23106}, {f: 2, c: 23111}, {f: 10, c: 23115}, {f: 4, c: 23126},
- {f: 7, c: 23131}, {f: 3, c: 23139}, {f: 2, c: 23144}, {f: 2, c: 23147},
- {f: 6, c: 23150}, {f: 2, c: 23160}, {f: 4, c: 23163}, {f: 18, c: 23168},
- {f: 7, c: 23187}, {f: 11, c: 23196}, {f: 2, c: 23208}, {f: 7, c: 23211},
- 23220, {f: 2, c: 23222}, {f: 4, c: 23225}, {f: 2, c: 23231},
- {f: 6, c: 23235}, {f: 2, c: 23242}, {f: 5, c: 23245}, 23251, 23253,
- {f: 3, c: 23257}, {f: 3, c: 23261}, 23266, {f: 2, c: 23268},
- {f: 2, c: 23271}, 23274, {f: 5, c: 23276}, {f: 3, c: 23282},
- {f: 5, c: 23286}, {f: 4, c: 23292}, {f: 7, c: 23297}, 23306,
- {f: 9, c: 23309}, 23320, {f: 7, c: 23322}, {f: 8, c: 23330},
- {f: 5, c: 23339}, 23345, 23347, {f: 2, c: 23349}, {f: 7, c: 23353},
- {f: 11, c: 23361}, {f: 3, c: 23373}, 23378, 23382, 23390, {f: 2, c: 23392},
- {f: 2, c: 23399}, {f: 3, c: 23405}, 23410, 23412, {f: 2, c: 23414}, 23417,
- {f: 2, c: 23419}, 23422, 23426, 23430, 23434, {f: 2, c: 23437},
- {f: 3, c: 23440}, 23444, 23446, 23455, {f: 3, c: 23463}, {f: 4, c: 23468},
- {f: 2, c: 23473}, 23479, {f: 3, c: 23482}, {f: 2, c: 23488}, 23491,
- {f: 4, c: 23496}, {f: 3, c: 23501}, 23505, {f: 9, c: 23508}, 23520, 23523,
- 23530, 23533, 23535, {f: 4, c: 23537}, 23543, {f: 2, c: 23549}, 23552,
- {f: 2, c: 23554}, 23557, 23564, 23568, {f: 2, c: 23570}, 23575, 23577,
- 23579, {f: 4, c: 23582}, 23587, 23590, {f: 4, c: 23592}, {f: 4, c: 23597},
- {f: 2, c: 23602}, {f: 2, c: 23605}, {f: 2, c: 23619}, {f: 2, c: 23622},
- {f: 2, c: 23628}, {f: 3, c: 23634}, {f: 3, c: 23638}, {f: 4, c: 23642},
- 23647, 23655, {f: 3, c: 23657}, 23661, 23664, {f: 7, c: 23666},
- {f: 4, c: 23675}, 23680, {f: 5, c: 23683}, {f: 3, c: 23689},
- {f: 2, c: 23694}, {f: 2, c: 23698}, 23701, {f: 4, c: 23709},
- {f: 5, c: 23716}, 23722, {f: 3, c: 23726}, 23730, 23732, 23734,
- {f: 4, c: 23737}, 23742, 23744, {f: 2, c: 23746}, {f: 6, c: 23749},
- {f: 6, c: 23756}, {f: 6, c: 23763}, {f: 7, c: 23770}, {f: 2, c: 23778},
- 23783, 23785, {f: 2, c: 23787}, {f: 2, c: 23790}, {f: 3, c: 23793}, 23797,
- {f: 4, c: 23799}, 23804, {f: 4, c: 23806}, {f: 2, c: 23812},
- {f: 5, c: 23816}, {f: 5, c: 23823}, 23829, {f: 3, c: 23832},
- {f: 2, c: 23836}, {f: 5, c: 23839}, 23845, 23848, {f: 2, c: 23850},
- {f: 5, c: 23855}, {f: 8, c: 23861}, {f: 8, c: 23871}, {f: 2, c: 23880},
- {f: 3, c: 23885}, {f: 7, c: 23889}, {f: 2, c: 23897}, 23900,
- {f: 11, c: 23902}, 23914, {f: 2, c: 23917}, {f: 4, c: 23920},
- {f: 12, c: 23925}, 23939, {f: 2, c: 23941}, {f: 15, c: 23944}, 23960,
- {f: 3, c: 23962}, {f: 2, c: 23966}, {f: 6, c: 23969}, {f: 15, c: 23976},
- 23993, 23995, {f: 8, c: 23997}, {f: 5, c: 24006}, 24012, {f: 4, c: 24014},
- 24019, {f: 6, c: 24021}, 24028, {f: 2, c: 24031}, {f: 2, c: 24035}, 24042,
- {f: 2, c: 24044}, {f: 2, c: 24053}, {f: 5, c: 24056}, {f: 2, c: 24063},
- 24068, 24071, {f: 3, c: 24073}, {f: 2, c: 24077}, {f: 2, c: 24082}, 24087,
- {f: 7, c: 24094}, {f: 3, c: 24104}, 24108, {f: 2, c: 24111}, 24114,
- {f: 2, c: 24116}, {f: 2, c: 24121}, {f: 2, c: 24126}, 24129,
- {f: 6, c: 24134}, {f: 7, c: 24141}, 24150, {f: 2, c: 24153},
- {f: 2, c: 24156}, 24160, {f: 7, c: 24164}, {f: 5, c: 24173}, 24181, 24183,
- {f: 3, c: 24193}, 24197, {f: 2, c: 24200}, {f: 3, c: 24204}, 24210, 24216,
- 24219, 24221, {f: 4, c: 24225}, {f: 3, c: 24232}, 24236, {f: 5, c: 24238},
- 24244, {f: 4, c: 24250}, {f: 10, c: 24255}, {f: 6, c: 24267},
- {f: 2, c: 24276}, {f: 4, c: 24279}, {f: 3, c: 24284}, {f: 4, c: 24292},
- 24297, 24299, {f: 6, c: 24301}, 24309, {f: 2, c: 24312}, {f: 3, c: 24315},
- {f: 3, c: 24325}, 24329, {f: 3, c: 24332}, 24336, 24338, 24340, 24342,
- {f: 2, c: 24345}, {f: 3, c: 24348}, {f: 4, c: 24353}, 24360,
- {f: 2, c: 24363}, 24366, 24368, 24370, 24372, {f: 3, c: 24374}, 24379,
- {f: 3, c: 24381}, {f: 5, c: 24385}, 24391, {f: 3, c: 24393}, 24397, 24399,
- 24401, 24404, {f: 3, c: 24410}, {f: 3, c: 24414}, 24419, 24421,
- {f: 2, c: 24423}, 24427, {f: 2, c: 24430}, 24434, {f: 3, c: 24436}, 24440,
- 24442, {f: 3, c: 24445}, 24451, 24454, {f: 3, c: 24461}, {f: 2, c: 24467},
- 24470, {f: 2, c: 24474}, 24477, 24479, {f: 6, c: 24482}, {f: 2, c: 24491},
- {f: 6, c: 24495}, 24502, 24504, {f: 2, c: 24506}, {f: 5, c: 24510},
- {f: 2, c: 24519}, {f: 2, c: 24522}, 24526, {f: 3, c: 24531},
- {f: 3, c: 24538}, {f: 2, c: 24542}, {f: 2, c: 24546}, {f: 2, c: 24549},
- {f: 2, c: 24552}, 24556, {f: 2, c: 24559}, {f: 3, c: 24562},
- {f: 2, c: 24566}, {f: 2, c: 24569}, 24572, {f: 3, c: 24583},
- {f: 2, c: 24587}, {f: 2, c: 24592}, 24595, {f: 2, c: 24599}, 24602,
- {f: 2, c: 24606}, {f: 3, c: 24610}, {f: 3, c: 24620}, {f: 5, c: 24624},
- {f: 5, c: 24630}, {f: 2, c: 24637}, 24640, {f: 7, c: 24644}, 24652,
- {f: 2, c: 24654}, 24657, {f: 2, c: 24659}, {f: 3, c: 24662},
- {f: 2, c: 24667}, {f: 4, c: 24670}, {f: 2, c: 24677}, 24686,
- {f: 2, c: 24689}, {f: 2, c: 24692}, 24695, 24702, {f: 3, c: 24704},
- {f: 4, c: 24709}, {f: 2, c: 24714}, {f: 4, c: 24718}, 24723, 24725,
- {f: 3, c: 24727}, 24732, 24734, {f: 2, c: 24737}, {f: 2, c: 24740}, 24743,
- {f: 2, c: 24745}, 24750, 24752, 24755, 24759, {f: 2, c: 24761},
- {f: 8, c: 24765}, {f: 3, c: 24775}, {f: 5, c: 24780}, {f: 3, c: 24786},
- {f: 2, c: 24790}, 24793, 24795, 24798, {f: 4, c: 24802}, 24810, 24821,
- {f: 2, c: 24823}, {f: 4, c: 24828}, {f: 4, c: 24834}, 24839,
- {f: 3, c: 24842}, {f: 5, c: 24848}, {f: 4, c: 24854}, {f: 2, c: 24861},
- {f: 2, c: 24865}, 24869, {f: 3, c: 24872}, {f: 8, c: 24876},
- {f: 2, c: 24885}, {f: 6, c: 24888}, {f: 8, c: 24896}, 24905, 24909,
- {f: 2, c: 24911}, {f: 3, c: 24914}, {f: 2, c: 24918}, 24921,
- {f: 2, c: 24923}, 24926, {f: 2, c: 24928}, {f: 2, c: 24933}, 24937,
- {f: 2, c: 24940}, 24943, {f: 2, c: 24945}, 24948, {f: 10, c: 24952},
- {f: 7, c: 24963}, {f: 2, c: 24972}, 24975, 24979, {f: 5, c: 24981},
- {f: 2, c: 24987}, {f: 6, c: 24990}, {f: 2, c: 24997}, 25002, 25005,
- {f: 3, c: 25007}, {f: 3, c: 25011}, {f: 6, c: 25016}, {f: 3, c: 25023},
- {f: 4, c: 25027}, {f: 4, c: 25037}, 25043, {f: 9, c: 25045},
- {f: 3, c: 25056}, {f: 2, c: 25060}, 25063, {f: 9, c: 25065},
- {f: 2, c: 25075}, 25081, 25083, 25085, {f: 5, c: 25089}, 25097, 25107,
- 25113, {f: 3, c: 25116}, 25120, 25123, 25126, {f: 2, c: 25128}, 25131,
- 25133, 25135, 25137, 25141, [12094, 25142], {f: 5, c: 25144}, 25154,
- {f: 3, c: 25156}, 25162, {f: 2, c: 25167}, {f: 3, c: 25173},
- {f: 2, c: 25177}, {f: 7, c: 25180}, {f: 2, c: 25188}, 25192,
- {f: 2, c: 25201}, {f: 2, c: 25204}, {f: 2, c: 25207}, {f: 2, c: 25210},
- 25213, {f: 3, c: 25217}, {f: 4, c: 25221}, {f: 6, c: 25227}, 25236, 25241,
- {f: 3, c: 25244}, 25251, {f: 2, c: 25254}, {f: 2, c: 25257},
- {f: 4, c: 25261}, {f: 3, c: 25266}, {f: 3, c: 25270}, 25274, 25278,
- {f: 2, c: 25280}, 25283, 25291, 25295, 25297, 25301, {f: 2, c: 25309},
- {f: 2, c: 25312}, 25316, {f: 2, c: 25322}, 25328, 25330, 25333,
- {f: 4, c: 25336}, 25344, {f: 4, c: 25347}, {f: 4, c: 25354},
- {f: 2, c: 25359}, {f: 4, c: 25362}, {f: 3, c: 25367}, 25372,
- {f: 2, c: 25382}, 25385, {f: 3, c: 25388}, {f: 2, c: 25392},
- {f: 6, c: 25395}, {f: 2, c: 25403}, {f: 3, c: 25407}, 25412,
- {f: 2, c: 25415}, 25418, {f: 4, c: 25425}, {f: 8, c: 25430}, 25440,
- {f: 3, c: 25444}, 25450, 25452, {f: 2, c: 25455}, {f: 3, c: 25459},
- {f: 2, c: 25464}, {f: 4, c: 25468}, 25473, {f: 2, c: 25477}, 25483, 25485,
- 25489, {f: 3, c: 25491}, 25495, {f: 7, c: 25497}, 25505, 25508, 25510,
- 25515, 25519, {f: 2, c: 25521}, {f: 2, c: 25525}, 25529, 25531, 25533,
- 25535, {f: 3, c: 25537}, 25541, {f: 2, c: 25543}, {f: 3, c: 25546}, 25553,
- {f: 3, c: 25555}, {f: 3, c: 25559}, {f: 3, c: 25563}, 25567, 25570,
- {f: 5, c: 25572}, {f: 2, c: 25579}, {f: 3, c: 25583}, 25587, 25589, 25591,
- {f: 4, c: 25593}, 25598, {f: 2, c: 25603}, {f: 5, c: 25606}, 25614,
- {f: 2, c: 25617}, {f: 2, c: 25621}, {f: 3, c: 25624}, 25629, 25631,
- {f: 4, c: 25634}, {f: 3, c: 25639}, 25643, {f: 6, c: 25646}, 25653,
- {f: 3, c: 25655}, {f: 2, c: 25659}, 25662, 25664, {f: 2, c: 25666}, 25673,
- {f: 6, c: 25675}, 25683, {f: 3, c: 25685}, {f: 3, c: 25689}, 25693,
- {f: 7, c: 25696}, 25704, {f: 3, c: 25706}, 25710, {f: 3, c: 25712},
- {f: 2, c: 25716}, 25719, {f: 6, c: 25724}, 25731, 25734, {f: 8, c: 25737},
- 25748, {f: 2, c: 25751}, {f: 4, c: 25754}, {f: 3, c: 25760},
- {f: 3, c: 25766}, 25770, 25775, 25777, 25780, 25782, 25785, 25789, 25795,
- 25798, {f: 2, c: 25800}, 25804, 25807, 25809, 25811, {f: 2, c: 25813},
- 25817, {f: 3, c: 25819}, 25823, 25825, 25827, 25829, {f: 5, c: 25831},
- {f: 2, c: 25837}, 25843, {f: 2, c: 25845}, {f: 2, c: 25848}, 25853, 25855,
- {f: 3, c: 25857}, 25861, {f: 2, c: 25863}, {f: 5, c: 25866},
- {f: 2, c: 25872}, 25875, 25877, 25879, 25882, 25884, {f: 4, c: 25886},
- {f: 4, c: 25894}, 25901, {f: 4, c: 25904}, 25911, 25914, {f: 2, c: 25916},
- {f: 5, c: 25920}, {f: 2, c: 25926}, {f: 2, c: 25930}, {f: 2, c: 25933},
- 25936, {f: 3, c: 25938}, 25944, 25946, 25948, {f: 3, c: 25951},
- {f: 2, c: 25956}, {f: 4, c: 25959}, {f: 3, c: 25965}, 25969, 25971, 25974,
- {f: 9, c: 25977}, {f: 3, c: 25988}, {f: 3, c: 25992}, {f: 3, c: 25997},
- 26002, 26004, 26006, 26008, 26010, {f: 2, c: 26013}, 26016,
- {f: 2, c: 26018}, 26022, 26024, 26026, 26030, {f: 6, c: 26033}, 26040,
- {f: 2, c: 26042}, {f: 3, c: 26046}, 26050, {f: 4, c: 26055}, 26061,
- {f: 2, c: 26064}, {f: 3, c: 26067}, {f: 8, c: 26072}, 26081,
- {f: 2, c: 26083}, {f: 2, c: 26090}, {f: 4, c: 26098}, {f: 2, c: 26104},
- {f: 5, c: 26107}, 26113, {f: 2, c: 26116}, {f: 3, c: 26119}, 26123, 26125,
- {f: 3, c: 26128}, {f: 3, c: 26134}, {f: 3, c: 26138}, 26142,
- {f: 4, c: 26145}, 26150, {f: 4, c: 26153}, 26158, 26160, {f: 2, c: 26162},
- {f: 5, c: 26167}, 26173, {f: 2, c: 26175}, {f: 7, c: 26180},
- {f: 2, c: 26189}, {f: 2, c: 26192}, {f: 2, c: 26200}, {f: 2, c: 26203},
- 26206, 26208, {f: 2, c: 26210}, 26213, 26215, {f: 5, c: 26217},
- {f: 3, c: 26225}, 26229, {f: 2, c: 26232}, {f: 3, c: 26235},
- {f: 3, c: 26239}, 26243, {f: 2, c: 26245}, {f: 2, c: 26250},
- {f: 4, c: 26253}, {f: 4, c: 26258}, {f: 5, c: 26264}, {f: 4, c: 26270},
- {f: 4, c: 26275}, {f: 2, c: 26281}, {f: 2, c: 26284}, {f: 5, c: 26287},
- {f: 4, c: 26293}, {f: 4, c: 26298}, {f: 5, c: 26303}, 26309, 26312,
- {f: 12, c: 26314}, {f: 2, c: 26327}, 26330, {f: 2, c: 26334},
- {f: 5, c: 26337}, {f: 2, c: 26343}, {f: 2, c: 26346}, {f: 3, c: 26349},
- 26353, {f: 2, c: 26357}, {f: 2, c: 26362}, 26365, {f: 2, c: 26369},
- {f: 4, c: 26372}, 26380, {f: 2, c: 26382}, {f: 3, c: 26385}, 26390,
- {f: 3, c: 26392}, 26396, 26398, {f: 6, c: 26400}, 26409, 26414, 26416,
- {f: 2, c: 26418}, {f: 4, c: 26422}, {f: 2, c: 26427}, {f: 2, c: 26430},
- 26433, {f: 2, c: 26436}, 26439, {f: 2, c: 26442}, 26445, 26450,
- {f: 2, c: 26452}, {f: 5, c: 26455}, 26461, {f: 3, c: 26466},
- {f: 2, c: 26470}, {f: 2, c: 26475}, 26478, 26484, 26486, {f: 4, c: 26488},
- 26493, 26496, {f: 2, c: 26498}, {f: 2, c: 26501}, 26504, 26506,
- {f: 4, c: 26508}, {f: 4, c: 26513}, 26518, 26521, 26523, {f: 3, c: 26527},
- 26532, 26534, 26537, 26540, 26542, {f: 2, c: 26545}, 26548,
- {f: 8, c: 26553}, 26562, {f: 10, c: 26565}, {f: 3, c: 26581}, 26587, 26591,
- 26593, {f: 2, c: 26595}, {f: 3, c: 26598}, {f: 2, c: 26602},
- {f: 2, c: 26605}, 26610, {f: 8, c: 26613}, 26622, {f: 4, c: 26625}, 26630,
- 26637, 26640, 26642, {f: 2, c: 26644}, {f: 5, c: 26648}, {f: 3, c: 26654},
- {f: 7, c: 26658}, {f: 7, c: 26667}, {f: 3, c: 26676}, {f: 2, c: 26682},
- 26687, 26695, 26699, 26701, 26703, 26706, {f: 10, c: 26710}, 26730,
- {f: 8, c: 26732}, 26741, {f: 9, c: 26744}, 26754, 26756, {f: 8, c: 26759},
- {f: 3, c: 26768}, {f: 3, c: 26772}, {f: 4, c: 26777}, 26782,
- {f: 2, c: 26784}, {f: 3, c: 26787}, {f: 4, c: 26793}, 26798,
- {f: 2, c: 26801}, 26804, {f: 10, c: 26806}, 26817, {f: 6, c: 26819}, 26826,
- 26828, {f: 4, c: 26830}, {f: 2, c: 26835}, 26841, {f: 4, c: 26843},
- {f: 2, c: 26849}, {f: 3, c: 26852}, {f: 6, c: 26856}, 26863,
- {f: 3, c: 26866}, {f: 3, c: 26870}, 26875, {f: 4, c: 26877},
- {f: 3, c: 26882}, {f: 5, c: 26886}, 26892, 26897, {f: 12, c: 26899},
- {f: 3, c: 26913}, {f: 8, c: 26917}, {f: 2, c: 26926}, {f: 3, c: 26929},
- {f: 4, c: 26933}, {f: 3, c: 26938}, 26942, {f: 2, c: 26944},
- {f: 7, c: 26947}, {f: 8, c: 26955}, {f: 2, c: 26965}, {f: 2, c: 26968},
- {f: 2, c: 26971}, 26975, {f: 2, c: 26977}, {f: 2, c: 26980}, 26983,
- {f: 2, c: 26985}, 26988, {f: 2, c: 26991}, {f: 3, c: 26994}, 26998,
- {f: 2, c: 27002}, {f: 3, c: 27005}, 27009, 27011, 27013, {f: 3, c: 27018},
- {f: 6, c: 27022}, {f: 2, c: 27030}, {f: 2, c: 27033}, {f: 10, c: 27037},
- 27049, 27052, {f: 2, c: 27055}, {f: 2, c: 27058}, {f: 2, c: 27061},
- {f: 3, c: 27064}, {f: 3, c: 27068}, 27072, {f: 8, c: 27074}, 27087,
- {f: 3, c: 27089}, {f: 6, c: 27093}, {f: 3, c: 27100}, {f: 6, c: 27105},
- {f: 5, c: 27112}, {f: 4, c: 27118}, {f: 9, c: 27124}, 27134, 27136,
- {f: 2, c: 27139}, {f: 4, c: 27142}, {f: 8, c: 27147}, {f: 3, c: 27156},
- {f: 4, c: 27162}, 27168, 27170, {f: 4, c: 27172}, 27177, {f: 4, c: 27179},
- 27184, {f: 3, c: 27186}, {f: 2, c: 27190}, {f: 2, c: 27195},
- {f: 5, c: 27199}, {f: 2, c: 27205}, {f: 2, c: 27209}, {f: 4, c: 27212},
- {f: 7, c: 27217}, 27226, {f: 3, c: 27228}, 27232, {f: 2, c: 27235},
- {f: 11, c: 27238}, {f: 7, c: 27250}, {f: 2, c: 27258}, {f: 3, c: 27261},
- {f: 3, c: 27265}, {f: 4, c: 27269}, {f: 4, c: 27274}, 27279,
- {f: 2, c: 27282}, {f: 2, c: 27285}, {f: 4, c: 27288}, {f: 3, c: 27293},
- 27297, {f: 5, c: 27300}, 27306, {f: 2, c: 27309}, {f: 3, c: 27312},
- {f: 4, c: 27316}, {f: 2, c: 27321}, {f: 7, c: 27324}, {f: 15, c: 27332},
- {f: 6, c: 27348}, 27356, {f: 7, c: 27360}, 27369, 27371, {f: 6, c: 27373},
- {f: 4, c: 27380}, {f: 2, c: 27385}, {f: 8, c: 27388}, {f: 5, c: 27397},
- {f: 4, c: 27403}, {f: 2, c: 27408}, {f: 3, c: 27411}, {f: 7, c: 27415},
- 27423, {f: 2, c: 27429}, {f: 10, c: 27432}, {f: 4, c: 27443}, 27448,
- {f: 2, c: 27451}, {f: 4, c: 27455}, {f: 2, c: 27460}, 27464,
- {f: 2, c: 27466}, {f: 3, c: 27469}, {f: 8, c: 27473}, {f: 5, c: 27482},
- 27488, {f: 2, c: 27496}, {f: 7, c: 27499}, {f: 4, c: 27507}, 27514,
- {f: 4, c: 27517}, 27525, 27528, 27532, {f: 4, c: 27534}, {f: 2, c: 27540},
- 27543, 27545, {f: 2, c: 27548}, {f: 2, c: 27551}, {f: 2, c: 27554},
- {f: 5, c: 27557}, {f: 2, c: 27564}, {f: 2, c: 27568}, 27574,
- {f: 2, c: 27576}, {f: 3, c: 27580}, 27584, {f: 2, c: 27587},
- {f: 4, c: 27591}, 27596, 27598, {f: 2, c: 27600}, 27608, 27610,
- {f: 5, c: 27612}, {f: 8, c: 27618}, {f: 3, c: 27628}, {f: 3, c: 27632},
- 27636, {f: 3, c: 27638}, {f: 3, c: 27642}, 27646, {f: 5, c: 27648},
- {f: 3, c: 27657}, 27662, 27666, 27671, {f: 3, c: 27676}, 27680, 27685,
- 27693, 27697, 27699, {f: 2, c: 27702}, {f: 4, c: 27705}, {f: 2, c: 27710},
- {f: 3, c: 27715}, 27720, {f: 5, c: 27723}, {f: 3, c: 27729}, 27734,
- {f: 3, c: 27736}, {f: 2, c: 27746}, {f: 3, c: 27749}, {f: 5, c: 27755},
- 27761, 27763, 27765, {f: 2, c: 27767}, {f: 3, c: 27770}, {f: 2, c: 27775},
- 27780, 27783, {f: 2, c: 27786}, {f: 2, c: 27789}, {f: 2, c: 27793},
- {f: 4, c: 27797}, 27802, {f: 3, c: 27804}, 27808, 27810, 27816, 27820,
- {f: 2, c: 27823}, {f: 4, c: 27828}, 27834, {f: 4, c: 27840},
- {f: 3, c: 27846}, 27851, {f: 3, c: 27853}, {f: 2, c: 27857},
- {f: 3, c: 27864}, {f: 2, c: 27868}, 27871, 27876, {f: 2, c: 27878}, 27881,
- {f: 2, c: 27884}, 27890, 27892, 27897, {f: 2, c: 27903}, {f: 2, c: 27906},
- {f: 2, c: 27909}, {f: 3, c: 27912}, 27917, {f: 3, c: 27919},
- {f: 4, c: 27923}, 27928, {f: 2, c: 27932}, {f: 6, c: 27935}, 27942,
- {f: 2, c: 27944}, {f: 2, c: 27948}, {f: 2, c: 27951}, 27956,
- {f: 3, c: 27958}, 27962, {f: 2, c: 27967}, 27970, 27972, 27977, 27980,
- 27984, {f: 4, c: 27989}, 27995, 27997, 27999, {f: 2, c: 28001},
- {f: 2, c: 28004}, {f: 2, c: 28007}, {f: 3, c: 28011}, {f: 4, c: 28016},
- {f: 2, c: 28021}, {f: 2, c: 28026}, {f: 5, c: 28029}, {f: 2, c: 28035},
- 28038, {f: 2, c: 28042}, 28045, {f: 2, c: 28047}, 28050, {f: 5, c: 28054},
- 28060, 28066, 28069, {f: 2, c: 28076}, {f: 2, c: 28080}, {f: 2, c: 28083},
- {f: 2, c: 28086}, {f: 6, c: 28089}, {f: 3, c: 28097}, {f: 3, c: 28104},
- {f: 4, c: 28109}, {f: 4, c: 28114}, 28119, {f: 3, c: 28122}, 28127,
- {f: 2, c: 28130}, 28133, {f: 3, c: 28135}, 28141, {f: 2, c: 28143}, 28146,
- 28148, 28152, {f: 8, c: 28157}, {f: 4, c: 28166}, 28171, 28175,
- {f: 2, c: 28178}, 28181, {f: 2, c: 28184}, {f: 2, c: 28187},
- {f: 2, c: 28190}, 28194, {f: 2, c: 28199}, 28202, 28206, {f: 2, c: 28208},
- 28211, {f: 3, c: 28213}, 28217, {f: 3, c: 28219}, {f: 4, c: 28223},
- {f: 8, c: 28229}, {f: 4, c: 28239}, 28245, 28247, {f: 2, c: 28249},
- {f: 2, c: 28252}, {f: 11, c: 28256}, {f: 2, c: 28268}, {f: 14, c: 28272},
- {f: 3, c: 28288}, 28292, {f: 2, c: 28295}, {f: 5, c: 28298},
- {f: 5, c: 28305}, 28311, {f: 3, c: 28313}, 28318, {f: 2, c: 28320},
- {f: 2, c: 28323}, 28326, {f: 2, c: 28328}, {f: 4, c: 28331}, 28336, 28339,
- 28341, {f: 2, c: 28344}, 28348, {f: 3, c: 28350}, 28355, 28358,
- {f: 3, c: 28360}, 28365, 28368, 28370, 28374, {f: 2, c: 28376},
- {f: 3, c: 28379}, 28387, 28391, {f: 2, c: 28394}, {f: 2, c: 28397},
- {f: 2, c: 28400}, 28403, {f: 2, c: 28405}, {f: 5, c: 28410}, 28416,
- {f: 3, c: 28419}, {f: 2, c: 28423}, {f: 5, c: 28426}, {f: 3, c: 28432},
- {f: 4, c: 28438}, {f: 5, c: 28443}, 28449, {f: 4, c: 28453}, 28462, 28464,
- {f: 2, c: 28468}, 28471, {f: 5, c: 28473}, 28480, {f: 4, c: 28482},
- {f: 3, c: 28488}, 28492, {f: 3, c: 28494}, {f: 2, c: 28498},
- {f: 3, c: 28501}, {f: 2, c: 28506}, 28509, {f: 3, c: 28511}, 28515, 28517,
- {f: 6, c: 28519}, 28529, 28531, {f: 2, c: 28533}, 28537, 28539,
- {f: 2, c: 28541}, {f: 3, c: 28545}, 28549, {f: 2, c: 28554},
- {f: 8, c: 28559}, {f: 4, c: 28568}, {f: 3, c: 28573}, {f: 2, c: 28578},
- {f: 2, c: 28581}, 28584, {f: 4, c: 28586}, {f: 2, c: 28591}, 28594,
- {f: 2, c: 28596}, {f: 2, c: 28599}, {f: 6, c: 28602}, {f: 5, c: 28612},
- {f: 7, c: 28618}, {f: 2, c: 28627}, {f: 2, c: 28630}, {f: 2, c: 28633},
- {f: 2, c: 28636}, {f: 2, c: 28642}, {f: 6, c: 28645}, {f: 2, c: 28652},
- {f: 8, c: 28658}, 28667, 28669, {f: 6, c: 28671}, {f: 2, c: 28679}, 28682,
- {f: 3, c: 28684}, 28688, {f: 3, c: 28690}, {f: 2, c: 28694}, 28697, 28700,
- 28702, {f: 2, c: 28705}, {f: 3, c: 28708}, {f: 7, c: 28713}, 28721,
- {f: 2, c: 28723}, {f: 3, c: 28726}, {f: 4, c: 28730}, {f: 4, c: 28735},
- {f: 7, c: 28741}, {f: 2, c: 28749}, 28752, {f: 3, c: 28754},
- {f: 2, c: 28758}, {f: 4, c: 28761}, {f: 4, c: 28767}, {f: 2, c: 28773},
- {f: 3, c: 28776}, 28782, {f: 4, c: 28785}, 28791, {f: 3, c: 28793}, 28797,
- {f: 4, c: 28801}, {f: 3, c: 28806}, {f: 3, c: 28811}, {f: 3, c: 28815},
- 28819, {f: 2, c: 28823}, {f: 2, c: 28826}, {f: 13, c: 28830}, 28848, 28850,
- {f: 3, c: 28852}, 28858, {f: 2, c: 28862}, {f: 4, c: 28868}, 28873,
- {f: 4, c: 28875}, {f: 8, c: 28880}, 28890, {f: 3, c: 28892},
- {f: 4, c: 28896}, 28901, 28906, 28910, {f: 4, c: 28912}, {f: 2, c: 28917},
- 28920, {f: 3, c: 28922}, {f: 11, c: 28926}, {f: 5, c: 28939},
- {f: 2, c: 28945}, 28948, 28951, {f: 6, c: 28955}, {f: 4, c: 28962},
- {f: 8, c: 28967}, {f: 4, c: 28978}, {f: 14, c: 28983}, {f: 3, c: 28998},
- 29003, 29005, {f: 3, c: 29007}, {f: 9, c: 29011}, 29021, {f: 3, c: 29023},
- 29027, 29029, {f: 2, c: 29034}, 29037, {f: 3, c: 29039}, {f: 4, c: 29044},
- 29049, {f: 2, c: 29051}, {f: 6, c: 29054}, {f: 5, c: 29061},
- {f: 4, c: 29067}, {f: 2, c: 29072}, 29075, {f: 2, c: 29077},
- {f: 5, c: 29082}, {f: 7, c: 29089}, {f: 3, c: 29097}, {f: 4, c: 29101},
- 29106, 29108, {f: 3, c: 29110}, {f: 4, c: 29114}, {f: 2, c: 29119}, 29122,
- {f: 4, c: 29124}, {f: 5, c: 29129}, {f: 3, c: 29135}, 29139,
- {f: 3, c: 29142}, {f: 2, c: 29146}, {f: 2, c: 29149}, {f: 4, c: 29153},
- {f: 5, c: 29160}, {f: 5, c: 29167}, {f: 4, c: 29173}, {f: 2, c: 29178},
- 29181, {f: 7, c: 29183}, {f: 6, c: 29191}, {f: 2, c: 29198},
- {f: 10, c: 29201}, 29212, {f: 10, c: 29214}, 29225, 29227,
- {f: 3, c: 29229}, {f: 2, c: 29235}, 29244, {f: 7, c: 29248},
- {f: 3, c: 29257}, {f: 4, c: 29262}, {f: 3, c: 29267}, 29271, 29274, 29276,
- 29278, 29280, {f: 3, c: 29283}, 29288, {f: 4, c: 29290}, {f: 2, c: 29296},
- {f: 2, c: 29299}, {f: 3, c: 29302}, {f: 2, c: 29307}, {f: 2, c: 29314},
- {f: 5, c: 29317}, 29324, 29326, {f: 2, c: 29328}, {f: 3, c: 29331},
- {f: 8, c: 29335}, {f: 2, c: 29344}, {f: 4, c: 29347}, {f: 4, c: 29352},
- 29358, {f: 3, c: 29361}, 29365, {f: 6, c: 29370}, {f: 3, c: 29381},
- {f: 4, c: 29385}, 29391, 29393, {f: 4, c: 29395}, 29400, {f: 4, c: 29402},
- 29407, {f: 6, c: 29410}, {f: 2, c: 29418}, {f: 2, c: 29429},
- {f: 3, c: 29438}, 29442, {f: 6, c: 29444}, {f: 3, c: 29451},
- {f: 4, c: 29455}, 29460, {f: 3, c: 29464}, {f: 2, c: 29471},
- {f: 2, c: 29475}, {f: 3, c: 29478}, 29485, {f: 2, c: 29487},
- {f: 2, c: 29490}, 29493, 29498, {f: 2, c: 29500}, 29504, {f: 2, c: 29506},
- {f: 7, c: 29510}, {f: 2, c: 29518}, 29521, {f: 4, c: 29523},
- {f: 8, c: 29528}, {f: 7, c: 29537}, 29545, 29550, 29553, {f: 2, c: 29555},
- 29558, 29561, 29565, 29567, {f: 3, c: 29569}, {f: 2, c: 29573}, 29576,
- 29578, {f: 2, c: 29580}, {f: 2, c: 29583}, {f: 4, c: 29586},
- {f: 4, c: 29591}, {f: 3, c: 29596}, {f: 2, c: 29600}, {f: 6, c: 29603},
- 29610, {f: 2, c: 29612}, 29617, {f: 3, c: 29620}, {f: 2, c: 29624},
- {f: 4, c: 29628}, 29633, {f: 5, c: 29635}, {f: 2, c: 29643}, 29646,
- {f: 7, c: 29650}, {f: 4, c: 29658}, 29663, {f: 4, c: 29665}, 29670, 29672,
- {f: 3, c: 29674}, {f: 4, c: 29678}, {f: 11, c: 29683}, {f: 4, c: 29695},
- 29700, {f: 2, c: 29703}, {f: 4, c: 29707}, {f: 9, c: 29713},
- {f: 6, c: 29724}, {f: 2, c: 29731}, 29735, 29737, 29739, 29741, 29743,
- {f: 2, c: 29745}, {f: 5, c: 29751}, {f: 2, c: 29757}, 29760,
- {f: 9, c: 29762}, {f: 9, c: 29772}, 29782, 29784, 29789, {f: 3, c: 29792},
- {f: 5, c: 29796}, {f: 2, c: 29803}, {f: 2, c: 29806}, {f: 5, c: 29809},
- {f: 6, c: 29816}, 29823, 29826, {f: 3, c: 29828}, 29832, 29834,
- {f: 2, c: 29836}, 29839, {f: 11, c: 29841}, 29853, {f: 4, c: 29855},
- {f: 2, c: 29860}, {f: 6, c: 29866}, {f: 9, c: 29873}, {f: 2, c: 29883},
- {f: 12, c: 29886}, {f: 4, c: 29899}, {f: 2, c: 29904}, 29907,
- {f: 5, c: 29909}, 29915, 29917, 29919, 29921, 29925, {f: 7, c: 29927},
- {f: 4, c: 29936}, 29941, {f: 7, c: 29944}, {f: 4, c: 29952},
- {f: 7, c: 29957}, 29966, 29968, 29970, {f: 4, c: 29972}, 29979,
- {f: 2, c: 29981}, {f: 3, c: 29984}, 29988, {f: 2, c: 29990}, 29994, 29998,
- 30004, 30006, 30009, {f: 2, c: 30012}, 30015, {f: 4, c: 30017},
- {f: 2, c: 30022}, {f: 2, c: 30025}, 30029, {f: 4, c: 30032},
- {f: 4, c: 30037}, {f: 4, c: 30046}, {f: 2, c: 30051}, {f: 3, c: 30055},
- {f: 6, c: 30060}, 30067, 30069, 30071, {f: 5, c: 30074}, {f: 3, c: 30080},
- {f: 2, c: 30084}, {f: 3, c: 30088}, {f: 3, c: 30092}, 30096, 30099, 30101,
- 30104, {f: 2, c: 30107}, 30110, 30114, {f: 5, c: 30118}, 30125,
- {f: 2, c: 30134}, {f: 2, c: 30138}, {f: 3, c: 30143}, 30150,
- {f: 2, c: 30155}, {f: 4, c: 30158}, 30163, 30167, 30170, {f: 2, c: 30172},
- {f: 3, c: 30175}, 30181, 30185, {f: 4, c: 30188}, {f: 2, c: 30194},
- {f: 4, c: 30197}, {f: 2, c: 30202}, {f: 2, c: 30205}, 30212,
- {f: 4, c: 30214}, {f: 2, c: 30222}, {f: 4, c: 30225}, 30230, 30234,
- {f: 2, c: 30236}, 30243, 30248, 30252, {f: 2, c: 30254}, {f: 2, c: 30257},
- {f: 2, c: 30262}, {f: 2, c: 30265}, 30269, 30273, {f: 2, c: 30276}, 30280,
- {f: 2, c: 30282}, {f: 6, c: 30286}, 30293, 30295, {f: 3, c: 30297}, 30301,
- {f: 2, c: 30304}, 30310, 30312, 30314, {f: 3, c: 30323}, [12136, 30326],
- 30327, {f: 2, c: 30329}, {f: 3, c: 30335}, 30339, 30341, {f: 2, c: 30345},
- {f: 2, c: 30348}, {f: 2, c: 30351}, 30354, {f: 2, c: 30356},
- {f: 2, c: 30359}, {f: 9, c: 30363}, {f: 9, c: 30373}, {f: 2, c: 30383},
- 30387, {f: 3, c: 30389}, 30393, {f: 4, c: 30395}, {f: 2, c: 30400},
- {f: 2, c: 30403}, 30407, 30409, {f: 2, c: 30411}, 30419, 30421,
- {f: 2, c: 30425}, {f: 2, c: 30428}, 30432, 30434, 30438, {f: 6, c: 30440},
- 30448, 30451, {f: 3, c: 30453}, {f: 2, c: 30458}, 30461, {f: 2, c: 30463},
- {f: 2, c: 30466}, {f: 2, c: 30469}, 30474, 30476, {f: 11, c: 30478},
- {f: 4, c: 30491}, 30497, {f: 3, c: 30499}, 30503, {f: 3, c: 30506}, 30510,
- {f: 5, c: 30512}, 30521, 30523, {f: 3, c: 30525}, 30530, {f: 3, c: 30532},
- {f: 7, c: 30536}, {f: 8, c: 30546}, {f: 2, c: 30556}, {f: 2, c: 30559},
- 30564, 30567, {f: 2, c: 30569}, {f: 12, c: 30573}, {f: 3, c: 30586},
- {f: 3, c: 30593}, {f: 6, c: 30598}, {f: 2, c: 30607}, {f: 5, c: 30611},
- {f: 5, c: 30617}, 30625, {f: 2, c: 30627}, 30630, 30632, 30635,
- {f: 2, c: 30638}, {f: 2, c: 30641}, 30644, {f: 5, c: 30646}, 30654,
- {f: 7, c: 30656}, {f: 5, c: 30664}, {f: 9, c: 30670}, {f: 2, c: 30680},
- {f: 5, c: 30685}, 30692, 30694, 30696, 30698, {f: 3, c: 30704},
- {f: 2, c: 30708}, 30711, {f: 4, c: 30713}, {f: 6, c: 30723},
- {f: 2, c: 30730}, {f: 3, c: 30734}, 30739, 30741, 30745, 30747, 30750,
- {f: 3, c: 30752}, 30756, 30760, {f: 2, c: 30762}, {f: 2, c: 30766},
- {f: 3, c: 30769}, {f: 2, c: 30773}, 30781, 30783, {f: 2, c: 30785}, 30788,
- 30790, {f: 4, c: 30792}, 30797, 30799, 30801, {f: 2, c: 30803},
- {f: 5, c: 30808}, {f: 6, c: 30814}, {f: 3, c: 30821}, 30825,
- {f: 7, c: 30832}, {f: 4, c: 30840}, {f: 10, c: 30845}, 30856,
- {f: 2, c: 30858}, {f: 2, c: 30863}, 30866, {f: 3, c: 30868}, 30873,
- {f: 2, c: 30877}, 30880, 30882, 30884, 30886, 30888, {f: 3, c: 30890},
- {f: 2, c: 30894}, {f: 3, c: 30901}, 30907, 30909, {f: 2, c: 30911},
- {f: 3, c: 30914}, {f: 3, c: 30918}, {f: 4, c: 30924}, {f: 3, c: 30929},
- {f: 3, c: 30934}, {f: 8, c: 30939}, {f: 3, c: 30948}, {f: 3, c: 30953},
- {f: 2, c: 30957}, {f: 2, c: 30960}, 30963, {f: 2, c: 30965},
- {f: 2, c: 30968}, {f: 2, c: 30971}, {f: 3, c: 30974}, {f: 3, c: 30978},
- {f: 8, c: 30982}, {f: 4, c: 30991}, {f: 5, c: 30996}, {f: 4, c: 31002},
- {f: 5, c: 31007}, 31013, {f: 3, c: 31015}, {f: 4, c: 31021},
- {f: 2, c: 31026}, {f: 5, c: 31029}, 31037, 31039, {f: 4, c: 31042}, 31047,
- {f: 9, c: 31050}, {f: 2, c: 31060}, {f: 2, c: 31064}, 31073,
- {f: 2, c: 31075}, 31078, {f: 4, c: 31081}, 31086, {f: 7, c: 31088}, 31097,
- {f: 5, c: 31099}, {f: 2, c: 31106}, {f: 4, c: 31110}, {f: 2, c: 31115},
- {f: 10, c: 31120}, {f: 11, c: 31131}, {f: 2, c: 31144}, {f: 3, c: 31147},
- 31151, 31154, {f: 4, c: 31156}, [12145, 31160], 31164, 31167, 31170,
- {f: 2, c: 31172}, {f: 2, c: 31175}, 31178, 31180, {f: 3, c: 31182},
- {f: 2, c: 31187}, {f: 2, c: 31190}, {f: 6, c: 31193}, {f: 3, c: 31200},
- 31205, 31208, 31210, 31212, 31214, {f: 7, c: 31217}, {f: 2, c: 31225},
- 31228, {f: 2, c: 31230}, 31233, {f: 2, c: 31236}, {f: 4, c: 31239}, 31244,
- {f: 5, c: 31247}, {f: 2, c: 31253}, {f: 2, c: 31256}, {f: 3, c: 31259},
- 31263, {f: 2, c: 31265}, {f: 10, c: 31268}, {f: 2, c: 31279}, 31282,
- {f: 3, c: 31284}, 31288, 31290, 31294, {f: 5, c: 31297}, {f: 5, c: 31303},
- {f: 2, c: 31311}, {f: 5, c: 31314}, {f: 9, c: 31320}, {f: 6, c: 31331},
- 31338, {f: 4, c: 31340}, {f: 3, c: 31345}, 31349, {f: 4, c: 31355}, 31362,
- 31365, 31367, {f: 4, c: 31369}, {f: 3, c: 31374}, {f: 2, c: 31379},
- {f: 3, c: 31385}, 31390, {f: 4, c: 31393}, 31399, 31403, {f: 4, c: 31407},
- {f: 2, c: 31412}, {f: 3, c: 31415}, {f: 4, c: 31419}, {f: 4, c: 31424},
- 31430, 31433, {f: 10, c: 31436}, {f: 2, c: 31447}, {f: 4, c: 31450},
- {f: 2, c: 31457}, 31460, {f: 3, c: 31463}, {f: 2, c: 31467}, 31470,
- {f: 6, c: 31472}, {f: 2, c: 31479}, {f: 2, c: 31483}, 31486,
- {f: 3, c: 31488}, 31493, 31495, 31497, {f: 3, c: 31500}, 31504,
- {f: 2, c: 31506}, {f: 3, c: 31510}, 31514, {f: 2, c: 31516}, 31519,
- {f: 3, c: 31521}, 31527, 31529, 31533, {f: 2, c: 31535}, 31538,
- {f: 4, c: 31540}, 31545, 31547, 31549, {f: 6, c: 31551}, 31560, 31562,
- {f: 2, c: 31565}, 31571, 31573, 31575, 31577, 31580, {f: 2, c: 31582},
- 31585, {f: 4, c: 31587}, {f: 6, c: 31592}, {f: 2, c: 31599},
- {f: 2, c: 31603}, 31606, 31608, 31610, {f: 2, c: 31612}, 31615,
- {f: 4, c: 31617}, {f: 5, c: 31622}, 31628, {f: 2, c: 31630},
- {f: 3, c: 31633}, 31638, {f: 4, c: 31640}, {f: 3, c: 31646},
- {f: 3, c: 31651}, {f: 3, c: 31662}, {f: 2, c: 31666}, {f: 3, c: 31669},
- {f: 7, c: 31673}, {f: 2, c: 31682}, 31685, 31688, 31690, {f: 4, c: 31693},
- 31698, {f: 5, c: 31700}, {f: 2, c: 31707}, {f: 3, c: 31710},
- {f: 2, c: 31714}, {f: 2, c: 31719}, {f: 3, c: 31723}, {f: 2, c: 31727},
- 31730, {f: 3, c: 31732}, {f: 4, c: 31736}, 31741, 31743, {f: 6, c: 31745},
- {f: 3, c: 31752}, 31758, {f: 6, c: 31760}, {f: 7, c: 31767}, 31776, 31778,
- {f: 2, c: 31780}, {f: 2, c: 31784}, {f: 12, c: 31788}, {f: 4, c: 31801},
- 31810, {f: 8, c: 31812}, {f: 14, c: 31822}, {f: 2, c: 31837},
- {f: 3, c: 31841}, {f: 4, c: 31845}, 31851, 31853, {f: 3, c: 31855},
- {f: 6, c: 31861}, {f: 11, c: 31870}, {f: 7, c: 31882}, {f: 2, c: 31891},
- 31894, {f: 3, c: 31897}, {f: 2, c: 31904}, 31907, {f: 4, c: 31910},
- {f: 3, c: 31915}, {f: 2, c: 31919}, {f: 5, c: 31924}, {f: 2, c: 31930},
- {f: 2, c: 31935}, {f: 3, c: 31938}, 31942, 31945, 31947, {f: 7, c: 31950},
- 31960, {f: 2, c: 31962}, {f: 6, c: 31969}, {f: 6, c: 31977}, 31985, 31987,
- 31989, 31991, 31994, {f: 2, c: 31996}, 31999, 32001, 32003, 32012,
- {f: 2, c: 32014}, {f: 2, c: 32017}, 32022, 32024, {f: 3, c: 32029},
- {f: 4, c: 32035}, {f: 3, c: 32040}, {f: 3, c: 32044}, {f: 5, c: 32052},
- 32059, {f: 2, c: 32061}, 32065, 32067, 32069, {f: 7, c: 32071}, 32079,
- {f: 12, c: 32081}, {f: 2, c: 32095}, {f: 3, c: 32099}, 32103,
- {f: 5, c: 32105}, {f: 2, c: 32111}, {f: 2, c: 32116}, 32120,
- {f: 7, c: 32122}, 32130, {f: 2, c: 32132}, 32135, {f: 5, c: 32138},
- {f: 3, c: 32144}, {f: 8, c: 32148}, 32157, {f: 3, c: 32159},
- {f: 2, c: 32164}, {f: 4, c: 32167}, 32175, {f: 3, c: 32181}, 32188,
- {f: 4, c: 32192}, {f: 2, c: 32197}, {f: 2, c: 32200}, {f: 5, c: 32204},
- 32211, {f: 2, c: 32213}, {f: 3, c: 32218}, 32223, 32226, {f: 2, c: 32228},
- 32231, {f: 2, c: 32234}, {f: 2, c: 32237}, 32240, 32243, 32245,
- {f: 2, c: 32247}, 32250, {f: 12, c: 32252}, {f: 4, c: 32268},
- {f: 9, c: 32274}, 32284, {f: 3, c: 32288}, {f: 3, c: 32292},
- {f: 3, c: 32296}, 32300, {f: 2, c: 32303}, 32307, 32312, 32314, 32316,
- {f: 2, c: 32319}, {f: 3, c: 32322}, {f: 10, c: 32328}, 32339,
- {f: 4, c: 32342}, {f: 3, c: 32347}, {f: 3, c: 32351}, {f: 6, c: 32355},
- 32364, {f: 2, c: 32369}, {f: 5, c: 32372}, {f: 2, c: 32378},
- {f: 3, c: 32383}, {f: 5, c: 32387}, 32393, 32395, 32398, {f: 3, c: 32400},
- 32405, 32407, {f: 2, c: 32409}, {f: 2, c: 32413}, 32430, 32436,
- {f: 2, c: 32443}, 32470, 32484, 32492, 32505, 32522, 32528, 32542, 32567,
- 32569, {f: 7, c: 32571}, 32579, {f: 6, c: 32582}, 32589, 32591,
- {f: 2, c: 32594}, 32598, 32601, {f: 4, c: 32603}, 32608, {f: 5, c: 32611},
- {f: 3, c: 32619}, 32623, 32627, {f: 2, c: 32629}, 32632, {f: 4, c: 32634},
- {f: 2, c: 32639}, {f: 3, c: 32642}, 32647, 32649, 32651, 32653,
- {f: 5, c: 32655}, {f: 5, c: 32661}, {f: 2, c: 32667}, 32672,
- {f: 2, c: 32674}, 32678, 32680, {f: 5, c: 32682}, 32689, {f: 5, c: 32691},
- {f: 2, c: 32698}, 32702, 32704, {f: 3, c: 32706}, {f: 4, c: 32710}, 32715,
- 32717, {f: 3, c: 32719}, 32723, {f: 2, c: 32726}, {f: 6, c: 32729},
- {f: 3, c: 32738}, {f: 2, c: 32743}, {f: 4, c: 32746}, 32751, 32754,
- {f: 5, c: 32756}, 32762, {f: 3, c: 32765}, 32770, {f: 4, c: 32775},
- {f: 2, c: 32782}, 32785, 32787, {f: 2, c: 32794}, {f: 3, c: 32797}, 32801,
- {f: 2, c: 32803}, 32811, 32813, {f: 2, c: 32815}, 32818, 32820,
- {f: 2, c: 32825}, 32828, 32830, {f: 2, c: 32832}, {f: 2, c: 32836},
- {f: 3, c: 32839}, {f: 4, c: 32846}, 32851, 32853, 32855, 32857,
- {f: 3, c: 32859}, {f: 10, c: 32863}, {f: 4, c: 32875}, 32884, 32888,
- {f: 3, c: 32890}, {f: 2, c: 32897}, 32904, 32906, {f: 6, c: 32909},
- {f: 2, c: 32916}, 32919, 32921, 32926, 32931, {f: 3, c: 32934}, 32940,
- 32944, 32947, {f: 2, c: 32949}, {f: 2, c: 32952}, 32955, 32965,
- {f: 5, c: 32967}, {f: 7, c: 32975}, 32984, {f: 2, c: 32991},
- {f: 2, c: 32994}, 32998, 33006, 33013, 33015, 33017, 33019,
- {f: 4, c: 33022}, {f: 2, c: 33027}, {f: 2, c: 33031}, {f: 2, c: 33035},
- 33045, 33047, 33049, {f: 2, c: 33052}, {f: 13, c: 33055}, {f: 2, c: 33069},
- 33072, {f: 3, c: 33075}, 33079, {f: 4, c: 33082}, {f: 7, c: 33087}, 33095,
- 33097, 33101, 33103, 33106, {f: 2, c: 33111}, {f: 5, c: 33115},
- {f: 3, c: 33122}, 33128, 33130, 33132, 33135, {f: 2, c: 33138},
- {f: 3, c: 33141}, 33153, {f: 5, c: 33155}, 33161, {f: 4, c: 33163}, 33168,
- {f: 6, c: 33170}, 33177, {f: 2, c: 33182}, {f: 2, c: 33185},
- {f: 2, c: 33188}, 33191, {f: 8, c: 33195}, {f: 6, c: 33204}, 33212,
- {f: 2, c: 33220}, {f: 2, c: 33223}, 33227, 33230, {f: 8, c: 33232}, 33241,
- {f: 4, c: 33243}, {f: 2, c: 33249}, {f: 3, c: 33252}, 33257, 33259,
- {f: 5, c: 33262}, {f: 5, c: 33269}, 33277, 33279, 33283, 33291,
- {f: 2, c: 33294}, 33297, 33299, {f: 6, c: 33301}, 33309, 33312,
- {f: 4, c: 33316}, 33321, 33326, 33330, 33338, {f: 2, c: 33340},
- {f: 5, c: 33343}, {f: 2, c: 33349}, 33352, 33354, {f: 3, c: 33356},
- {f: 8, c: 33360}, {f: 4, c: 33371}, {f: 4, c: 33376}, 33381, 33383,
- {f: 2, c: 33385}, {f: 2, c: 33388}, {f: 2, c: 33397}, [12171, 33400],
- {f: 2, c: 33403}, {f: 2, c: 33408}, 33411, {f: 3, c: 33413}, 33417, 33420,
- 33424, {f: 4, c: 33427}, {f: 2, c: 33434}, 33438, 33440, {f: 2, c: 33442},
- 33447, 33458, {f: 2, c: 33461}, 33466, 33468, {f: 2, c: 33471},
- {f: 2, c: 33474}, {f: 2, c: 33477}, 33481, 33488, 33494, {f: 2, c: 33497},
- 33501, 33506, {f: 3, c: 33512}, {f: 3, c: 33516}, 33520, {f: 2, c: 33522},
- {f: 2, c: 33525}, 33528, 33530, {f: 5, c: 33532}, {f: 2, c: 33546}, 33549,
- 33552, {f: 2, c: 33554}, 33558, {f: 2, c: 33560}, {f: 10, c: 33565},
- {f: 2, c: 33577}, 33582, 33584, 33586, 33591, 33595, {f: 3, c: 33597},
- {f: 2, c: 33601}, {f: 2, c: 33604}, 33608, {f: 5, c: 33610}, 33619,
- {f: 5, c: 33621}, 33629, 33634, {f: 7, c: 33648}, {f: 2, c: 33657},
- {f: 7, c: 33662}, {f: 2, c: 33671}, {f: 3, c: 33675}, {f: 3, c: 33679},
- {f: 2, c: 33684}, 33687, {f: 2, c: 33689}, 33693, 33695, 33697,
- {f: 4, c: 33699}, {f: 4, c: 33708}, 33717, 33723, {f: 2, c: 33726},
- {f: 3, c: 33730}, 33734, {f: 2, c: 33736}, 33739, {f: 2, c: 33741},
- {f: 4, c: 33744}, 33749, 33751, {f: 3, c: 33753}, 33758, {f: 3, c: 33762},
- {f: 3, c: 33766}, {f: 4, c: 33771}, {f: 5, c: 33779}, {f: 3, c: 33786},
- {f: 3, c: 33790}, 33794, 33797, {f: 2, c: 33800}, 33808, {f: 6, c: 33810},
- {f: 3, c: 33817}, {f: 6, c: 33822}, {f: 3, c: 33833}, {f: 4, c: 33837},
- {f: 3, c: 33842}, {f: 2, c: 33846}, {f: 3, c: 33849}, {f: 8, c: 33854},
- {f: 2, c: 33863}, {f: 7, c: 33866}, {f: 4, c: 33875}, 33880,
- {f: 4, c: 33885}, 33890, 33893, {f: 2, c: 33895}, 33898, 33902, 33904,
- 33906, 33908, 33913, {f: 7, c: 33915}, {f: 4, c: 33923}, 33930, 33933,
- {f: 4, c: 33935}, {f: 2, c: 33941}, 33944, {f: 2, c: 33946},
- {f: 4, c: 33949}, {f: 13, c: 33954}, {f: 2, c: 33968}, 33971,
- {f: 3, c: 33973}, 33979, 33982, {f: 2, c: 33986}, {f: 4, c: 33989}, 33996,
- {f: 2, c: 33998}, 34002, {f: 2, c: 34004}, {f: 6, c: 34007}, 34014,
- {f: 2, c: 34017}, 34020, {f: 5, c: 34023}, 34029, {f: 11, c: 34033}, 34046,
- {f: 12, c: 34048}, {f: 4, c: 34061}, 34066, {f: 2, c: 34069},
- {f: 2, c: 34072}, {f: 3, c: 34075}, 34080, 34082, {f: 2, c: 34084},
- {f: 4, c: 34087}, {f: 9, c: 34094}, {f: 3, c: 34110}, 34114,
- {f: 2, c: 34116}, 34119, {f: 3, c: 34123}, {f: 3, c: 34127}, 34132, 34135,
- {f: 4, c: 34138}, {f: 3, c: 34143}, 34147, {f: 3, c: 34149},
- {f: 2, c: 34155}, {f: 4, c: 34158}, 34163, {f: 2, c: 34165}, 34168,
- {f: 2, c: 34172}, {f: 5, c: 34175}, 34182, 34185, 34187, {f: 2, c: 34189},
- 34192, {f: 2, c: 34194}, {f: 6, c: 34197}, {f: 2, c: 34205},
- {f: 4, c: 34208}, 34213, 34215, {f: 3, c: 34219}, {f: 6, c: 34225}, 34232,
- {f: 6, c: 34235}, {f: 7, c: 34242}, {f: 3, c: 34250}, {f: 2, c: 34257},
- 34260, {f: 6, c: 34262}, {f: 6, c: 34270}, {f: 3, c: 34278},
- {f: 9, c: 34283}, 34293, {f: 2, c: 34295}, {f: 3, c: 34300},
- {f: 4, c: 34304}, {f: 3, c: 34312}, {f: 5, c: 34316}, {f: 4, c: 34322},
- {f: 3, c: 34327}, {f: 3, c: 34331}, {f: 3, c: 34335}, {f: 4, c: 34339},
- 34344, {f: 3, c: 34346}, {f: 10, c: 34350}, 34361, 34363, {f: 2, c: 34365},
- {f: 13, c: 34368}, {f: 2, c: 34386}, {f: 4, c: 34390}, 34395, 34397,
- {f: 2, c: 34400}, {f: 4, c: 34403}, {f: 3, c: 34408}, 34413,
- {f: 2, c: 34415}, {f: 7, c: 34418}, {f: 7, c: 34435}, {f: 5, c: 34446},
- 34452, {f: 6, c: 34454}, {f: 5, c: 34462}, {f: 2, c: 34469}, 34475,
- {f: 2, c: 34477}, {f: 2, c: 34482}, {f: 3, c: 34487}, {f: 5, c: 34491},
- {f: 3, c: 34497}, 34501, 34504, {f: 2, c: 34508}, {f: 2, c: 34514},
- {f: 3, c: 34517}, 34522, {f: 2, c: 34524}, {f: 4, c: 34528},
- {f: 4, c: 34533}, {f: 3, c: 34538}, 34543, {f: 3, c: 34549},
- {f: 3, c: 34555}, 34559, 34561, {f: 2, c: 34564}, {f: 2, c: 34571},
- {f: 4, c: 34574}, 34580, 34582, 34585, 34587, 34589, {f: 2, c: 34591},
- 34596, {f: 3, c: 34598}, {f: 4, c: 34602}, {f: 2, c: 34607},
- {f: 2, c: 34610}, {f: 2, c: 34613}, {f: 3, c: 34616}, {f: 2, c: 34620},
- {f: 7, c: 34624}, {f: 2, c: 34634}, 34637, {f: 4, c: 34639}, 34644, 34646,
- 34648, {f: 6, c: 34650}, {f: 2, c: 34657}, {f: 7, c: 34663}, 34671,
- {f: 3, c: 34673}, 34677, 34679, {f: 2, c: 34681}, {f: 3, c: 34687},
- {f: 2, c: 34694}, {f: 2, c: 34697}, 34700, {f: 5, c: 34702},
- {f: 3, c: 34708}, {f: 6, c: 34712}, {f: 2, c: 34720}, {f: 5, c: 34723},
- {f: 2, c: 34729}, 34734, {f: 3, c: 34736}, 34740, {f: 4, c: 34742}, 34748,
- {f: 2, c: 34750}, {f: 3, c: 34753}, 34757, 34759, 34761, {f: 2, c: 34764},
- {f: 2, c: 34767}, {f: 7, c: 34772}, {f: 4, c: 34780}, {f: 2, c: 34785},
- 34788, {f: 4, c: 34790}, 34795, 34797, {f: 2, c: 34800}, {f: 3, c: 34803},
- {f: 2, c: 34807}, 34810, {f: 2, c: 34812}, {f: 4, c: 34815}, 34820,
- {f: 3, c: 34823}, {f: 5, c: 34827}, 34834, 34836, {f: 4, c: 34839},
- {f: 3, c: 34844}, 34848, {f: 13, c: 34852}, {f: 3, c: 34867},
- {f: 2, c: 34871}, 34874, {f: 3, c: 34877}, {f: 3, c: 34881},
- {f: 3, c: 34887}, 34891, {f: 5, c: 34894}, {f: 2, c: 34901}, 34904, 34906,
- 34908, {f: 3, c: 34910}, {f: 2, c: 34918}, 34922, 34925, 34927, 34929,
- {f: 4, c: 34931}, 34936, {f: 3, c: 34938}, 34944, 34947, {f: 2, c: 34950},
- {f: 2, c: 34953}, 34956, {f: 4, c: 34958}, {f: 3, c: 34963},
- {f: 5, c: 34967}, {f: 5, c: 34973}, 34979, {f: 6, c: 34981}, 34988,
- {f: 3, c: 34990}, {f: 5, c: 34994}, {f: 4, c: 35000}, {f: 4, c: 35005},
- {f: 2, c: 35011}, {f: 2, c: 35015}, {f: 3, c: 35019}, {f: 2, c: 35024},
- 35027, {f: 2, c: 35030}, {f: 2, c: 35034}, 35038, {f: 2, c: 35040},
- {f: 2, c: 35046}, {f: 7, c: 35049}, 35058, {f: 3, c: 35061},
- {f: 2, c: 35066}, {f: 3, c: 35071}, {f: 4, c: 35075}, {f: 2, c: 35080},
- {f: 5, c: 35083}, 35089, {f: 5, c: 35092}, {f: 5, c: 35100},
- {f: 3, c: 35106}, {f: 4, c: 35110}, {f: 4, c: 35116}, 35121, 35125, 35127,
- {f: 2, c: 35129}, {f: 5, c: 35132}, {f: 2, c: 35138}, {f: 2, c: 35141},
- {f: 14, c: 35144}, {f: 6, c: 35159}, {f: 3, c: 35169}, 35173,
- {f: 3, c: 35175}, 35179, {f: 2, c: 35181}, {f: 2, c: 35184},
- {f: 8, c: 35187}, {f: 2, c: 35196}, [12177, 35198], 35200, 35202,
- {f: 2, c: 35204}, {f: 4, c: 35207}, {f: 3, c: 35212}, {f: 3, c: 35216},
- {f: 2, c: 35220}, 35223, {f: 8, c: 35225}, {f: 4, c: 35234},
- {f: 3, c: 35239}, 35243, {f: 2, c: 35245}, {f: 2, c: 35248},
- {f: 4, c: 35251}, {f: 2, c: 35256}, {f: 2, c: 35259}, 35262, 35267, 35277,
- {f: 3, c: 35283}, {f: 3, c: 35287}, 35291, 35293, {f: 4, c: 35295}, 35300,
- {f: 4, c: 35303}, {f: 3, c: 35308}, {f: 3, c: 35312}, 35317, 35319,
- {f: 7, c: 35321}, {f: 3, c: 35332}, 35337, 35339, 35341, 35343,
- {f: 2, c: 35345}, 35348, 35351, {f: 2, c: 35353}, 35356, 35358,
- {f: 3, c: 35360}, 35364, {f: 4, c: 35366}, {f: 2, c: 35371},
- {f: 3, c: 35374}, {f: 2, c: 35378}, 35381, {f: 3, c: 35383},
- {f: 3, c: 35387}, {f: 2, c: 35391}, {f: 4, c: 35394}, 35399,
- {f: 5, c: 35401}, 35407, 35409, 35411, {f: 2, c: 35414}, {f: 2, c: 35417},
- {f: 2, c: 35420}, {f: 2, c: 35423}, {f: 2, c: 35428}, {f: 2, c: 35431},
- 35434, 35439, 35444, {f: 3, c: 35446}, {f: 2, c: 35450}, {f: 2, c: 35453},
- {f: 4, c: 35456}, 35464, {f: 2, c: 35467}, {f: 3, c: 35470}, 35476,
- {f: 2, c: 35478}, 35481, {f: 3, c: 35483}, 35487, 35490, 35495,
- {f: 3, c: 35497}, {f: 3, c: 35501}, 35505, {f: 3, c: 35507},
- {f: 2, c: 35511}, {f: 2, c: 35514}, {f: 2, c: 35517}, {f: 2, c: 35520},
- 35523, {f: 2, c: 35525}, 35528, 35530, 35532, 35534, 35536,
- {f: 3, c: 35539}, {f: 3, c: 35544}, 35549, {f: 3, c: 35551}, 35555, 35557,
- {f: 3, c: 35560}, 35564, {f: 2, c: 35567}, 35570, {f: 2, c: 35572}, 35577,
- 35579, 35581, 35583, 35587, 35590, {f: 2, c: 35592}, {f: 3, c: 35595},
- 35599, {f: 3, c: 35601}, 35605, 35608, 35612, {f: 3, c: 35614},
- {f: 4, c: 35618}, 35623, {f: 2, c: 35625}, {f: 5, c: 35630},
- {f: 5, c: 35636}, {f: 4, c: 35642}, {f: 10, c: 35647}, {f: 4, c: 35658},
- {f: 6, c: 35664}, 35671, 35675, {f: 9, c: 35677}, {f: 4, c: 35687},
- {f: 2, c: 35693}, {f: 3, c: 35697}, {f: 2, c: 35701}, {f: 5, c: 35704},
- {f: 2, c: 35710}, {f: 9, c: 35713}, {f: 3, c: 35723}, {f: 3, c: 35727},
- 35732, {f: 5, c: 35735}, 35741, 35743, 35756, 35761, 35771, 35783, 35792,
- 35818, 35849, 35870, {f: 9, c: 35896}, {f: 4, c: 35906}, {f: 2, c: 35914},
- {f: 3, c: 35917}, {f: 4, c: 35921}, {f: 4, c: 35926}, {f: 6, c: 35931},
- {f: 7, c: 35939}, {f: 7, c: 35948}, {f: 4, c: 35956}, {f: 7, c: 35963},
- {f: 2, c: 35971}, {f: 3, c: 35974}, 35979, {f: 7, c: 35981},
- {f: 3, c: 35989}, {f: 4, c: 35993}, 35999, {f: 4, c: 36003},
- {f: 2, c: 36013}, 36017, 36021, 36025, 36030, 36038, 36041,
- {f: 6, c: 36043}, 36052, {f: 4, c: 36054}, 36059, 36061, 36063, 36069,
- {f: 2, c: 36072}, {f: 6, c: 36078}, {f: 5, c: 36085}, {f: 5, c: 36095},
- {f: 2, c: 36102}, 36105, 36108, 36110, {f: 5, c: 36113}, {f: 4, c: 36119},
- 36128, {f: 2, c: 36177}, 36183, 36191, 36197, {f: 3, c: 36200}, 36204,
- {f: 2, c: 36206}, {f: 2, c: 36209}, {f: 9, c: 36216}, {f: 2, c: 36226},
- {f: 4, c: 36230}, {f: 5, c: 36236}, {f: 2, c: 36242}, {f: 3, c: 36246},
- {f: 5, c: 36250}, {f: 3, c: 36256}, {f: 4, c: 36260}, {f: 8, c: 36265},
- {f: 2, c: 36278}, 36281, 36283, 36285, {f: 3, c: 36288}, 36293,
- {f: 4, c: 36295}, 36301, 36304, {f: 4, c: 36306}, {f: 2, c: 36312}, 36316,
- {f: 3, c: 36320}, {f: 3, c: 36325}, 36329, {f: 2, c: 36333},
- {f: 3, c: 36336}, 36340, 36342, 36348, {f: 7, c: 36350}, {f: 3, c: 36358},
- 36363, {f: 2, c: 36365}, {f: 3, c: 36369}, {f: 8, c: 36373},
- {f: 2, c: 36384}, {f: 5, c: 36388}, 36395, 36397, 36400, {f: 2, c: 36402},
- {f: 3, c: 36406}, {f: 2, c: 36411}, {f: 2, c: 36414}, 36419,
- {f: 2, c: 36421}, {f: 4, c: 36429}, {f: 2, c: 36435}, {f: 3, c: 36438},
- {f: 9, c: 36442}, {f: 2, c: 36452}, {f: 2, c: 36455}, {f: 2, c: 36458},
- 36462, 36465, 36467, 36469, {f: 3, c: 36471}, 36475, {f: 2, c: 36477},
- 36480, {f: 3, c: 36482}, 36486, 36488, 36492, 36494, {f: 5, c: 36501},
- 36507, 36509, {f: 2, c: 36511}, {f: 3, c: 36514}, {f: 3, c: 36519},
- {f: 2, c: 36525}, {f: 2, c: 36528}, {f: 7, c: 36531}, {f: 5, c: 36539},
- {f: 9, c: 36545}, {f: 3, c: 36559}, 36563, {f: 6, c: 36565},
- {f: 3, c: 36572}, {f: 4, c: 36576}, {f: 6, c: 36581}, {f: 6, c: 36588},
- {f: 5, c: 36595}, 36605, {f: 4, c: 36607}, 36612, 36614, 36616,
- {f: 7, c: 36619}, 36627, {f: 5, c: 36630}, {f: 5, c: 36640},
- {f: 2, c: 36647}, {f: 4, c: 36651}, {f: 3, c: 36656}, {f: 4, c: 36660},
- {f: 2, c: 36665}, {f: 2, c: 36668}, {f: 2, c: 36672}, 36675,
- {f: 2, c: 36679}, {f: 3, c: 36682}, {f: 5, c: 36687}, {f: 10, c: 36693},
- 36704, 36707, 36709, 36714, 36736, 36748, 36754, 36765, {f: 3, c: 36768},
- {f: 2, c: 36772}, 36775, 36778, 36780, {f: 2, c: 36787}, [12193, 36789],
- {f: 2, c: 36791}, {f: 3, c: 36794}, {f: 2, c: 36799}, 36803, 36806,
- {f: 5, c: 36809}, 36815, 36818, {f: 2, c: 36822}, 36826, {f: 2, c: 36832},
- 36835, 36839, 36844, 36847, {f: 2, c: 36849}, {f: 2, c: 36853},
- {f: 3, c: 36858}, {f: 2, c: 36862}, {f: 2, c: 36871}, 36876, 36878, 36883,
- 36888, 36892, {f: 2, c: 36900}, {f: 6, c: 36903}, {f: 2, c: 36912},
- {f: 2, c: 36915}, 36919, {f: 2, c: 36921}, 36925, {f: 2, c: 36927}, 36931,
- {f: 2, c: 36933}, {f: 3, c: 36936}, 36940, 36950, {f: 2, c: 36953}, 36957,
- 36959, 36961, 36964, {f: 2, c: 36966}, {f: 3, c: 36970}, {f: 3, c: 36975},
- 36979, 36982, 36985, 36987, 36990, {f: 2, c: 36997}, 37001,
- {f: 3, c: 37004}, 37010, 37012, 37014, 37016, 37018, 37020,
- {f: 3, c: 37022}, {f: 2, c: 37028}, {f: 3, c: 37031}, 37035, 37037, 37042,
- 37047, {f: 2, c: 37052}, {f: 2, c: 37055}, {f: 2, c: 37058}, 37062,
- {f: 2, c: 37064}, {f: 3, c: 37067}, 37074, {f: 3, c: 37076},
- {f: 3, c: 37080}, 37086, 37088, {f: 3, c: 37091}, {f: 2, c: 37097}, 37100,
- 37102, {f: 4, c: 37104}, {f: 2, c: 37110}, {f: 4, c: 37113},
- {f: 3, c: 37119}, 37123, 37125, {f: 2, c: 37127}, {f: 8, c: 37130}, 37139,
- 37141, {f: 2, c: 37143}, {f: 4, c: 37146}, {f: 3, c: 37151},
- {f: 3, c: 37156}, {f: 5, c: 37160}, 37166, 37171, 37173, {f: 2, c: 37175},
- {f: 8, c: 37179}, {f: 2, c: 37188}, 37191, 37201, {f: 4, c: 37203},
- {f: 2, c: 37208}, {f: 2, c: 37211}, {f: 2, c: 37215}, {f: 3, c: 37222},
- 37227, 37229, 37235, {f: 3, c: 37242}, {f: 5, c: 37248}, 37254, 37256,
- 37258, {f: 2, c: 37262}, {f: 3, c: 37267}, {f: 3, c: 37271},
- {f: 5, c: 37277}, {f: 6, c: 37284}, {f: 4, c: 37296}, {f: 4, c: 37302},
- {f: 5, c: 37307}, 37314, 37316, [12196, 37318], 37320, 37328, 37334,
- {f: 2, c: 37338}, {f: 5, c: 37342}, {f: 2, c: 37349}, 37352,
- {f: 11, c: 37354}, 37366, 37368, {f: 5, c: 37371}, {f: 2, c: 37378},
- {f: 3, c: 37381}, {f: 3, c: 37386}, 37391, {f: 2, c: 37394},
- {f: 8, c: 37398}, {f: 4, c: 37407}, 37412, {f: 6, c: 37416}, 37423,
- {f: 2, c: 37425}, {f: 2, c: 37429}, {f: 2, c: 37435}, {f: 4, c: 37441},
- {f: 2, c: 37446}, {f: 3, c: 37450}, {f: 3, c: 37454}, {f: 3, c: 37458},
- 37462, {f: 2, c: 37464}, {f: 2, c: 37468}, {f: 3, c: 37471},
- {f: 3, c: 37475}, {f: 5, c: 37479}, {f: 6, c: 37486}, {f: 3, c: 37493},
- 37497, {f: 3, c: 37500}, {f: 2, c: 37505}, 37508, {f: 8, c: 37510},
- {f: 2, c: 37519}, 37522, {f: 2, c: 37524}, 37527, 37529, 37531,
- {f: 3, c: 37533}, {f: 2, c: 37537}, 37540, 37543, 37549, {f: 2, c: 37551},
- {f: 5, c: 37554}, 37560, 37562, {f: 4, c: 37565}, 37570, 37572, 37574,
- {f: 3, c: 37577}, {f: 2, c: 37581}, {f: 2, c: 37584}, {f: 10, c: 37587},
- 37598, {f: 3, c: 37600}, 37607, 37609, {f: 2, c: 37611}, {f: 4, c: 37618},
- 37623, {f: 3, c: 37625}, {f: 4, c: 37629}, {f: 4, c: 37634},
- {f: 7, c: 37641}, 37649, {f: 2, c: 37651}, {f: 2, c: 37654},
- {f: 3, c: 37660}, 37665, {f: 3, c: 37667}, 37671, {f: 2, c: 37673},
- {f: 2, c: 37676}, {f: 2, c: 37680}, {f: 2, c: 37684}, 37687,
- {f: 5, c: 37689}, 37695, 37698, {f: 2, c: 37700}, {f: 3, c: 37704}, 37708,
- {f: 6, c: 37710}, {f: 3, c: 37717}, {f: 2, c: 37721}, {f: 8, c: 37724},
- {f: 3, c: 37734}, 37739, {f: 3, c: 37741}, {f: 4, c: 37745},
- {f: 3, c: 37751}, {f: 3, c: 37755}, {f: 3, c: 37759}, 37763,
- {f: 2, c: 37765}, {f: 2, c: 37768}, {f: 4, c: 37771}, {f: 6, c: 37776},
- 37783, {f: 9, c: 37785}, {f: 2, c: 37796}, 37800, 37803, 37805, 37807,
- {f: 2, c: 37809}, 37812, {f: 2, c: 37814}, {f: 6, c: 37817},
- {f: 3, c: 37824}, {f: 3, c: 37828}, 37833, 37835, {f: 3, c: 37838},
- {f: 4, c: 37842}, {f: 3, c: 37849}, 37856, 37859, {f: 3, c: 37861},
- {f: 12, c: 37865}, 37878, 37880, {f: 9, c: 37882}, {f: 7, c: 37892},
- {f: 4, c: 37900}, 37905, {f: 3, c: 37909}, {f: 3, c: 37914},
- {f: 2, c: 37918}, {f: 5, c: 37921}, {f: 5, c: 37929}, {f: 3, c: 37935},
- 37940, {f: 2, c: 37942}, 37945, {f: 3, c: 37947}, {f: 4, c: 37952},
- {f: 5, c: 37957}, 37963, {f: 5, c: 37965}, 37971, {f: 11, c: 37973},
- {f: 2, c: 37985}, 37988, {f: 5, c: 37990}, 37996, {f: 2, c: 37998}, 38001,
- {f: 4, c: 38003}, 38008, {f: 2, c: 38010}, {f: 5, c: 38016}, 38033, 38038,
- 38040, 38087, 38095, {f: 2, c: 38099}, 38106, 38118, 38139, 38172, 38176,
- 38183, 38195, 38205, 38211, 38216, 38219, 38229, 38234, 38240, 38254,
- {f: 2, c: 38260}, {f: 7, c: 38264}, 38273, {f: 2, c: 38276},
- {f: 2, c: 38279}, 38282, 38285, 38288, 38290, {f: 3, c: 38293},
- {f: 8, c: 38297}, 38306, {f: 2, c: 38310}, 38314, {f: 4, c: 38318},
- {f: 3, c: 38323}, {f: 2, c: 38327}, 38330, {f: 3, c: 38336},
- {f: 2, c: 38340}, 38343, 38345, {f: 3, c: 38349}, {f: 3, c: 38353},
- {f: 5, c: 38359}, 38365, {f: 2, c: 38367}, {f: 2, c: 38371},
- {f: 2, c: 38374}, 38380, 38399, 38407, 38419, 38424, 38427, 38430, 38432,
- {f: 7, c: 38435}, {f: 3, c: 38443}, {f: 2, c: 38447}, {f: 4, c: 38455},
- 38462, 38465, 38467, 38474, {f: 2, c: 38478}, {f: 3, c: 38481},
- {f: 2, c: 38486}, {f: 2, c: 38489}, 38492, 38494, 38496, {f: 2, c: 38501},
- 38507, {f: 3, c: 38509}, 38513, {f: 4, c: 38521}, {f: 7, c: 38526}, 38535,
- 38537, 38540, {f: 3, c: 38545}, 38550, 38554, {f: 10, c: 38557}, 38569,
- {f: 5, c: 38571}, 38578, 38581, 38583, 38586, 38591, {f: 2, c: 38594},
- 38600, {f: 2, c: 38602}, {f: 2, c: 38608}, {f: 2, c: 38611},
- {f: 2, c: 38615}, 38618, {f: 3, c: 38621}, 38625, {f: 4, c: 38628},
- {f: 4, c: 38635}, {f: 2, c: 38640}, {f: 2, c: 38644}, 38648, 38650,
- {f: 2, c: 38652}, 38655, {f: 2, c: 38658}, 38661, {f: 3, c: 38666},
- {f: 3, c: 38672}, {f: 2, c: 38676}, {f: 5, c: 38679}, 38685,
- {f: 8, c: 38687}, {f: 2, c: 38696}, {f: 2, c: 38699}, {f: 2, c: 38702},
- 38705, {f: 5, c: 38707}, {f: 3, c: 38714}, {f: 3, c: 38719}, 38723,
- {f: 3, c: 38725}, {f: 8, c: 38729}, [12205, 38737], {f: 2, c: 38740},
- {f: 2, c: 38743}, {f: 2, c: 38748}, 38751, {f: 2, c: 38755},
- {f: 2, c: 38758}, {f: 9, c: 38762}, 38773, {f: 5, c: 38775},
- {f: 8, c: 38781}, {f: 5, c: 38790}, 38796, 38798, 38800, 38803,
- {f: 3, c: 38805}, {f: 7, c: 38809}, {f: 2, c: 38817}, {f: 2, c: 38820},
- {f: 4, c: 38823}, 38828, 38830, {f: 2, c: 38832}, 38835, {f: 8, c: 38837},
- {f: 5, c: 38846}, {f: 2, c: 38852}, {f: 2, c: 38855}, 38858,
- {f: 6, c: 38861}, {f: 5, c: 38868}, {f: 2, c: 38874}, 38877,
- {f: 7, c: 38879}, 38888, {f: 5, c: 38894}, 38900, {f: 8, c: 38903}, 38912,
- 38916, 38921, 38923, 38925, {f: 3, c: 38932}, {f: 3, c: 38937},
- {f: 4, c: 38941}, {f: 2, c: 38946}, 38949, {f: 6, c: 38951},
- {f: 2, c: 38958}, {f: 6, c: 38961}, {f: 2, c: 38969}, 38972,
- {f: 8, c: 38974}, {f: 5, c: 38983}, {f: 4, c: 38991}, {f: 3, c: 38997},
- 39002, {f: 2, c: 39004}, {f: 3, c: 39007}, {f: 2, c: 39011}, 39014,
- {f: 3, c: 39016}, {f: 2, c: 39021}, 39026, 39051, 39054, 39058, 39061,
- 39065, 39075, {f: 5, c: 39081}, 39088, 39090, {f: 2, c: 39092},
- {f: 5, c: 39095}, {f: 7, c: 39101}, 39109, 39111, {f: 5, c: 39113},
- {f: 2, c: 39119}, 39124, {f: 2, c: 39126}, {f: 2, c: 39132}, 39137,
- {f: 4, c: 39139}, 39148, 39150, {f: 2, c: 39152}, 39155, {f: 7, c: 39157},
- {f: 4, c: 39167}, 39172, {f: 3, c: 39174}, 39179, {f: 2, c: 39182},
- {f: 4, c: 39188}, {f: 2, c: 39193}, {f: 2, c: 39196}, {f: 2, c: 39199},
- {f: 6, c: 39202}, {f: 5, c: 39209}, {f: 4, c: 39215}, {f: 3, c: 39220},
- {f: 4, c: 39224}, 39229, {f: 3, c: 39232}, 39236, {f: 2, c: 39238},
- {f: 4, c: 39245}, 39251, 39254, {f: 4, c: 39256}, 39261, {f: 3, c: 39263},
- 39268, 39270, 39283, {f: 2, c: 39288}, 39291, 39294, {f: 2, c: 39298},
- 39305, 39308, 39310, {f: 11, c: 39322}, {f: 2, c: 39334}, {f: 3, c: 39337},
- {f: 2, c: 39343}, 39346, {f: 12, c: 39349}, {f: 14, c: 39362}, 39379,
- {f: 2, c: 39382}, 39386, 39388, 39390, 39392, {f: 10, c: 39395},
- {f: 3, c: 39406}, {f: 13, c: 39410}, 39424, {f: 3, c: 39426},
- {f: 7, c: 39430}, {f: 6, c: 39440}, {f: 2, c: 39447}, {f: 17, c: 39450},
- 39468, 39471, {f: 5, c: 39473}, {f: 5, c: 39481}, 39487, {f: 4, c: 39494},
- {f: 2, c: 39499}, 39502, {f: 5, c: 39504}, 39510, {f: 2, c: 39512},
- {f: 3, c: 39516}, {f: 2, c: 39520}, 39523, {f: 4, c: 39526}, 39531, 39538,
- 39555, 39561, {f: 2, c: 39565}, {f: 2, c: 39572}, 39577, 39590,
- {f: 6, c: 39593}, {f: 4, c: 39602}, 39609, 39611, {f: 3, c: 39613},
- {f: 2, c: 39619}, {f: 5, c: 39622}, {f: 2, c: 39629}, 39632, 39639,
- {f: 6, c: 39641}, 39648, {f: 4, c: 39650}, {f: 4, c: 39655}, 39660,
- {f: 9, c: 39664}, 39674, {f: 7, c: 39676}, {f: 2, c: 39684}, 39687,
- {f: 4, c: 39689}, 39694, {f: 3, c: 39696}, {f: 6, c: 39700},
- {f: 4, c: 39707}, {f: 2, c: 39712}, 39716, 39718, 39720, {f: 4, c: 39722},
- 39728, {f: 8, c: 39731}, {f: 4, c: 39741}, 39750, {f: 3, c: 39754}, 39760,
- {f: 2, c: 39762}, {f: 3, c: 39765}, 39769, {f: 20, c: 39771},
- {f: 4, c: 39792}, {f: 2, c: 39797}, {f: 9, c: 39800}, 39810,
- {f: 10, c: 39812}, 39823, {f: 7, c: 39827}, {f: 2, c: 39835},
- {f: 11, c: 39839}, 39852, {f: 17, c: 39855}, {f: 5, c: 39874}, 39880,
- {f: 9, c: 39883}, 39893, {f: 4, c: 39895}, 39900, {f: 3, c: 39902}, 39907,
- {f: 2, c: 39909}, 39913, {f: 4, c: 39916}, {f: 3, c: 39921},
- {f: 8, c: 39925}, 39934, {f: 8, c: 39936}, {f: 3, c: 39946},
- {f: 2, c: 39950}, 39953, {f: 12, c: 39956}, {f: 2, c: 39969}, 39972,
- {f: 2, c: 39974}, {f: 3, c: 39978}, {f: 3, c: 39982}, 39988, 39990, 39992,
- 39994, {f: 2, c: 39996}, {f: 6, c: 39999}, {f: 2, c: 40006},
- {f: 8, c: 40010}, 40019, 40021, {f: 4, c: 40025}, 40030, {f: 7, c: 40032},
- {f: 5, c: 40040}, {f: 10, c: 40046}, 40057, 40059, {f: 2, c: 40061}, 40064,
- {f: 2, c: 40067}, {f: 2, c: 40073}, 40076, 40079, 40083, {f: 4, c: 40086},
- 40093, 40106, 40108, 40111, 40121, {f: 5, c: 40126}, {f: 2, c: 40136},
- {f: 2, c: 40145}, {f: 2, c: 40154}, {f: 2, c: 40160}, {f: 2, c: 40163},
- {f: 3, c: 40166}, {f: 2, c: 40170}, {f: 6, c: 40173}, 40181,
- {f: 15, c: 40183}, 40200, {f: 11, c: 40202}, {f: 5, c: 40214}, 40220,
- 40222, {f: 3, c: 40224}, {f: 2, c: 40228}, 40231, {f: 6, c: 40233},
- {f: 10, c: 40241}, {f: 3, c: 40252}, {f: 2, c: 40256}, {f: 14, c: 40259},
- {f: 8, c: 40276}, {f: 2, c: 40286}, {f: 8, c: 40290}, 40299,
- {f: 2, c: 40301}, {f: 2, c: 40304}, {f: 20, c: 40307}, 40328,
- {f: 9, c: 40330}, {f: 4, c: 40340}, 40345, {f: 10, c: 40347},
- {f: 3, c: 40358}, {f: 5, c: 40362}, {f: 4, c: 40368}, {f: 6, c: 40373},
- {f: 3, c: 40381}, 40385, 40387, {f: 14, c: 40389}, {f: 3, c: 40404}, 40408,
- {f: 10, c: 40411}, {f: 8, c: 40423}, {f: 2, c: 40432}, {f: 4, c: 40436},
- {f: 17, c: 40443}, {f: 8, c: 40461}, {f: 4, c: 40470}, 40476, 40484, 40487,
- 40494, 40496, 40500, {f: 2, c: 40507}, 40512, 40525, 40528,
- {f: 3, c: 40530}, 40534, 40537, 40541, {f: 4, c: 40543}, 40549,
- {f: 2, c: 40558}, 40562, 40564, {f: 3, c: 40566}, 40571, {f: 2, c: 40576},
- {f: 4, c: 40579}, {f: 2, c: 40585}, {f: 6, c: 40588}, {f: 3, c: 40596},
- {f: 5, c: 40600}, 40606, {f: 5, c: 40608}, {f: 2, c: 40615},
- {f: 5, c: 40618}, {f: 4, c: 40624}, {f: 2, c: 40630}, {f: 2, c: 40633},
- 40636, {f: 4, c: 40639}, [12232, 40643], {f: 4, c: 40645},
- {f: 2, c: 40650}, 40656, {f: 2, c: 40658}, {f: 3, c: 40661},
- {f: 2, c: 40665}, 40673, {f: 2, c: 40675}, 40678, {f: 4, c: 40683},
- {f: 2, c: 40688}, 40691, {f: 2, c: 40693}, 40696, 40698, {f: 9, c: 40704},
- 40714, 40716, 40719, {f: 2, c: 40721}, 40724, 40726, 40728,
- {f: 6, c: 40730}, 40737, {f: 9, c: 40739}, {f: 2, c: 40749},
- {f: 7, c: 40752}, 40760, 40762, 40764, {f: 5, c: 40767}, {f: 5, c: 40773},
- {f: 3, c: 40780}, 40787, {f: 4, c: 40789}, {f: 2, c: 40794},
- {f: 2, c: 40797}, 40802, {f: 2, c: 40804}, {f: 3, c: 40807}, 40811,
- {f: 5, c: 40813}, {f: 4, c: 40819}, {f: 7, c: 40824}, {f: 2, c: 40833},
- {f: 2, c: 40846}, {f: 3, c: 40849}, {f: 3, c: 40854}, {f: 2, c: 40861},
- {f: 5, c: 40865}, 63788, {f: 3, c: 64013}, 64017, {f: 2, c: 64019}, 64024,
- {f: 3, c: 64031}, {f: 2, c: 64035}, {f: 3, c: 64039}, 11905,
- [59414, 131207], [59415, 131209], [59416, 131276], 11908, 13427, 13383,
- 11912, 11915, 59422, 13726, 13850, 13838, 11916, 11927, 14702, 14616,
- 59430, 14799, 14815, 14963, 14800, {f: 2, c: 59435}, 15182, 15470, 15584,
- 11943, [59441, 136663], 59442, 11946, 16470, 16735, 11950, 17207, 11955,
- {f: 2, c: 11958}, [59451, 141711], 17329, 17324, 11963, 17373, 17622,
- 18017, 17996, [59459, 132361], 18211, 18217, 18300, 18317, 11978, 18759,
- 18810, 18813, {f: 2, c: 18818}, {f: 2, c: 18821}, 18847, 18843, 18871,
- 18870, [59476, 133533], [59477, 147966], 19619, {f: 3, c: 19615}, 19575,
- 19618, {f: 7, c: 19731}, 19886, 59492, {s: 226}, 8364, 165, 0, 0, 12351,
- {s: 17}, 12436, {s: 14}, 12535, 12537, 12536, 12538, 0, {f: 3, c: 12339},
- {f: 3, c: 12344}, {f: 3, c: 12586}, {f: 24, c: 12704}, 11904,
- {f: 2, c: 11906}, {f: 3, c: 11909}, {f: 2, c: 11913}, {f: 10, c: 11917},
- {f: 2, c: 11928}, {f: 12, c: 11931}, {f: 2, c: 11944}, {f: 3, c: 11947},
- {f: 4, c: 11951}, {f: 2, c: 11956}, {f: 3, c: 11960}, {f: 14, c: 11964},
- {f: 41, c: 11979}, {f: 71, c: 13312}, {f: 43, c: 13384},
- {f: 298, c: 13428}, {f: 111, c: 13727}, {f: 11, c: 13839},
- {f: 765, c: 13851}, {f: 85, c: 14617}, {f: 96, c: 14703},
- {f: 14, c: 14801}, {f: 147, c: 14816}, {f: 218, c: 14964},
- {f: 287, c: 15183}, {f: 113, c: 15471}, {f: 885, c: 15585},
- {f: 264, c: 16471}, {f: 471, c: 16736}, {f: 116, c: 17208},
- {f: 4, c: 17325}, {f: 43, c: 17330}, {f: 248, c: 17374},
- {f: 373, c: 17623}, {f: 20, c: 17997}, {f: 193, c: 18018},
- {f: 5, c: 18212}, {f: 82, c: 18218}, {f: 16, c: 18301}, {f: 441, c: 18318},
- {f: 50, c: 18760}, {f: 2, c: 18811}, {f: 4, c: 18814}, 18820,
- {f: 20, c: 18823}, {f: 3, c: 18844}, {f: 22, c: 18848}, {f: 703, c: 18872},
- {f: 39, c: 19576}, {f: 111, c: 19620}, {f: 148, c: 19738},
- {f: 7, c: 19887}]
-};
-
-
-
-var ColorSpace = (function ColorSpaceClosure() {
- // Constructor should define this.numComps, this.defaultColor, this.name
- function ColorSpace() {
- error('should not call ColorSpace constructor');
- }
-
- ColorSpace.prototype = {
- // Input: array of size numComps representing color component values
- // Output: array of rgb values, each value ranging from [0.1]
- getRgb: function ColorSpace_getRgb(color) {
- error('Should not call ColorSpace.getRgb: ' + color);
- },
- // Input: Uint8Array of component values, each value scaled to [0,255]
- // Output: Uint8Array of rgb values, each value scaled to [0,255]
- getRgbBuffer: function ColorSpace_getRgbBuffer(input) {
- error('Should not call ColorSpace.getRgbBuffer: ' + input);
- }
- };
-
- ColorSpace.parse = function ColorSpace_parse(cs, xref, res) {
- var IR = ColorSpace.parseToIR(cs, xref, res);
- if (IR instanceof AlternateCS)
- return IR;
-
- return ColorSpace.fromIR(IR);
- };
-
- ColorSpace.fromIR = function ColorSpace_fromIR(IR) {
- var name = isArray(IR) ? IR[0] : IR;
-
- switch (name) {
- case 'DeviceGrayCS':
- return new DeviceGrayCS();
- case 'DeviceRgbCS':
- return new DeviceRgbCS();
- case 'DeviceCmykCS':
- return new DeviceCmykCS();
- case 'PatternCS':
- var basePatternCS = IR[1];
- if (basePatternCS)
- basePatternCS = ColorSpace.fromIR(basePatternCS);
- return new PatternCS(basePatternCS);
- case 'IndexedCS':
- var baseIndexedCS = IR[1];
- var hiVal = IR[2];
- var lookup = IR[3];
- return new IndexedCS(ColorSpace.fromIR(baseIndexedCS), hiVal, lookup);
- case 'AlternateCS':
- var numComps = IR[1];
- var alt = IR[2];
- var tintFnIR = IR[3];
-
- return new AlternateCS(numComps, ColorSpace.fromIR(alt),
- PDFFunction.fromIR(tintFnIR));
- case 'LabCS':
- var whitePoint = IR[1].WhitePoint;
- var blackPoint = IR[1].BlackPoint;
- var range = IR[1].Range;
- return new LabCS(whitePoint, blackPoint, range);
- default:
- error('Unkown name ' + name);
- }
- return null;
- };
-
- ColorSpace.parseToIR = function ColorSpace_parseToIR(cs, xref, res) {
- if (isName(cs)) {
- var colorSpaces = res.get('ColorSpace');
- if (isDict(colorSpaces)) {
- var refcs = colorSpaces.get(cs.name);
- if (refcs)
- cs = refcs;
- }
- }
-
- cs = xref.fetchIfRef(cs);
- var mode;
-
- if (isName(cs)) {
- mode = cs.name;
- this.mode = mode;
-
- switch (mode) {
- case 'DeviceGray':
- case 'G':
- return 'DeviceGrayCS';
- case 'DeviceRGB':
- case 'RGB':
- return 'DeviceRgbCS';
- case 'DeviceCMYK':
- case 'CMYK':
- return 'DeviceCmykCS';
- case 'Pattern':
- return ['PatternCS', null];
- default:
- error('unrecognized colorspace ' + mode);
- }
- } else if (isArray(cs)) {
- mode = cs[0].name;
- this.mode = mode;
-
- switch (mode) {
- case 'DeviceGray':
- case 'G':
- return 'DeviceGrayCS';
- case 'DeviceRGB':
- case 'RGB':
- return 'DeviceRgbCS';
- case 'DeviceCMYK':
- case 'CMYK':
- return 'DeviceCmykCS';
- case 'CalGray':
- return 'DeviceGrayCS';
- case 'CalRGB':
- return 'DeviceRgbCS';
- case 'ICCBased':
- var stream = xref.fetchIfRef(cs[1]);
- var dict = stream.dict;
- var numComps = dict.get('N');
- if (numComps == 1)
- return 'DeviceGrayCS';
- if (numComps == 3)
- return 'DeviceRgbCS';
- if (numComps == 4)
- return 'DeviceCmykCS';
- break;
- case 'Pattern':
- var basePatternCS = cs[1];
- if (basePatternCS)
- basePatternCS = ColorSpace.parseToIR(basePatternCS, xref, res);
- return ['PatternCS', basePatternCS];
- case 'Indexed':
- case 'I':
- var baseIndexedCS = ColorSpace.parseToIR(cs[1], xref, res);
- var hiVal = cs[2] + 1;
- var lookup = xref.fetchIfRef(cs[3]);
- if (isStream(lookup)) {
- lookup = lookup.getBytes();
- }
- return ['IndexedCS', baseIndexedCS, hiVal, lookup];
- case 'Separation':
- case 'DeviceN':
- var name = cs[1];
- var numComps = 1;
- if (isName(name))
- numComps = 1;
- else if (isArray(name))
- numComps = name.length;
- var alt = ColorSpace.parseToIR(cs[2], xref, res);
- var tintFnIR = PDFFunction.getIR(xref, xref.fetchIfRef(cs[3]));
- return ['AlternateCS', numComps, alt, tintFnIR];
- case 'Lab':
- var params = cs[1].getAll();
- return ['LabCS', params];
- default:
- error('unimplemented color space object "' + mode + '"');
- }
- } else {
- error('unrecognized color space object: "' + cs + '"');
- }
- return null;
- };
- /**
- * Checks if a decode map matches the default decode map for a color space.
- * This handles the general decode maps where there are two values per
- * component. e.g. [0, 1, 0, 1, 0, 1] for a RGB color.
- * This does not handle Lab, Indexed, or Pattern decode maps since they are
- * slightly different.
- * @param {Array} decode Decode map (usually from an image).
- * @param {Number} n Number of components the color space has.
- */
- ColorSpace.isDefaultDecode = function ColorSpace_isDefaultDecode(decode, n) {
- if (!decode)
- return true;
-
- if (n * 2 !== decode.length) {
- warn('The decode map is not the correct length');
- return true;
- }
- for (var i = 0, ii = decode.length; i < ii; i += 2) {
- if (decode[i] != 0 || decode[i + 1] != 1)
- return false;
- }
- return true;
- };
-
- return ColorSpace;
-})();
-
-/**
- * Alternate color space handles both Separation and DeviceN color spaces. A
- * Separation color space is actually just a DeviceN with one color component.
- * Both color spaces use a tinting function to convert colors to a base color
- * space.
- */
-var AlternateCS = (function AlternateCSClosure() {
- function AlternateCS(numComps, base, tintFn) {
- this.name = 'Alternate';
- this.numComps = numComps;
- this.defaultColor = [];
- for (var i = 0; i < numComps; ++i)
- this.defaultColor.push(1);
- this.base = base;
- this.tintFn = tintFn;
- }
-
- AlternateCS.prototype = {
- getRgb: function AlternateCS_getRgb(color) {
- var tinted = this.tintFn(color);
- return this.base.getRgb(tinted);
- },
- getRgbBuffer: function AlternateCS_getRgbBuffer(input, bits) {
- var tintFn = this.tintFn;
- var base = this.base;
- var scale = 1 / ((1 << bits) - 1);
- var length = input.length;
- var pos = 0;
- var baseNumComps = base.numComps;
- var baseBuf = new Uint8Array(baseNumComps * length);
- var numComps = this.numComps;
- var scaled = [];
-
- for (var i = 0; i < length; i += numComps) {
- for (var z = 0; z < numComps; ++z)
- scaled[z] = input[i + z] * scale;
-
- var tinted = tintFn(scaled);
- for (var j = 0; j < baseNumComps; ++j)
- baseBuf[pos++] = 255 * tinted[j];
- }
- return base.getRgbBuffer(baseBuf, 8);
- },
- isDefaultDecode: function AlternateCS_isDefaultDecode(decodeMap) {
- return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
- }
- };
-
- return AlternateCS;
-})();
-
-var PatternCS = (function PatternCSClosure() {
- function PatternCS(baseCS) {
- this.name = 'Pattern';
- this.base = baseCS;
- }
- PatternCS.prototype = {};
-
- return PatternCS;
-})();
-
-var IndexedCS = (function IndexedCSClosure() {
- function IndexedCS(base, highVal, lookup) {
- this.name = 'Indexed';
- this.numComps = 1;
- this.defaultColor = [0];
- this.base = base;
- this.highVal = highVal;
-
- var baseNumComps = base.numComps;
- var length = baseNumComps * highVal;
- var lookupArray;
-
- if (isStream(lookup)) {
- lookupArray = new Uint8Array(length);
- var bytes = lookup.getBytes(length);
- lookupArray.set(bytes);
- } else if (isString(lookup)) {
- lookupArray = new Uint8Array(length);
- for (var i = 0; i < length; ++i)
- lookupArray[i] = lookup.charCodeAt(i);
- } else if (lookup instanceof Uint8Array) {
- lookupArray = lookup;
- } else {
- error('Unrecognized lookup table: ' + lookup);
- }
- this.lookup = lookupArray;
- }
-
- IndexedCS.prototype = {
- getRgb: function IndexedCS_getRgb(color) {
- var numComps = this.base.numComps;
- var start = color[0] * numComps;
- var c = [];
-
- for (var i = start, ii = start + numComps; i < ii; ++i)
- c.push(this.lookup[i]);
-
- return this.base.getRgb(c);
- },
- getRgbBuffer: function IndexedCS_getRgbBuffer(input) {
- var base = this.base;
- var numComps = base.numComps;
- var lookup = this.lookup;
- var length = input.length;
- var baseBuf = new Uint8Array(length * numComps);
- var baseBufPos = 0;
-
- for (var i = 0; i < length; ++i) {
- var lookupPos = input[i] * numComps;
- for (var j = 0; j < numComps; ++j) {
- baseBuf[baseBufPos++] = lookup[lookupPos + j];
- }
- }
-
- return base.getRgbBuffer(baseBuf, 8);
- },
- isDefaultDecode: function IndexedCS_isDefaultDecode(decodeMap) {
- // indexed color maps shouldn't be changed
- return true;
- }
- };
- return IndexedCS;
-})();
-
-var DeviceGrayCS = (function DeviceGrayCSClosure() {
- function DeviceGrayCS() {
- this.name = 'DeviceGray';
- this.numComps = 1;
- this.defaultColor = [0];
- }
-
- DeviceGrayCS.prototype = {
- getRgb: function DeviceGrayCS_getRgb(color) {
- var c = color[0];
- return [c, c, c];
- },
- getRgbBuffer: function DeviceGrayCS_getRgbBuffer(input, bits) {
- var scale = 255 / ((1 << bits) - 1);
- var length = input.length;
- var rgbBuf = new Uint8Array(length * 3);
- for (var i = 0, j = 0; i < length; ++i) {
- var c = (scale * input[i]) | 0;
- rgbBuf[j++] = c;
- rgbBuf[j++] = c;
- rgbBuf[j++] = c;
- }
- return rgbBuf;
- },
- isDefaultDecode: function DeviceGrayCS_isDefaultDecode(decodeMap) {
- return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
- }
- };
- return DeviceGrayCS;
-})();
-
-var DeviceRgbCS = (function DeviceRgbCSClosure() {
- function DeviceRgbCS() {
- this.name = 'DeviceRGB';
- this.numComps = 3;
- this.defaultColor = [0, 0, 0];
- }
- DeviceRgbCS.prototype = {
- getRgb: function DeviceRgbCS_getRgb(color) {
- return color;
- },
- getRgbBuffer: function DeviceRgbCS_getRgbBuffer(input, bits) {
- if (bits == 8)
- return input;
- var scale = 255 / ((1 << bits) - 1);
- var i, length = input.length;
- var rgbBuf = new Uint8Array(length);
- for (i = 0; i < length; ++i)
- rgbBuf[i] = (scale * input[i]) | 0;
- return rgbBuf;
- },
- isDefaultDecode: function DeviceRgbCS_isDefaultDecode(decodeMap) {
- return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
- }
- };
- return DeviceRgbCS;
-})();
-
-var DeviceCmykCS = (function DeviceCmykCSClosure() {
- function DeviceCmykCS() {
- this.name = 'DeviceCMYK';
- this.numComps = 4;
- this.defaultColor = [0, 0, 0, 1];
- }
- DeviceCmykCS.prototype = {
- getRgb: function DeviceCmykCS_getRgb(color) {
- var c = color[0], m = color[1], y = color[2], k = color[3];
-
- // CMYK -> CMY: http://www.easyrgb.com/index.php?X=MATH&H=14#text14
- c = (c * (1 - k) + k);
- m = (m * (1 - k) + k);
- y = (y * (1 - k) + k);
-
- // CMY -> RGB: http://www.easyrgb.com/index.php?X=MATH&H=12#text12
- var r = (1 - c);
- var g = (1 - m);
- var b = (1 - y);
-
- return [r, g, b];
- },
- getRgbBuffer: function DeviceCmykCS_getRgbBuffer(colorBuf, bits) {
- var scale = 1 / ((1 << bits) - 1);
- var length = colorBuf.length / 4;
- var rgbBuf = new Uint8Array(length * 3);
- var rgbBufPos = 0;
- var colorBufPos = 0;
-
- for (var i = 0; i < length; i++) {
- var cmyk = [];
- for (var j = 0; j < 4; ++j)
- cmyk.push(scale * colorBuf[colorBufPos++]);
-
- var rgb = this.getRgb(cmyk);
- for (var j = 0; j < 3; ++j)
- rgbBuf[rgbBufPos++] = Math.round(rgb[j] * 255);
- }
-
- return rgbBuf;
- },
- isDefaultDecode: function DeviceCmykCS_isDefaultDecode(decodeMap) {
- return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
- }
- };
-
- return DeviceCmykCS;
-})();
-
-//
-// LabCS: Based on "PDF Reference, Sixth Ed", p.250
-//
-var LabCS = (function LabCSClosure() {
- function LabCS(whitePoint, blackPoint, range) {
- this.name = 'Lab';
- this.numComps = 3;
- this.defaultColor = [0, 0, 0];
-
- if (!whitePoint)
- error('WhitePoint missing - required for color space Lab');
- blackPoint = blackPoint || [0, 0, 0];
- range = range || [-100, 100, -100, 100];
-
- // Translate args to spec variables
- this.XW = whitePoint[0];
- this.YW = whitePoint[1];
- this.ZW = whitePoint[2];
- this.amin = range[0];
- this.amax = range[1];
- this.bmin = range[2];
- this.bmax = range[3];
-
- // These are here just for completeness - the spec doesn't offer any
- // formulas that use BlackPoint in Lab
- this.XB = blackPoint[0];
- this.YB = blackPoint[1];
- this.ZB = blackPoint[2];
-
- // Validate vars as per spec
- if (this.XW < 0 || this.ZW < 0 || this.YW !== 1)
- error('Invalid WhitePoint components, no fallback available');
-
- if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {
- info('Invalid BlackPoint, falling back to default');
- this.XB = this.YB = this.ZB = 0;
- }
-
- if (this.amin > this.amax || this.bmin > this.bmax) {
- info('Invalid Range, falling back to defaults');
- this.amin = -100;
- this.amax = 100;
- this.bmin = -100;
- this.bmax = 100;
- }
- };
-
- // Function g(x) from spec
- function g(x) {
- if (x >= 6 / 29)
- return x * x * x;
- else
- return (108 / 841) * (x - 4 / 29);
- }
-
- LabCS.prototype = {
- getRgb: function LabCS_getRgb(color) {
- // Ls,as,bs <---> L*,a*,b* in the spec
- var Ls = color[0], as = color[1], bs = color[2];
-
- // Adjust limits of 'as' and 'bs'
- as = as > this.amax ? this.amax : as;
- as = as < this.amin ? this.amin : as;
- bs = bs > this.bmax ? this.bmax : bs;
- bs = bs < this.bmin ? this.bmin : bs;
-
- // Computes intermediate variables X,Y,Z as per spec
- var M = (Ls + 16) / 116;
- var L = M + (as / 500);
- var N = M - (bs / 200);
- var X = this.XW * g(L);
- var Y = this.YW * g(M);
- var Z = this.ZW * g(N);
-
- // XYZ to RGB 3x3 matrix, from:
- // http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC18
- var XYZtoRGB = [3.240479, -1.537150, -0.498535,
- -0.969256, 1.875992, 0.041556,
- 0.055648, -0.204043, 1.057311];
-
- return Util.apply3dTransform(XYZtoRGB, [X, Y, Z]);
- },
- getRgbBuffer: function LabCS_getRgbBuffer(input, bits) {
- if (bits == 8)
- return input;
- var scale = 255 / ((1 << bits) - 1);
- var i, length = input.length / 3;
- var rgbBuf = new Uint8Array(length);
-
- var j = 0;
- for (i = 0; i < length; ++i) {
- // Convert L*, a*, s* into RGB
- var rgb = this.getRgb([input[i], input[i + 1], input[i + 2]]);
- rgbBuf[j++] = rgb[0];
- rgbBuf[j++] = rgb[1];
- rgbBuf[j++] = rgb[2];
- }
-
- return rgbBuf;
- },
- isDefaultDecode: function LabCS_isDefaultDecode(decodeMap) {
- // From Table 90 in Adobe's:
- // "Document management - Portable document format", 1st ed, 2008
- if (decodeMap[0] === 0 && decodeMap[1] === 100 &&
- decodeMap[2] === this.amin && decodeMap[3] === this.amax &&
- decodeMap[4] === this.bmin && decodeMap[5] === this.bmax)
- return true;
- else
- return false;
- }
- };
- return LabCS;
-})();
-
-
-var ARCFourCipher = (function ARCFourCipherClosure() {
- function ARCFourCipher(key) {
- this.a = 0;
- this.b = 0;
- var s = new Uint8Array(256);
- var i, j = 0, tmp, keyLength = key.length;
- for (i = 0; i < 256; ++i)
- s[i] = i;
- for (i = 0; i < 256; ++i) {
- tmp = s[i];
- j = (j + tmp + key[i % keyLength]) & 0xFF;
- s[i] = s[j];
- s[j] = tmp;
- }
- this.s = s;
- }
-
- ARCFourCipher.prototype = {
- encryptBlock: function ARCFourCipher_encryptBlock(data) {
- var i, n = data.length, tmp, tmp2;
- var a = this.a, b = this.b, s = this.s;
- var output = new Uint8Array(n);
- for (i = 0; i < n; ++i) {
- a = (a + 1) & 0xFF;
- tmp = s[a];
- b = (b + tmp) & 0xFF;
- tmp2 = s[b];
- s[a] = tmp2;
- s[b] = tmp;
- output[i] = data[i] ^ s[(tmp + tmp2) & 0xFF];
- }
- this.a = a;
- this.b = b;
- return output;
- }
- };
- ARCFourCipher.prototype.decryptBlock = ARCFourCipher.prototype.encryptBlock;
-
- return ARCFourCipher;
-})();
-
-var calculateMD5 = (function calculateMD5Closure() {
- var r = new Uint8Array([
- 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,
- 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,
- 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,
- 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]);
-
- var k = new Int32Array([
- -680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426,
- -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162,
- 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632,
- 643717713, -373897302, -701558691, 38016083, -660478335, -405537848,
- 568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784,
- 1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556,
- -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222,
- -722521979, 76029189, -640364487, -421815835, 530742520, -995338651,
- -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606,
- -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649,
- -145523070, -1120210379, 718787259, -343485551]);
-
- function hash(data, offset, length) {
- var h0 = 1732584193, h1 = -271733879, h2 = -1732584194, h3 = 271733878;
- // pre-processing
- var paddedLength = (length + 72) & ~63; // data + 9 extra bytes
- var padded = new Uint8Array(paddedLength);
- var i, j, n;
- for (i = 0; i < length; ++i)
- padded[i] = data[offset++];
- padded[i++] = 0x80;
- n = paddedLength - 8;
- while (i < n)
- padded[i++] = 0;
- padded[i++] = (length << 3) & 0xFF;
- padded[i++] = (length >> 5) & 0xFF;
- padded[i++] = (length >> 13) & 0xFF;
- padded[i++] = (length >> 21) & 0xFF;
- padded[i++] = (length >>> 29) & 0xFF;
- padded[i++] = 0;
- padded[i++] = 0;
- padded[i++] = 0;
- // chunking
- // TODO ArrayBuffer ?
- var w = new Int32Array(16);
- for (i = 0; i < paddedLength;) {
- for (j = 0; j < 16; ++j, i += 4) {
- w[j] = (padded[i] | (padded[i + 1] << 8) |
- (padded[i + 2] << 16) | (padded[i + 3] << 24));
- }
- var a = h0, b = h1, c = h2, d = h3, f, g;
- for (j = 0; j < 64; ++j) {
- if (j < 16) {
- f = (b & c) | ((~b) & d);
- g = j;
- } else if (j < 32) {
- f = (d & b) | ((~d) & c);
- g = (5 * j + 1) & 15;
- } else if (j < 48) {
- f = b ^ c ^ d;
- g = (3 * j + 5) & 15;
- } else {
- f = c ^ (b | (~d));
- g = (7 * j) & 15;
- }
- var tmp = d, rotateArg = (a + f + k[j] + w[g]) | 0, rotate = r[j];
- d = c;
- c = b;
- b = (b + ((rotateArg << rotate) | (rotateArg >>> (32 - rotate)))) | 0;
- a = tmp;
- }
- h0 = (h0 + a) | 0;
- h1 = (h1 + b) | 0;
- h2 = (h2 + c) | 0;
- h3 = (h3 + d) | 0;
- }
- return new Uint8Array([
- h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >>> 24) & 0xFF,
- h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >>> 24) & 0xFF,
- h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >>> 24) & 0xFF,
- h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >>> 24) & 0xFF
- ]);
- }
- return hash;
-})();
-
-var NullCipher = (function NullCipherClosure() {
- function NullCipher() {
- }
-
- NullCipher.prototype = {
- decryptBlock: function NullCipher_decryptBlock(data) {
- return data;
- }
- };
-
- return NullCipher;
-})();
-
-var AES128Cipher = (function AES128CipherClosure() {
- var rcon = new Uint8Array([
- 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
- 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,
- 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
- 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
- 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
- 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6,
- 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72,
- 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc,
- 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10,
- 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e,
- 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5,
- 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94,
- 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02,
- 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d,
- 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d,
- 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f,
- 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb,
- 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
- 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,
- 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
- 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
- 0x74, 0xe8, 0xcb, 0x8d]);
-
- var s = new Uint8Array([
- 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b,
- 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
- 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26,
- 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
- 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2,
- 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
- 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed,
- 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
- 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f,
- 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
- 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec,
- 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
- 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14,
- 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
- 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d,
- 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
- 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f,
- 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
- 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11,
- 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
- 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f,
- 0xb0, 0x54, 0xbb, 0x16]);
-
- var inv_s = new Uint8Array([
- 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e,
- 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,
- 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32,
- 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
- 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49,
- 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,
- 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50,
- 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
- 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05,
- 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,
- 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41,
- 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
- 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8,
- 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,
- 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b,
- 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
- 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59,
- 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,
- 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d,
- 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
- 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63,
- 0x55, 0x21, 0x0c, 0x7d]);
-
- var mix = new Uint32Array([
- 0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927,
- 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45,
- 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb,
- 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381,
- 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf,
- 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66,
- 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28,
- 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012,
- 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec,
- 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e,
- 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd,
- 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7,
- 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89,
- 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b,
- 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815,
- 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f,
- 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa,
- 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8,
- 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36,
- 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c,
- 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742,
- 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea,
- 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4,
- 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e,
- 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360,
- 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502,
- 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87,
- 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd,
- 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3,
- 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621,
- 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f,
- 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55,
- 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26,
- 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844,
- 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba,
- 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480,
- 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce,
- 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67,
- 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929,
- 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713,
- 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed,
- 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f,
- 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]);
-
- function expandKey128(cipherKey) {
- var b = 176, result = new Uint8Array(b);
- result.set(cipherKey);
- for (var j = 16, i = 1; j < b; ++i) {
- // RotWord
- var t1 = result[j - 3], t2 = result[j - 2],
- t3 = result[j - 1], t4 = result[j - 4];
- // SubWord
- t1 = s[t1]; t2 = s[t2]; t3 = s[t3]; t4 = s[t4];
- // Rcon
- t1 = t1 ^ rcon[i];
- for (var n = 0; n < 4; ++n) {
- result[j] = (t1 ^= result[j - 16]); j++;
- result[j] = (t2 ^= result[j - 16]); j++;
- result[j] = (t3 ^= result[j - 16]); j++;
- result[j] = (t4 ^= result[j - 16]); j++;
- }
- }
- return result;
- }
-
- function decrypt128(input, key) {
- var state = new Uint8Array(16);
- state.set(input);
- var i, j, k;
- var t, u, v;
- // AddRoundKey
- for (j = 0, k = 160; j < 16; ++j, ++k)
- state[j] ^= key[k];
- for (i = 9; i >= 1; --i) {
- // InvShiftRows
- t = state[13]; state[13] = state[9]; state[9] = state[5];
- state[5] = state[1]; state[1] = t;
- t = state[14]; u = state[10]; state[14] = state[6];
- state[10] = state[2]; state[6] = t; state[2] = u;
- t = state[15]; u = state[11]; v = state[7]; state[15] = state[3];
- state[11] = t; state[7] = u; state[3] = v;
- // InvSubBytes
- for (j = 0; j < 16; ++j)
- state[j] = inv_s[state[j]];
- // AddRoundKey
- for (j = 0, k = i * 16; j < 16; ++j, ++k)
- state[j] ^= key[k];
- // InvMixColumns
- for (j = 0; j < 16; j += 4) {
- var s0 = mix[state[j]], s1 = mix[state[j + 1]],
- s2 = mix[state[j + 2]], s3 = mix[state[j + 3]];
- t = (s0 ^ (s1 >>> 8) ^ (s1 << 24) ^ (s2 >>> 16) ^ (s2 << 16) ^
- (s3 >>> 24) ^ (s3 << 8));
- state[j] = (t >>> 24) & 0xFF;
- state[j + 1] = (t >> 16) & 0xFF;
- state[j + 2] = (t >> 8) & 0xFF;
- state[j + 3] = t & 0xFF;
- }
- }
- // InvShiftRows
- t = state[13]; state[13] = state[9]; state[9] = state[5];
- state[5] = state[1]; state[1] = t;
- t = state[14]; u = state[10]; state[14] = state[6];
- state[10] = state[2]; state[6] = t; state[2] = u;
- t = state[15]; u = state[11]; v = state[7]; state[15] = state[3];
- state[11] = t; state[7] = u; state[3] = v;
- for (j = 0; j < 16; ++j) {
- // InvSubBytes
- state[j] = inv_s[state[j]];
- // AddRoundKey
- state[j] ^= key[j];
- }
- return state;
- }
-
- function AES128Cipher(key) {
- this.key = expandKey128(key);
- this.buffer = new Uint8Array(16);
- this.bufferPosition = 0;
- }
-
- function decryptBlock2(data) {
- var i, j, ii, sourceLength = data.length,
- buffer = this.buffer, bufferLength = this.bufferPosition,
- result = [], iv = this.iv;
- for (i = 0; i < sourceLength; ++i) {
- buffer[bufferLength] = data[i];
- ++bufferLength;
- if (bufferLength < 16)
- continue;
- // buffer is full, decrypting
- var plain = decrypt128(buffer, this.key);
- // xor-ing the IV vector to get plain text
- for (j = 0; j < 16; ++j)
- plain[j] ^= iv[j];
- iv = buffer;
- result.push(plain);
- buffer = new Uint8Array(16);
- bufferLength = 0;
- }
- // saving incomplete buffer
- this.buffer = buffer;
- this.bufferLength = bufferLength;
- this.iv = iv;
- if (result.length == 0)
- return new Uint8Array([]);
- if (result.length == 1)
- return result[0];
- // combining plain text blocks into one
- var output = new Uint8Array(16 * result.length);
- for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16)
- output.set(result[i], j);
- return output;
- }
-
- AES128Cipher.prototype = {
- decryptBlock: function AES128Cipher_decryptBlock(data) {
- var i, sourceLength = data.length;
- var buffer = this.buffer, bufferLength = this.bufferPosition;
- // waiting for IV values -- they are at the start of the stream
- for (i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength)
- buffer[bufferLength] = data[i];
- if (bufferLength < 16) {
- // need more data
- this.bufferLength = bufferLength;
- return new Uint8Array([]);
- }
- this.iv = buffer;
- this.buffer = new Uint8Array(16);
- this.bufferLength = 0;
- // starting decryption
- this.decryptBlock = decryptBlock2;
- return this.decryptBlock(data.subarray(16));
- }
- };
-
- return AES128Cipher;
-})();
-
-var CipherTransform = (function CipherTransformClosure() {
- function CipherTransform(stringCipherConstructor, streamCipherConstructor) {
- this.stringCipherConstructor = stringCipherConstructor;
- this.streamCipherConstructor = streamCipherConstructor;
- }
- CipherTransform.prototype = {
- createStream: function CipherTransform_createStream(stream) {
- var cipher = new this.streamCipherConstructor();
- return new DecryptStream(stream,
- function cipherTransformDecryptStream(data) {
- return cipher.decryptBlock(data);
- }
- );
- },
- decryptString: function CipherTransform_decryptString(s) {
- var cipher = new this.stringCipherConstructor();
- var data = stringToBytes(s);
- data = cipher.decryptBlock(data);
- return bytesToString(data);
- }
- };
- return CipherTransform;
-})();
-
-var CipherTransformFactory = (function CipherTransformFactoryClosure() {
- var defaultPasswordBytes = new Uint8Array([
- 0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41,
- 0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08,
- 0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80,
- 0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A]);
-
- function prepareKeyData(fileId, password, ownerPassword, userPassword,
- flags, revision, keyLength, encryptMetadata) {
- var hashData = new Uint8Array(100), i = 0, j, n;
- if (password) {
- n = Math.min(32, password.length);
- for (; i < n; ++i)
- hashData[i] = password[i];
- }
- j = 0;
- while (i < 32) {
- hashData[i++] = defaultPasswordBytes[j++];
- }
- // as now the padded password in the hashData[0..i]
- for (j = 0, n = ownerPassword.length; j < n; ++j)
- hashData[i++] = ownerPassword[j];
- hashData[i++] = flags & 0xFF;
- hashData[i++] = (flags >> 8) & 0xFF;
- hashData[i++] = (flags >> 16) & 0xFF;
- hashData[i++] = (flags >>> 24) & 0xFF;
- for (j = 0, n = fileId.length; j < n; ++j)
- hashData[i++] = fileId[j];
- if (revision >= 4 && !encryptMetadata) {
- hashData[i++] = 0xFF;
- hashData[i++] = 0xFF;
- hashData[i++] = 0xFF;
- hashData[i++] = 0xFF;
- }
- var hash = calculateMD5(hashData, 0, i);
- var keyLengthInBytes = keyLength >> 3;
- if (revision >= 3) {
- for (j = 0; j < 50; ++j) {
- hash = calculateMD5(hash, 0, keyLengthInBytes);
- }
- }
- var encryptionKey = hash.subarray(0, keyLengthInBytes);
- var cipher, checkData;
-
- if (revision >= 3) {
- for (i = 0; i < 32; ++i)
- hashData[i] = defaultPasswordBytes[i];
- for (j = 0, n = fileId.length; j < n; ++j)
- hashData[i++] = fileId[j];
- cipher = new ARCFourCipher(encryptionKey);
- var checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i));
- n = encryptionKey.length;
- var derivedKey = new Uint8Array(n), k;
- for (j = 1; j <= 19; ++j) {
- for (k = 0; k < n; ++k)
- derivedKey[k] = encryptionKey[k] ^ j;
- cipher = new ARCFourCipher(derivedKey);
- checkData = cipher.encryptBlock(checkData);
- }
- for (j = 0, n = checkData.length; j < n; ++j) {
- if (userPassword[j] != checkData[j])
- return null;
- }
- } else {
- cipher = new ARCFourCipher(encryptionKey);
- checkData = cipher.encryptBlock(defaultPasswordBytes);
- for (j = 0, n = checkData.length; j < n; ++j) {
- if (userPassword[j] != checkData[j])
- return null;
- }
- }
- return encryptionKey;
- }
- function decodeUserPassword(password, ownerPassword, revision, keyLength) {
- var hashData = new Uint8Array(32), i = 0, j, n;
- n = Math.min(32, password.length);
- for (; i < n; ++i)
- hashData[i] = password[i];
- j = 0;
- while (i < 32) {
- hashData[i++] = defaultPasswordBytes[j++];
- }
- var hash = calculateMD5(hashData, 0, i);
- var keyLengthInBytes = keyLength >> 3;
- if (revision >= 3) {
- for (j = 0; j < 50; ++j) {
- hash = calculateMD5(hash, 0, hash.length);
- }
- }
-
- var cipher, userPassword;
- if (revision >= 3) {
- userPassword = ownerPassword;
- var derivedKey = new Uint8Array(keyLengthInBytes), k;
- for (j = 19; j >= 0; j--) {
- for (k = 0; k < keyLengthInBytes; ++k)
- derivedKey[k] = hash[k] ^ j;
- cipher = new ARCFourCipher(derivedKey);
- userPassword = cipher.encryptBlock(userPassword);
- }
- } else {
- cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes));
- userPassword = cipher.encryptBlock(ownerPassword);
- }
- return userPassword;
- }
-
- var identityName = new Name('Identity');
-
- function CipherTransformFactory(dict, fileId, password) {
- var filter = dict.get('Filter');
- if (!isName(filter) || filter.name != 'Standard')
- error('unknown encryption method');
- this.dict = dict;
- var algorithm = dict.get('V');
- if (!isInt(algorithm) ||
- (algorithm != 1 && algorithm != 2 && algorithm != 4))
- error('unsupported encryption algorithm');
- this.algorithm = algorithm;
- var keyLength = dict.get('Length') || 40;
- if (!isInt(keyLength) ||
- keyLength < 40 || (keyLength % 8) != 0)
- error('invalid key length');
- // prepare keys
- var ownerPassword = stringToBytes(dict.get('O'));
- var userPassword = stringToBytes(dict.get('U'));
- var flags = dict.get('P');
- var revision = dict.get('R');
- var encryptMetadata = algorithm == 4 && // meaningful when V is 4
- dict.get('EncryptMetadata') !== false; // makes true as default value
- this.encryptMetadata = encryptMetadata;
-
- var fileIdBytes = stringToBytes(fileId);
- var passwordBytes;
- if (password)
- passwordBytes = stringToBytes(password);
-
- var encryptionKey = prepareKeyData(fileIdBytes, passwordBytes,
- ownerPassword, userPassword, flags,
- revision, keyLength, encryptMetadata);
- if (!encryptionKey && !password) {
- throw new PasswordException('No password given', 'needpassword');
- } else if (!encryptionKey && password) {
- // Attempting use the password as an owner password
- var decodedPassword = decodeUserPassword(passwordBytes, ownerPassword,
- revision, keyLength);
- encryptionKey = prepareKeyData(fileIdBytes, decodedPassword,
- ownerPassword, userPassword, flags,
- revision, keyLength, encryptMetadata);
- }
-
- if (!encryptionKey)
- throw new PasswordException('Incorrect Password', 'incorrectpassword');
-
- this.encryptionKey = encryptionKey;
-
- if (algorithm == 4) {
- this.cf = dict.get('CF');
- this.stmf = dict.get('StmF') || identityName;
- this.strf = dict.get('StrF') || identityName;
- this.eff = dict.get('EFF') || this.strf;
- }
- }
-
- function buildObjectKey(num, gen, encryptionKey, isAes) {
- var key = new Uint8Array(encryptionKey.length + 9), i, n;
- for (i = 0, n = encryptionKey.length; i < n; ++i)
- key[i] = encryptionKey[i];
- key[i++] = num & 0xFF;
- key[i++] = (num >> 8) & 0xFF;
- key[i++] = (num >> 16) & 0xFF;
- key[i++] = gen & 0xFF;
- key[i++] = (gen >> 8) & 0xFF;
- if (isAes) {
- key[i++] = 0x73;
- key[i++] = 0x41;
- key[i++] = 0x6C;
- key[i++] = 0x54;
- }
- var hash = calculateMD5(key, 0, i);
- return hash.subarray(0, Math.min(encryptionKey.length + 5, 16));
- }
-
- function buildCipherConstructor(cf, name, num, gen, key) {
- var cryptFilter = cf.get(name.name);
- var cfm;
- if (cryptFilter != null)
- cfm = cryptFilter.get('CFM');
- if (!cfm || cfm.name == 'None') {
- return function cipherTransformFactoryBuildCipherConstructorNone() {
- return new NullCipher();
- };
- }
- if ('V2' == cfm.name) {
- return function cipherTransformFactoryBuildCipherConstructorV2() {
- return new ARCFourCipher(
- buildObjectKey(num, gen, key, false));
- };
- }
- if ('AESV2' == cfm.name) {
- return function cipherTransformFactoryBuildCipherConstructorAESV2() {
- return new AES128Cipher(
- buildObjectKey(num, gen, key, true));
- };
- }
- error('Unknown crypto method');
- }
-
- CipherTransformFactory.prototype = {
- createCipherTransform:
- function CipherTransformFactory_createCipherTransform(num, gen) {
- if (this.algorithm == 4) {
- return new CipherTransform(
- buildCipherConstructor(this.cf, this.stmf,
- num, gen, this.encryptionKey),
- buildCipherConstructor(this.cf, this.strf,
- num, gen, this.encryptionKey));
- }
- // algorithms 1 and 2
- var key = buildObjectKey(num, gen, this.encryptionKey, false);
- var cipherConstructor = function buildCipherCipherConstructor() {
- return new ARCFourCipher(key);
- };
- return new CipherTransform(cipherConstructor, cipherConstructor);
- }
- };
-
- return CipherTransformFactory;
-})();
-
-
-
-var PartialEvaluator = (function PartialEvaluatorClosure() {
- function PartialEvaluator(xref, handler, uniquePrefix) {
- this.state = new EvalState();
- this.stateStack = [];
-
- this.xref = xref;
- this.handler = handler;
- this.uniquePrefix = uniquePrefix;
- this.objIdCounter = 0;
- this.fontIdCounter = 0;
- }
-
- var OP_MAP = {
- // Graphics state
- w: 'setLineWidth',
- J: 'setLineCap',
- j: 'setLineJoin',
- M: 'setMiterLimit',
- d: 'setDash',
- ri: 'setRenderingIntent',
- i: 'setFlatness',
- gs: 'setGState',
- q: 'save',
- Q: 'restore',
- cm: 'transform',
-
- // Path
- m: 'moveTo',
- l: 'lineTo',
- c: 'curveTo',
- v: 'curveTo2',
- y: 'curveTo3',
- h: 'closePath',
- re: 'rectangle',
- S: 'stroke',
- s: 'closeStroke',
- f: 'fill',
- F: 'fill',
- 'f*': 'eoFill',
- B: 'fillStroke',
- 'B*': 'eoFillStroke',
- b: 'closeFillStroke',
- 'b*': 'closeEOFillStroke',
- n: 'endPath',
-
- // Clipping
- W: 'clip',
- 'W*': 'eoClip',
-
- // Text
- BT: 'beginText',
- ET: 'endText',
- Tc: 'setCharSpacing',
- Tw: 'setWordSpacing',
- Tz: 'setHScale',
- TL: 'setLeading',
- Tf: 'setFont',
- Tr: 'setTextRenderingMode',
- Ts: 'setTextRise',
- Td: 'moveText',
- TD: 'setLeadingMoveText',
- Tm: 'setTextMatrix',
- 'T*': 'nextLine',
- Tj: 'showText',
- TJ: 'showSpacedText',
- "'": 'nextLineShowText',
- '"': 'nextLineSetSpacingShowText',
-
- // Type3 fonts
- d0: 'setCharWidth',
- d1: 'setCharWidthAndBounds',
-
- // Color
- CS: 'setStrokeColorSpace',
- cs: 'setFillColorSpace',
- SC: 'setStrokeColor',
- SCN: 'setStrokeColorN',
- sc: 'setFillColor',
- scn: 'setFillColorN',
- G: 'setStrokeGray',
- g: 'setFillGray',
- RG: 'setStrokeRGBColor',
- rg: 'setFillRGBColor',
- K: 'setStrokeCMYKColor',
- k: 'setFillCMYKColor',
-
- // Shading
- sh: 'shadingFill',
-
- // Images
- BI: 'beginInlineImage',
- ID: 'beginImageData',
- EI: 'endInlineImage',
-
- // XObjects
- Do: 'paintXObject',
-
- // Marked content
- MP: 'markPoint',
- DP: 'markPointProps',
- BMC: 'beginMarkedContent',
- BDC: 'beginMarkedContentProps',
- EMC: 'endMarkedContent',
-
- // Compatibility
- BX: 'beginCompat',
- EX: 'endCompat',
-
- // (reserved partial commands for the lexer)
- BM: null,
- BD: null,
- 'true': null,
- fa: null,
- fal: null,
- fals: null,
- 'false': null,
- nu: null,
- nul: null,
- 'null': null
- };
-
- PartialEvaluator.prototype = {
- loadFont: function PartialEvaluator_loadFont(fontName, font, xref,
- resources, dependency) {
- var fontRes = resources.get('Font');
-
- assert(fontRes, 'fontRes not available');
-
- font = xref.fetchIfRef(font) || fontRes.get(fontName);
- assertWellFormed(isDict(font));
-
- ++this.fontIdCounter;
- var loadedName = font.loadedName;
- if (!loadedName) {
- // keep track of each font we translated so the caller can
- // load them asynchronously before calling display on a page
- loadedName = 'font_' + this.uniquePrefix + this.fontIdCounter;
- font.loadedName = loadedName;
-
- var translated;
- try {
- translated = this.translateFont(font, xref, resources,
- dependency);
- } catch (e) {
- translated = { error: e };
- }
- font.translated = translated;
-
- var data = translated;
- if (data.loadCharProcs) {
- delete data.loadCharProcs;
-
- var charProcs = font.get('CharProcs').getAll();
- var fontResources = font.get('Resources') || resources;
- var charProcOperatorList = {};
- for (var key in charProcs) {
- var glyphStream = charProcs[key];
- charProcOperatorList[key] =
- this.getOperatorList(glyphStream, fontResources, dependency);
- }
- data.charProcOperatorList = charProcOperatorList;
- }
- }
- return font;
- },
-
- getOperatorList: function PartialEvaluator_getOperatorList(stream,
- resources,
- dependency,
- queue) {
-
- var self = this;
- var xref = this.xref;
- var handler = this.handler;
- var uniquePrefix = this.uniquePrefix || '';
-
- function insertDependency(depList) {
- fnArray.push('dependency');
- argsArray.push(depList);
- for (var i = 0, ii = depList.length; i < ii; i++) {
- var dep = depList[i];
- if (dependency.indexOf(dep) == -1) {
- dependency.push(depList[i]);
- }
- }
- }
-
- function handleSetFont(fontName, font) {
- font = self.loadFont(fontName, font, xref, resources, dependency);
-
- var loadedName = font.loadedName;
- if (!font.sent) {
- var data = font.translated;
-
- if (data instanceof Font)
- data = data.exportData();
-
- handler.send('obj', [
- loadedName,
- 'Font',
- data
- ]);
- font.sent = true;
- }
-
- // Ensure the font is ready before the font is set
- // and later on used for drawing.
- // OPTIMIZE: This should get insert to the operatorList only once per
- // page.
- insertDependency([loadedName]);
- return loadedName;
- }
-
- function buildPaintImageXObject(image, inline) {
- var dict = image.dict;
- var w = dict.get('Width', 'W');
- var h = dict.get('Height', 'H');
-
- var imageMask = dict.get('ImageMask', 'IM') || false;
- if (imageMask) {
- // This depends on a tmpCanvas beeing filled with the
- // current fillStyle, such that processing the pixel
- // data can't be done here. Instead of creating a
- // complete PDFImage, only read the information needed
- // for later.
-
- var width = dict.get('Width', 'W');
- var height = dict.get('Height', 'H');
- var bitStrideLength = (width + 7) >> 3;
- var imgArray = image.getBytes(bitStrideLength * height);
- var decode = dict.get('Decode', 'D');
- var inverseDecode = !!decode && decode[0] > 0;
-
- fn = 'paintImageMaskXObject';
- args = [imgArray, inverseDecode, width, height];
- return;
- }
-
- // If there is no imageMask, create the PDFImage and a lot
- // of image processing can be done here.
- var objId = 'img_' + uniquePrefix + (++self.objIdCounter);
- insertDependency([objId]);
- args = [objId, w, h];
-
- var softMask = dict.get('SMask', 'SM') || false;
- var mask = dict.get('Mask') || false;
-
- if (!softMask && !mask && image instanceof JpegStream &&
- image.isNativelySupported(xref, resources)) {
- // These JPEGs don't need any more processing so we can just send it.
- fn = 'paintJpegXObject';
- handler.send('obj', [objId, 'JpegStream', image.getIR()]);
- return;
- }
-
- fn = 'paintImageXObject';
-
- PDFImage.buildImage(function(imageObj) {
- var drawWidth = imageObj.drawWidth;
- var drawHeight = imageObj.drawHeight;
- var imgData = {
- width: drawWidth,
- height: drawHeight,
- data: new Uint8Array(drawWidth * drawHeight * 4)
- };
- var pixels = imgData.data;
- imageObj.fillRgbaBuffer(pixels, drawWidth, drawHeight);
- handler.send('obj', [objId, 'Image', imgData]);
- }, handler, xref, resources, image, inline);
- }
-
- if (!queue)
- queue = {};
-
- if (!queue.argsArray) {
- queue.argsArray = [];
- }
- if (!queue.fnArray) {
- queue.fnArray = [];
- }
-
- var fnArray = queue.fnArray, argsArray = queue.argsArray;
- var dependencyArray = dependency || [];
-
- resources = resources || new Dict();
- var xobjs = resources.get('XObject') || new Dict();
- var patterns = resources.get('Pattern') || new Dict();
- var parser = new Parser(new Lexer(stream, OP_MAP), false, xref);
- var res = resources;
- var args = [], obj;
- var TILING_PATTERN = 1, SHADING_PATTERN = 2;
-
- while (true) {
- obj = parser.getObj();
- if (isEOF(obj))
- break;
-
- if (isCmd(obj)) {
- var cmd = obj.cmd;
- var fn = OP_MAP[cmd];
- assertWellFormed(fn, 'Unknown command "' + cmd + '"');
- // TODO figure out how to type-check vararg functions
-
- if ((cmd == 'SCN' || cmd == 'scn') && !args[args.length - 1].code) {
- // compile tiling patterns
- var patternName = args[args.length - 1];
- // SCN/scn applies patterns along with normal colors
- if (isName(patternName)) {
- var pattern = patterns.get(patternName.name);
- if (pattern) {
- var dict = isStream(pattern) ? pattern.dict : pattern;
- var typeNum = dict.get('PatternType');
-
- if (typeNum == TILING_PATTERN) {
- // Create an IR of the pattern code.
- var depIdx = dependencyArray.length;
- var operatorList = this.getOperatorList(pattern,
- dict.get('Resources') || resources, dependencyArray);
-
- // Add the dependencies that are required to execute the
- // operatorList.
- insertDependency(dependencyArray.slice(depIdx));
-
- args = TilingPattern.getIR(operatorList, dict, args);
- }
- else if (typeNum == SHADING_PATTERN) {
- var shading = dict.get('Shading');
- var matrix = dict.get('Matrix');
- var pattern = Pattern.parseShading(shading, matrix, xref,
- res);
- args = pattern.getIR();
- } else {
- error('Unkown PatternType ' + typeNum);
- }
- }
- }
- } else if (cmd == 'Do' && !args[0].code) {
- // eagerly compile XForm objects
- var name = args[0].name;
- var xobj = xobjs.get(name);
- if (xobj) {
- assertWellFormed(isStream(xobj), 'XObject should be a stream');
-
- var type = xobj.dict.get('Subtype');
- assertWellFormed(
- isName(type),
- 'XObject should have a Name subtype'
- );
-
- if ('Form' == type.name) {
- var matrix = xobj.dict.get('Matrix');
- var bbox = xobj.dict.get('BBox');
-
- fnArray.push('paintFormXObjectBegin');
- argsArray.push([matrix, bbox]);
-
- // This adds the operatorList of the xObj to the current queue.
- var depIdx = dependencyArray.length;
-
- // Pass in the current `queue` object. That means the `fnArray`
- // and the `argsArray` in this scope is reused and new commands
- // are added to them.
- this.getOperatorList(xobj,
- xobj.dict.get('Resources') || resources,
- dependencyArray, queue);
-
- // Add the dependencies that are required to execute the
- // operatorList.
- insertDependency(dependencyArray.slice(depIdx));
-
- fn = 'paintFormXObjectEnd';
- args = [];
- } else if ('Image' == type.name) {
- buildPaintImageXObject(xobj, false);
- } else {
- error('Unhandled XObject subtype ' + type.name);
- }
- }
- } else if (cmd == 'Tf') { // eagerly collect all fonts
- args[0] = handleSetFont(args[0].name);
- } else if (cmd == 'EI') {
- buildPaintImageXObject(args[0], true);
- }
-
- switch (fn) {
- // Parse the ColorSpace data to a raw format.
- case 'setFillColorSpace':
- case 'setStrokeColorSpace':
- args = [ColorSpace.parseToIR(args[0], xref, resources)];
- break;
- case 'shadingFill':
- var shadingRes = res.get('Shading');
- if (!shadingRes)
- error('No shading resource found');
-
- var shading = shadingRes.get(args[0].name);
- if (!shading)
- error('No shading object found');
-
- var shadingFill = Pattern.parseShading(shading, null, xref, res);
- var patternIR = shadingFill.getIR();
- args = [patternIR];
- fn = 'shadingFill';
- break;
- case 'setGState':
- var dictName = args[0];
- var extGState = resources.get('ExtGState');
-
- if (!isDict(extGState) || !extGState.has(dictName.name))
- break;
-
- var gsState = extGState.get(dictName.name);
-
- // This array holds the converted/processed state data.
- var gsStateObj = [];
-
- gsState.forEach(
- function canvasGraphicsSetGStateForEach(key, value) {
- switch (key) {
- case 'Type':
- break;
- case 'LW':
- case 'LC':
- case 'LJ':
- case 'ML':
- case 'D':
- case 'RI':
- case 'FL':
- case 'CA':
- case 'ca':
- gsStateObj.push([key, value]);
- break;
- case 'Font':
- gsStateObj.push([
- 'Font',
- handleSetFont(null, value[0]),
- value[1]
- ]);
- break;
- case 'BM':
- // We support the default so don't trigger the TODO.
- if (!isName(value) || value.name != 'Normal')
- TODO('graphic state operator ' + key);
- break;
- case 'SMask':
- // We support the default so don't trigger the TODO.
- if (!isName(value) || value.name != 'None')
- TODO('graphic state operator ' + key);
- break;
- // Only generate info log messages for the following since
- // they are unlikey to have a big impact on the rendering.
- case 'OP':
- case 'op':
- case 'OPM':
- case 'BG':
- case 'BG2':
- case 'UCR':
- case 'UCR2':
- case 'TR':
- case 'TR2':
- case 'HT':
- case 'SM':
- case 'SA':
- case 'AIS':
- case 'TK':
- // TODO implement these operators.
- info('graphic state operator ' + key);
- break;
- default:
- info('Unknown graphic state operator ' + key);
- break;
- }
- }
- );
- args = [gsStateObj];
- break;
- } // switch
-
- fnArray.push(fn);
- argsArray.push(args);
- args = [];
- } else if (obj != null) {
- assertWellFormed(args.length <= 33, 'Too many arguments');
- args.push(obj instanceof Dict ? obj.getAll() : obj);
- }
- }
-
- return queue;
- },
-
- getTextContent: function partialEvaluatorGetIRQueue(
- stream, resources, state) {
- var bidiTexts;
- var kSpaceFactor = 0.35;
- var kMultipleSpaceFactor = 1.5;
-
- if (!state) {
- bidiTexts = [];
- state = {
- bidiTexts: bidiTexts
- };
- } else {
- bidiTexts = state.bidiTexts;
- }
-
- var self = this;
- var xref = this.xref;
-
- function handleSetFont(fontName, fontRef) {
- return self.loadFont(fontName, fontRef, xref, resources, null);
- }
-
- resources = xref.fetchIfRef(resources) || new Dict();
- // The xobj is parsed iff it's needed, e.g. if there is a `DO` cmd.
- var xobjs = null;
-
- var parser = new Parser(new Lexer(stream), false);
- var res = resources;
- var args = [], obj;
-
- var chunk = '';
- var font = null;
- while (!isEOF(obj = parser.getObj())) {
- if (isCmd(obj)) {
- var cmd = obj.cmd;
- switch (cmd) {
- // TODO: Add support for SAVE/RESTORE and XFORM here.
- case 'Tf':
- font = handleSetFont(args[0].name).translated;
- break;
- case 'TJ':
- var items = args[0];
- for (var j = 0, jj = items.length; j < jj; j++) {
- if (typeof items[j] === 'string') {
- chunk += fontCharsToUnicode(items[j], font);
- } else if (items[j] < 0 && font.spaceWidth > 0) {
- var fakeSpaces = -items[j] / font.spaceWidth;
- if (fakeSpaces > kMultipleSpaceFactor) {
- fakeSpaces = Math.round(fakeSpaces);
- while (fakeSpaces--) {
- chunk += ' ';
- }
- } else if (fakeSpaces > kSpaceFactor) {
- chunk += ' ';
- }
- }
- }
- break;
- case 'Tj':
- chunk += fontCharsToUnicode(args[0], font);
- break;
- case "'":
- // For search, adding a extra white space for line breaks would be
- // better here, but that causes too much spaces in the
- // text-selection divs.
- chunk += fontCharsToUnicode(args[0], font);
- break;
- case '"':
- // Note comment in "'"
- chunk += fontCharsToUnicode(args[2], font);
- break;
- case 'Do':
- // Set the chunk such that the following if won't add something
- // to the state.
- chunk = '';
-
- if (args[0].code) {
- break;
- }
-
- if (!xobjs) {
- xobjs = resources.get('XObject') || new Dict();
- }
-
- var name = args[0].name;
- var xobj = xobjs.get(name);
- if (!xobj)
- break;
- assertWellFormed(isStream(xobj), 'XObject should be a stream');
-
- var type = xobj.dict.get('Subtype');
- assertWellFormed(
- isName(type),
- 'XObject should have a Name subtype'
- );
-
- if ('Form' !== type.name)
- break;
-
- state = this.getTextContent(
- xobj,
- xobj.dict.get('Resources') || resources,
- state
- );
- break;
- case 'gs':
- var dictName = args[0];
- var extGState = resources.get('ExtGState');
-
- if (!isDict(extGState) || !extGState.has(dictName.name))
- break;
-
- var gsState = extGState.get(dictName.name);
-
- for (var i = 0; i < gsState.length; i++) {
- if (gsState[i] === 'Font') {
- font = handleSetFont(args[0].name).translated;
- }
- }
- break;
- } // switch
-
- if (chunk !== '') {
- bidiTexts.push(PDFJS.bidi(chunk, -1));
-
- chunk = '';
- }
-
- args = [];
- } else if (obj != null) {
- assertWellFormed(args.length <= 33, 'Too many arguments');
- args.push(obj);
- }
- } // while
-
- return state;
- },
-
- extractDataStructures: function
- partialEvaluatorExtractDataStructures(dict, baseDict,
- xref, properties) {
- // 9.10.2
- var toUnicode = dict.get('ToUnicode') ||
- baseDict.get('ToUnicode');
- if (toUnicode)
- properties.toUnicode = this.readToUnicode(toUnicode, xref, properties);
-
- if (properties.composite) {
- // CIDSystemInfo helps to match CID to glyphs
- var cidSystemInfo = dict.get('CIDSystemInfo');
- if (isDict(cidSystemInfo)) {
- properties.cidSystemInfo = {
- registry: cidSystemInfo.get('Registry'),
- ordering: cidSystemInfo.get('Ordering'),
- supplement: cidSystemInfo.get('Supplement')
- };
- }
-
- var cidToGidMap = dict.get('CIDToGIDMap');
- if (isStream(cidToGidMap))
- properties.cidToGidMap = this.readCidToGidMap(cidToGidMap);
- }
-
- var flags = properties.flags;
- var differences = [];
- var baseEncoding = Encodings.StandardEncoding;
- // The Symbolic attribute can be misused for regular fonts
- // Heuristic: we have to check if the font is a standard one also
- if (!!(flags & FontFlags.Symbolic)) {
- baseEncoding = !properties.file ? Encodings.symbolsEncoding :
- Encodings.MacRomanEncoding;
- }
- var hasEncoding = dict.has('Encoding');
- if (hasEncoding) {
- var encoding = dict.get('Encoding');
- if (isDict(encoding)) {
- var baseName = encoding.get('BaseEncoding');
- if (baseName)
- baseEncoding = Encodings[baseName.name];
- else
- hasEncoding = false; // base encoding was not provided
-
- // Load the differences between the base and original
- if (encoding.has('Differences')) {
- var diffEncoding = encoding.get('Differences');
- var index = 0;
- for (var j = 0, jj = diffEncoding.length; j < jj; j++) {
- var data = diffEncoding[j];
- if (isNum(data))
- index = data;
- else
- differences[index++] = data.name;
- }
- }
- } else if (isName(encoding)) {
- baseEncoding = Encodings[encoding.name];
- } else {
- error('Encoding is not a Name nor a Dict');
- }
- }
-
- properties.differences = differences;
- properties.baseEncoding = baseEncoding;
- properties.hasEncoding = hasEncoding;
- },
-
- readToUnicode: function PartialEvaluator_readToUnicode(toUnicode, xref,
- properties) {
- var cmapObj = toUnicode;
- var charToUnicode = [];
- if (isName(cmapObj)) {
- var isIdentityMap = cmapObj.name.substr(0, 9) == 'Identity-';
- if (!isIdentityMap)
- error('ToUnicode file cmap translation not implemented');
- } else if (isStream(cmapObj)) {
- var tokens = [];
- var token = '';
- var beginArrayToken = {};
-
- var cmap = cmapObj.getBytes(cmapObj.length);
- for (var i = 0, ii = cmap.length; i < ii; i++) {
- var octet = cmap[i];
- if (octet == 0x20 || octet == 0x0D || octet == 0x0A ||
- octet == 0x3C || octet == 0x5B || octet == 0x5D) {
- switch (token) {
- case 'usecmap':
- error('usecmap is not implemented');
- break;
-
- case 'beginbfchar':
- case 'beginbfrange':
- case 'begincidchar':
- case 'begincidrange':
- token = '';
- tokens = [];
- break;
-
- case 'endcidrange':
- case 'endbfrange':
- for (var j = 0, jj = tokens.length; j < jj; j += 3) {
- var startRange = tokens[j];
- var endRange = tokens[j + 1];
- var code = tokens[j + 2];
- if (code == 0xFFFF) {
- // CMap is broken, assuming code == startRange
- code = startRange;
- }
- if (isArray(code)) {
- var codeindex = 0;
- while (startRange <= endRange) {
- charToUnicode[startRange] = code[codeindex++];
- ++startRange;
- }
- } else {
- while (startRange <= endRange) {
- charToUnicode[startRange] = code++;
- ++startRange;
- }
- }
- }
- break;
-
- case 'endcidchar':
- case 'endbfchar':
- for (var j = 0, jj = tokens.length; j < jj; j += 2) {
- var index = tokens[j];
- var code = tokens[j + 1];
- charToUnicode[index] = code;
- }
- break;
-
- case '':
- break;
-
- default:
- if (token[0] >= '0' && token[0] <= '9')
- token = parseInt(token, 10); // a number
- tokens.push(token);
- token = '';
- }
- switch (octet) {
- case 0x5B:
- // begin list parsing
- tokens.push(beginArrayToken);
- break;
- case 0x5D:
- // collect array items
- var items = [], item;
- while (tokens.length &&
- (item = tokens.pop()) != beginArrayToken)
- items.unshift(item);
- tokens.push(items);
- break;
- }
- } else if (octet == 0x3E) {
- if (token.length) {
- // Heuristic: guessing chars size by checking numbers sizes
- // in the CMap entries.
- if (token.length == 2 && properties.composite)
- properties.wideChars = false;
-
- if (token.length <= 4) {
- // parsing hex number
- tokens.push(parseInt(token, 16));
- token = '';
- } else {
- // parsing hex UTF-16BE numbers
- var str = [];
- for (var k = 0, kk = token.length; k < kk; k += 4) {
- var b = parseInt(token.substr(k, 4), 16);
- if (b <= 0x10) {
- k += 4;
- b = (b << 16) | parseInt(token.substr(k, 4), 16);
- b -= 0x10000;
- str.push(0xD800 | (b >> 10));
- str.push(0xDC00 | (b & 0x3FF));
- break;
- }
- str.push(b);
- }
- tokens.push(String.fromCharCode.apply(String, str));
- token = '';
- }
- }
- } else {
- token += String.fromCharCode(octet);
- }
- }
- }
- return charToUnicode;
- },
- readCidToGidMap: function PartialEvaluator_readCidToGidMap(cidToGidStream) {
- // Extract the encoding from the CIDToGIDMap
- var glyphsData = cidToGidStream.getBytes();
-
- // Set encoding 0 to later verify the font has an encoding
- var result = [];
- for (var j = 0, jj = glyphsData.length; j < jj; j++) {
- var glyphID = (glyphsData[j++] << 8) | glyphsData[j];
- if (glyphID == 0)
- continue;
-
- var code = j >> 1;
- result[code] = glyphID;
- }
- return result;
- },
-
- extractWidths: function PartialEvaluator_extractWidths(dict,
- xref,
- descriptor,
- properties) {
- var glyphsWidths = [];
- var defaultWidth = 0;
- if (properties.composite) {
- defaultWidth = dict.get('DW') || 1000;
-
- var widths = dict.get('W');
- if (widths) {
- var start = 0, end = 0;
- for (var i = 0, ii = widths.length; i < ii; i++) {
- var code = xref.fetchIfRef(widths[i]);
- if (isArray(code)) {
- for (var j = 0, jj = code.length; j < jj; j++)
- glyphsWidths[start++] = code[j];
- start = 0;
- } else if (start) {
- var width = widths[++i];
- for (var j = start; j <= code; j++)
- glyphsWidths[j] = width;
- start = 0;
- } else {
- start = code;
- }
- }
- }
- } else {
- var firstChar = properties.firstChar;
- var widths = dict.get('Widths');
- if (widths) {
- var j = firstChar;
- for (var i = 0, ii = widths.length; i < ii; i++)
- glyphsWidths[j++] = widths[i];
- defaultWidth = parseFloat(descriptor.get('MissingWidth')) || 0;
- } else {
- // Trying get the BaseFont metrics (see comment above).
- var baseFontName = dict.get('BaseFont');
- if (isName(baseFontName)) {
- var metrics = this.getBaseFontMetrics(baseFontName.name);
-
- glyphsWidths = metrics.widths;
- defaultWidth = metrics.defaultWidth;
- }
- }
- }
-
- // Heuristic: detection of monospace font by checking all non-zero widths
- var isMonospace = true, firstWidth = defaultWidth;
- for (var glyph in glyphsWidths) {
- var glyphWidth = glyphsWidths[glyph];
- if (!glyphWidth)
- continue;
- if (!firstWidth) {
- firstWidth = glyphWidth;
- continue;
- }
- if (firstWidth != glyphWidth) {
- isMonospace = false;
- break;
- }
- }
- if (isMonospace)
- properties.flags |= FontFlags.FixedPitch;
-
- properties.defaultWidth = defaultWidth;
- properties.widths = glyphsWidths;
- },
-
- getBaseFontMetrics: function PartialEvaluator_getBaseFontMetrics(name) {
- var defaultWidth = 0, widths = [], monospace = false;
- var glyphWidths = Metrics[stdFontMap[name] || name];
- if (isNum(glyphWidths)) {
- defaultWidth = glyphWidths;
- monospace = true;
- } else {
- widths = glyphWidths;
- }
-
- return {
- defaultWidth: defaultWidth,
- monospace: monospace,
- widths: widths
- };
- },
-
- translateFont: function PartialEvaluator_translateFont(dict,
- xref,
- resources,
- dependency) {
- var baseDict = dict;
- var type = dict.get('Subtype');
- assertWellFormed(isName(type), 'invalid font Subtype');
-
- var composite = false;
- if (type.name == 'Type0') {
- // If font is a composite
- // - get the descendant font
- // - set the type according to the descendant font
- // - get the FontDescriptor from the descendant font
- var df = dict.get('DescendantFonts');
- if (!df)
- error('Descendant fonts are not specified');
-
- dict = isArray(df) ? xref.fetchIfRef(df[0]) : df;
-
- type = dict.get('Subtype');
- assertWellFormed(isName(type), 'invalid font Subtype');
- composite = true;
- }
- var maxCharIndex = composite ? 0xFFFF : 0xFF;
-
- var descriptor = dict.get('FontDescriptor');
- if (!descriptor) {
- if (type.name == 'Type3') {
- // FontDescriptor is only required for Type3 fonts when the document
- // is a tagged pdf. Create a barbebones one to get by.
- descriptor = new Dict();
- descriptor.set('FontName', new Name(type.name));
- } else {
- // Before PDF 1.5 if the font was one of the base 14 fonts, having a
- // FontDescriptor was not required.
- // This case is here for compatibility.
- var baseFontName = dict.get('BaseFont');
- if (!isName(baseFontName))
- error('Base font is not specified');
-
- // Using base font name as a font name.
- baseFontName = baseFontName.name.replace(/[,_]/g, '-');
- var metrics = this.getBaseFontMetrics(baseFontName);
-
- // Simulating descriptor flags attribute
- var fontNameWoStyle = baseFontName.split('-')[0];
- var flags = (serifFonts[fontNameWoStyle] ||
- (fontNameWoStyle.search(/serif/gi) != -1) ? FontFlags.Serif : 0) |
- (metrics.monospace ? FontFlags.FixedPitch : 0) |
- (symbolsFonts[fontNameWoStyle] ? FontFlags.Symbolic :
- FontFlags.Nonsymbolic);
-
- var properties = {
- type: type.name,
- widths: metrics.widths,
- defaultWidth: metrics.defaultWidth,
- flags: flags,
- firstChar: 0,
- lastChar: maxCharIndex
- };
- this.extractDataStructures(dict, dict, xref, properties);
-
- return new Font(baseFontName, null, properties);
- }
- }
-
- // According to the spec if 'FontDescriptor' is declared, 'FirstChar',
- // 'LastChar' and 'Widths' should exist too, but some PDF encoders seem
- // to ignore this rule when a variant of a standart font is used.
- // TODO Fill the width array depending on which of the base font this is
- // a variant.
- var firstChar = dict.get('FirstChar') || 0;
- var lastChar = dict.get('LastChar') || maxCharIndex;
- var fontName = descriptor.get('FontName');
- // Some bad pdf's have a string as the font name.
- if (isString(fontName))
- fontName = new Name(fontName);
- assertWellFormed(isName(fontName), 'invalid font name');
-
- var fontFile = descriptor.get('FontFile', 'FontFile2', 'FontFile3');
- if (fontFile) {
- if (fontFile.dict) {
- var subtype = fontFile.dict.get('Subtype');
- if (subtype)
- subtype = subtype.name;
-
- var length1 = fontFile.dict.get('Length1');
-
- var length2 = fontFile.dict.get('Length2');
- }
- }
-
- var properties = {
- type: type.name,
- subtype: subtype,
- file: fontFile,
- length1: length1,
- length2: length2,
- loadedName: baseDict.loadedName,
- composite: composite,
- wideChars: composite,
- fixedPitch: false,
- fontMatrix: dict.get('FontMatrix') || IDENTITY_MATRIX,
- firstChar: firstChar || 0,
- lastChar: lastChar || maxCharIndex,
- bbox: descriptor.get('FontBBox'),
- ascent: descriptor.get('Ascent'),
- descent: descriptor.get('Descent'),
- xHeight: descriptor.get('XHeight'),
- capHeight: descriptor.get('CapHeight'),
- flags: descriptor.get('Flags'),
- italicAngle: descriptor.get('ItalicAngle'),
- coded: false
- };
- this.extractWidths(dict, xref, descriptor, properties);
- this.extractDataStructures(dict, baseDict, xref, properties);
-
- if (type.name === 'Type3') {
- properties.coded = true;
- }
-
- return new Font(fontName.name, fontFile, properties);
- }
- };
-
- return PartialEvaluator;
-})();
-
-var EvalState = (function EvalStateClosure() {
- function EvalState() {
- // Are soft masks and alpha values shapes or opacities?
- this.alphaIsShape = false;
- this.fontSize = 0;
- this.textMatrix = IDENTITY_MATRIX;
- this.leading = 0;
- // Start of text line (in text coordinates)
- this.lineX = 0;
- this.lineY = 0;
- // Character and word spacing
- this.charSpacing = 0;
- this.wordSpacing = 0;
- this.textHScale = 1;
- // Color spaces
- this.fillColorSpace = null;
- this.strokeColorSpace = null;
- }
- EvalState.prototype = {
- };
- return EvalState;
-})();
-
-
-
-/**
- * Maximum time to wait for a font to be loaded by font-face rules.
- */
-var kMaxWaitForFontFace = 1000;
-
-// Unicode Private Use Area
-var kCmapGlyphOffset = 0xE000;
-var kSizeOfGlyphArea = 0x1900;
-var kSymbolicFontGlyphOffset = 0xF000;
-
-// PDF Glyph Space Units are one Thousandth of a TextSpace Unit
-// except for Type 3 fonts
-var kPDFGlyphSpaceUnits = 1000;
-
-// Until hinting is fully supported this constant can be used
-var kHintingEnabled = false;
-
-var FontFlags = {
- FixedPitch: 1,
- Serif: 2,
- Symbolic: 4,
- Script: 8,
- Nonsymbolic: 32,
- Italic: 64,
- AllCap: 65536,
- SmallCap: 131072,
- ForceBold: 262144
-};
-
-var Encodings = {
- ExpertEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
- '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
- 'space', 'exclamsmall', 'Hungarumlautsmall', '', 'dollaroldstyle',
- 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior',
- 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma',
- 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle',
- 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle',
- 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon',
- 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior',
- 'questionsmall', '', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior',
- 'esuperior', '', '', 'isuperior', '', '', 'lsuperior', 'msuperior',
- 'nsuperior', 'osuperior', '', '', 'rsuperior', 'ssuperior', 'tsuperior',
- '', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '',
- 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall',
- 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall',
- 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall',
- 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall',
- 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary',
- 'onefitted', 'rupiah', 'Tildesmall', '', '', '', '', '', '', '', '', '',
- '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
- '', '', '', '', '', '', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall',
- '', '', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall',
- 'Caronsmall', '', 'Dotaccentsmall', '', '', 'Macronsmall', '', '',
- 'figuredash', 'hypheninferior', '', '', 'Ogoneksmall', 'Ringsmall',
- 'Cedillasmall', '', '', '', 'onequarter', 'onehalf', 'threequarters',
- 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths',
- 'seveneighths', 'onethird', 'twothirds', '', '', 'zerosuperior',
- 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior',
- 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior',
- 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior',
- 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior',
- 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior',
- 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall',
- 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall',
- 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall',
- 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',
- 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall',
- 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall',
- 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',
- 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall',
- 'Ydieresissmall'],
- MacExpertEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '',
- '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
- 'space', 'exclamsmall', 'Hungarumlautsmall', 'centoldstyle',
- 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall',
- 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',
- 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle',
- 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle',
- 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle',
- 'nineoldstyle', 'colon', 'semicolon', '', 'threequartersemdash', '',
- 'questionsmall', '', '', '', '', 'Ethsmall', '', '', 'onequarter',
- 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths',
- 'seveneighths', 'onethird', 'twothirds', '', '', '', '', '', '', 'ff',
- 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior',
- 'Circumflexsmall', 'hypheninferior', 'Gravesmall', 'Asmall', 'Bsmall',
- 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall',
- 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall',
- 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',
- 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah',
- 'Tildesmall', '', '', 'asuperior', 'centsuperior', '', '', '', '',
- 'Aacutesmall', 'Agravesmall', 'Acircumflexsmall', 'Adieresissmall',
- 'Atildesmall', 'Aringsmall', 'Ccedillasmall', 'Eacutesmall', 'Egravesmall',
- 'Ecircumflexsmall', 'Edieresissmall', 'Iacutesmall', 'Igravesmall',
- 'Icircumflexsmall', 'Idieresissmall', 'Ntildesmall', 'Oacutesmall',
- 'Ogravesmall', 'Ocircumflexsmall', 'Odieresissmall', 'Otildesmall',
- 'Uacutesmall', 'Ugravesmall', 'Ucircumflexsmall', 'Udieresissmall', '',
- 'eightsuperior', 'fourinferior', 'threeinferior', 'sixinferior',
- 'eightinferior', 'seveninferior', 'Scaronsmall', '', 'centinferior',
- 'twoinferior', '', 'Dieresissmall', '', 'Caronsmall', 'osuperior',
- 'fiveinferior', '', 'commainferior', 'periodinferior', 'Yacutesmall', '',
- 'dollarinferior', '', 'Thornsmall', '', 'nineinferior', 'zeroinferior',
- 'Zcaronsmall', 'AEsmall', 'Oslashsmall', 'questiondownsmall',
- 'oneinferior', 'Lslashsmall', '', '', '', '', '', '', 'Cedillasmall', '',
- '', '', '', '', 'OEsmall', 'figuredash', 'hyphensuperior', '', '', '', '',
- 'exclamdownsmall', '', 'Ydieresissmall', '', 'onesuperior', 'twosuperior',
- 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior',
- 'sevensuperior', 'ninesuperior', 'zerosuperior', '', 'esuperior',
- 'rsuperior', 'tsuperior', '', '', 'isuperior', 'ssuperior', 'dsuperior',
- '', '', '', '', '', 'lsuperior', 'Ogoneksmall', 'Brevesmall',
- 'Macronsmall', 'bsuperior', 'nsuperior', 'msuperior', 'commasuperior',
- 'periodsuperior', 'Dotaccentsmall', 'Ringsmall'],
- MacRomanEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
- '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
- 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
- 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus',
- 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',
- 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',
- 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',
- 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
- 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
- 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
- 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
- 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', '',
- 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis',
- 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 'atilde',
- 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis',
- 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute',
- 'ograve', 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave',
- 'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling',
- 'section', 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright',
- 'trademark', 'acute', 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity',
- 'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff',
- 'summation', 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine',
- 'Omega', 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot',
- 'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft',
- 'guillemotright', 'ellipsis', '', 'Agrave', 'Atilde', 'Otilde', 'OE',
- 'oe', 'endash', 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft',
- 'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction',
- 'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl',
- 'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand',
- 'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute',
- 'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple',
- 'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex',
- 'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut',
- 'ogonek', 'caron'],
- StandardEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
- '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
- 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
- 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus',
- 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',
- 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',
- 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',
- 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
- 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
- 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f',
- 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',
- 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde',
- '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
- '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'exclamdown',
- 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
- 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
- 'guilsinglright', 'fi', 'fl', '', 'endash', 'dagger', 'daggerdbl',
- 'periodcentered', '', 'paragraph', 'bullet', 'quotesinglbase',
- 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis',
- 'perthousand', '', 'questiondown', '', 'grave', 'acute', 'circumflex',
- 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', '', 'ring', 'cedilla',
- '', 'hungarumlaut', 'ogonek', 'caron', 'emdash', '', '', '', '', '', '',
- '', '', '', '', '', '', '', '', '', '', 'AE', '', 'ordfeminine', '', '',
- '', '', 'Lslash', 'Oslash', 'OE', 'ordmasculine', '', '', '', '', '', 'ae',
- '', '', '', 'dotlessi', '', '', 'lslash', 'oslash', 'oe', 'germandbls'],
- WinAnsiEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
- '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
- 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
- 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus',
- 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',
- 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',
- 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',
- 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
- 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
- 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
- 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
- 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde',
- 'bullet', 'Euro', 'bullet', 'quotesinglbase', 'florin', 'quotedblbase',
- 'ellipsis', 'dagger', 'daggerdbl', 'circumflex', 'perthousand', 'Scaron',
- 'guilsinglleft', 'OE', 'bullet', 'Zcaron', 'bullet', 'bullet', 'quoteleft',
- 'quoteright', 'quotedblleft', 'quotedblright', 'bullet', 'endash',
- 'emdash', 'tilde', 'trademark', 'scaron', 'guilsinglright', 'oe', 'bullet',
- 'zcaron', 'Ydieresis', '', 'exclamdown', 'cent', 'sterling',
- 'currency', 'yen', 'brokenbar', 'section', 'dieresis', 'copyright',
- 'ordfeminine', 'guillemotleft', 'logicalnot', 'hyphen', 'registered',
- 'macron', 'degree', 'plusminus', 'twosuperior', 'threesuperior', 'acute',
- 'mu', 'paragraph', 'periodcentered', 'cedilla', 'onesuperior',
- 'ordmasculine', 'guillemotright', 'onequarter', 'onehalf', 'threequarters',
- 'questiondown', 'Agrave', 'Aacute', 'Acircumflex', 'Atilde', 'Adieresis',
- 'Aring', 'AE', 'Ccedilla', 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis',
- 'Igrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Eth', 'Ntilde', 'Ograve',
- 'Oacute', 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', 'Oslash',
- 'Ugrave', 'Uacute', 'Ucircumflex', 'Udieresis', 'Yacute', 'Thorn',
- 'germandbls', 'agrave', 'aacute', 'acircumflex', 'atilde', 'adieresis',
- 'aring', 'ae', 'ccedilla', 'egrave', 'eacute', 'ecircumflex', 'edieresis',
- 'igrave', 'iacute', 'icircumflex', 'idieresis', 'eth', 'ntilde', 'ograve',
- 'oacute', 'ocircumflex', 'otilde', 'odieresis', 'divide', 'oslash',
- 'ugrave', 'uacute', 'ucircumflex', 'udieresis', 'yacute', 'thorn',
- 'ydieresis'],
- symbolsEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
- '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
- 'space', 'exclam', 'universal', 'numbersign', 'existential', 'percent',
- 'ampersand', 'suchthat', 'parenleft', 'parenright', 'asteriskmath', 'plus',
- 'comma', 'minus', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four',
- 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',
- 'equal', 'greater', 'question', 'congruent', 'Alpha', 'Beta', 'Chi',
- 'Delta', 'Epsilon', 'Phi', 'Gamma', 'Eta', 'Iota', 'theta1', 'Kappa',
- 'Lambda', 'Mu', 'Nu', 'Omicron', 'Pi', 'Theta', 'Rho', 'Sigma', 'Tau',
- 'Upsilon', 'sigma1', 'Omega', 'Xi', 'Psi', 'Zeta', 'bracketleft',
- 'therefore', 'bracketright', 'perpendicular', 'underscore', 'radicalex',
- 'alpha', 'beta', 'chi', 'delta', 'epsilon', 'phi', 'gamma', 'eta', 'iota',
- 'phi1', 'kappa', 'lambda', 'mu', 'nu', 'omicron', 'pi', 'theta', 'rho',
- 'sigma', 'tau', 'upsilon', 'omega1', 'omega', 'xi', 'psi', 'zeta',
- 'braceleft', 'bar', 'braceright', 'similar', '', '', '', '', '', '', '',
- '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
- '', '', '', '', '', '', '', 'Euro', 'Upsilon1', 'minute', 'lessequal',
- 'fraction', 'infinity', 'florin', 'club', 'diamond', 'heart', 'spade',
- 'arrowboth', 'arrowleft', 'arrowup', 'arrowright', 'arrowdown', 'degree',
- 'plusminus', 'second', 'greaterequal', 'multiply', 'proportional',
- 'partialdiff', 'bullet', 'divide', 'notequal', 'equivalence',
- 'approxequal', 'ellipsis', 'arrowvertex', 'arrowhorizex', 'carriagereturn',
- 'aleph', 'Ifraktur', 'Rfraktur', 'weierstrass', 'circlemultiply',
- 'circleplus', 'emptyset', 'intersection', 'union', 'propersuperset',
- 'reflexsuperset', 'notsubset', 'propersubset', 'reflexsubset', 'element',
- 'notelement', 'angle', 'gradient', 'registerserif', 'copyrightserif',
- 'trademarkserif', 'product', 'radical', 'dotmath', 'logicalnot',
- 'logicaland', 'logicalor', 'arrowdblboth', 'arrowdblleft', 'arrowdblup',
- 'arrowdblright', 'arrowdbldown', 'lozenge', 'angleleft', 'registersans',
- 'copyrightsans', 'trademarksans', 'summation', 'parenlefttp',
- 'parenleftex', 'parenleftbt', 'bracketlefttp', 'bracketleftex',
- 'bracketleftbt', 'bracelefttp', 'braceleftmid', 'braceleftbt', 'braceex',
- '', 'angleright', 'integral', 'integraltp', 'integralex', 'integralbt',
- 'parenrighttp', 'parenrightex', 'parenrightbt', 'bracketrighttp',
- 'bracketrightex', 'bracketrightbt', 'bracerighttp', 'bracerightmid',
- 'bracerightbt'],
- zapfDingbatsEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '',
- '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
- 'space', 'a1', 'a2', 'a202', 'a3', 'a4', 'a5', 'a119', 'a118', 'a117',
- 'a11', 'a12', 'a13', 'a14', 'a15', 'a16', 'a105', 'a17', 'a18', 'a19',
- 'a20', 'a21', 'a22', 'a23', 'a24', 'a25', 'a26', 'a27', 'a28', 'a6', 'a7',
- 'a8', 'a9', 'a10', 'a29', 'a30', 'a31', 'a32', 'a33', 'a34', 'a35', 'a36',
- 'a37', 'a38', 'a39', 'a40', 'a41', 'a42', 'a43', 'a44', 'a45', 'a46',
- 'a47', 'a48', 'a49', 'a50', 'a51', 'a52', 'a53', 'a54', 'a55', 'a56',
- 'a57', 'a58', 'a59', 'a60', 'a61', 'a62', 'a63', 'a64', 'a65', 'a66',
- 'a67', 'a68', 'a69', 'a70', 'a71', 'a72', 'a73', 'a74', 'a203', 'a75',
- 'a204', 'a76', 'a77', 'a78', 'a79', 'a81', 'a82', 'a83', 'a84', 'a97',
- 'a98', 'a99', 'a100', '', '', '', '', '', '', '', '', '', '', '', '', '',
- '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
- '', '', 'a101', 'a102', 'a103', 'a104', 'a106', 'a107', 'a108', 'a112',
- 'a111', 'a110', 'a109', 'a120', 'a121', 'a122', 'a123', 'a124', 'a125',
- 'a126', 'a127', 'a128', 'a129', 'a130', 'a131', 'a132', 'a133', 'a134',
- 'a135', 'a136', 'a137', 'a138', 'a139', 'a140', 'a141', 'a142', 'a143',
- 'a144', 'a145', 'a146', 'a147', 'a148', 'a149', 'a150', 'a151', 'a152',
- 'a153', 'a154', 'a155', 'a156', 'a157', 'a158', 'a159', 'a160', 'a161',
- 'a163', 'a164', 'a196', 'a165', 'a192', 'a166', 'a167', 'a168', 'a169',
- 'a170', 'a171', 'a172', 'a173', 'a162', 'a174', 'a175', 'a176', 'a177',
- 'a178', 'a179', 'a193', 'a180', 'a199', 'a181', 'a200', 'a182', '', 'a201',
- 'a183', 'a184', 'a197', 'a185', 'a194', 'a198', 'a186', 'a195', 'a187',
- 'a188', 'a189', 'a190', 'a191']
-};
-
-/**
- * Hold a map of decoded fonts and of the standard fourteen Type1
- * fonts and their acronyms.
- */
-var stdFontMap = {
- 'ArialNarrow': 'Helvetica',
- 'ArialNarrow-Bold': 'Helvetica-Bold',
- 'ArialNarrow-BoldItalic': 'Helvetica-BoldOblique',
- 'ArialNarrow-Italic': 'Helvetica-Oblique',
- 'ArialBlack': 'Helvetica',
- 'ArialBlack-Bold': 'Helvetica-Bold',
- 'ArialBlack-BoldItalic': 'Helvetica-BoldOblique',
- 'ArialBlack-Italic': 'Helvetica-Oblique',
- 'Arial': 'Helvetica',
- 'Arial-Bold': 'Helvetica-Bold',
- 'Arial-BoldItalic': 'Helvetica-BoldOblique',
- 'Arial-Italic': 'Helvetica-Oblique',
- 'Arial-BoldItalicMT': 'Helvetica-BoldOblique',
- 'Arial-BoldMT': 'Helvetica-Bold',
- 'Arial-ItalicMT': 'Helvetica-Oblique',
- 'ArialMT': 'Helvetica',
- 'Courier-Bold': 'Courier-Bold',
- 'Courier-BoldItalic': 'Courier-BoldOblique',
- 'Courier-Italic': 'Courier-Oblique',
- 'CourierNew': 'Courier',
- 'CourierNew-Bold': 'Courier-Bold',
- 'CourierNew-BoldItalic': 'Courier-BoldOblique',
- 'CourierNew-Italic': 'Courier-Oblique',
- 'CourierNewPS-BoldItalicMT': 'Courier-BoldOblique',
- 'CourierNewPS-BoldMT': 'Courier-Bold',
- 'CourierNewPS-ItalicMT': 'Courier-Oblique',
- 'CourierNewPSMT': 'Courier',
- 'Helvetica-Bold': 'Helvetica-Bold',
- 'Helvetica-BoldItalic': 'Helvetica-BoldOblique',
- 'Helvetica-Italic': 'Helvetica-Oblique',
- 'Symbol-Bold': 'Symbol',
- 'Symbol-BoldItalic': 'Symbol',
- 'Symbol-Italic': 'Symbol',
- 'TimesNewRoman': 'Times-Roman',
- 'TimesNewRoman-Bold': 'Times-Bold',
- 'TimesNewRoman-BoldItalic': 'Times-BoldItalic',
- 'TimesNewRoman-Italic': 'Times-Italic',
- 'TimesNewRomanPS': 'Times-Roman',
- 'TimesNewRomanPS-Bold': 'Times-Bold',
- 'TimesNewRomanPS-BoldItalic': 'Times-BoldItalic',
- 'TimesNewRomanPS-BoldItalicMT': 'Times-BoldItalic',
- 'TimesNewRomanPS-BoldMT': 'Times-Bold',
- 'TimesNewRomanPS-Italic': 'Times-Italic',
- 'TimesNewRomanPS-ItalicMT': 'Times-Italic',
- 'TimesNewRomanPSMT': 'Times-Roman',
- 'TimesNewRomanPSMT-Bold': 'Times-Bold',
- 'TimesNewRomanPSMT-BoldItalic': 'Times-BoldItalic',
- 'TimesNewRomanPSMT-Italic': 'Times-Italic'
-};
-
-/**
- * Holds the map of the non-standard fonts that might be included as a standard
- * fonts without glyph data.
- */
-var nonStdFontMap = {
- 'ComicSansMS': 'Comic Sans MS',
- 'ComicSansMS-Bold': 'Comic Sans MS-Bold',
- 'ComicSansMS-BoldItalic': 'Comic Sans MS-BoldItalic',
- 'ComicSansMS-Italic': 'Comic Sans MS-Italic',
- 'LucidaConsole': 'Courier',
- 'LucidaConsole-Bold': 'Courier-Bold',
- 'LucidaConsole-BoldItalic': 'Courier-BoldOblique',
- 'LucidaConsole-Italic': 'Courier-Oblique'
-};
-
-var serifFonts = {
- 'Adobe Jenson': true, 'Adobe Text': true, 'Albertus': true,
- 'Aldus': true, 'Alexandria': true, 'Algerian': true,
- 'American Typewriter': true, 'Antiqua': true, 'Apex': true,
- 'Arno': true, 'Aster': true, 'Aurora': true,
- 'Baskerville': true, 'Bell': true, 'Bembo': true,
- 'Bembo Schoolbook': true, 'Benguiat': true, 'Berkeley Old Style': true,
- 'Bernhard Modern': true, 'Berthold City': true, 'Bodoni': true,
- 'Bauer Bodoni': true, 'Book Antiqua': true, 'Bookman': true,
- 'Bordeaux Roman': true, 'Californian FB': true, 'Calisto': true,
- 'Calvert': true, 'Capitals': true, 'Cambria': true,
- 'Cartier': true, 'Caslon': true, 'Catull': true,
- 'Centaur': true, 'Century Old Style': true, 'Century Schoolbook': true,
- 'Chaparral': true, 'Charis SIL': true, 'Cheltenham': true,
- 'Cholla Slab': true, 'Clarendon': true, 'Clearface': true,
- 'Cochin': true, 'Colonna': true, 'Computer Modern': true,
- 'Concrete Roman': true, 'Constantia': true, 'Cooper Black': true,
- 'Corona': true, 'Ecotype': true, 'Egyptienne': true,
- 'Elephant': true, 'Excelsior': true, 'Fairfield': true,
- 'FF Scala': true, 'Folkard': true, 'Footlight': true,
- 'FreeSerif': true, 'Friz Quadrata': true, 'Garamond': true,
- 'Gentium': true, 'Georgia': true, 'Gloucester': true,
- 'Goudy Old Style': true, 'Goudy Schoolbook': true, 'Goudy Pro Font': true,
- 'Granjon': true, 'Guardian Egyptian': true, 'Heather': true,
- 'Hercules': true, 'High Tower Text': true, 'Hiroshige': true,
- 'Hoefler Text': true, 'Humana Serif': true, 'Imprint': true,
- 'Ionic No. 5': true, 'Janson': true, 'Joanna': true,
- 'Korinna': true, 'Lexicon': true, 'Liberation Serif': true,
- 'Linux Libertine': true, 'Literaturnaya': true, 'Lucida': true,
- 'Lucida Bright': true, 'Melior': true, 'Memphis': true,
- 'Miller': true, 'Minion': true, 'Modern': true,
- 'Mona Lisa': true, 'Mrs Eaves': true, 'MS Serif': true,
- 'Museo Slab': true, 'New York': true, 'Nimbus Roman': true,
- 'NPS Rawlinson Roadway': true, 'Palatino': true, 'Perpetua': true,
- 'Plantin': true, 'Plantin Schoolbook': true, 'Playbill': true,
- 'Poor Richard': true, 'Rawlinson Roadway': true, 'Renault': true,
- 'Requiem': true, 'Rockwell': true, 'Roman': true,
- 'Rotis Serif': true, 'Sabon': true, 'Scala': true,
- 'Seagull': true, 'Sistina': true, 'Souvenir': true,
- 'STIX': true, 'Stone Informal': true, 'Stone Serif': true,
- 'Sylfaen': true, 'Times': true, 'Trajan': true,
- 'Trinité': true, 'Trump Mediaeval': true, 'Utopia': true,
- 'Vale Type': true, 'Bitstream Vera': true, 'Vera Serif': true,
- 'Versailles': true, 'Wanted': true, 'Weiss': true,
- 'Wide Latin': true, 'Windsor': true, 'XITS': true
-};
-
-var symbolsFonts = {
- 'Dingbats': true, 'Symbol': true, 'ZapfDingbats': true
-};
-
-// Some characters, e.g. copyrightserif, mapped to the private use area and
-// might not be displayed using standard fonts. Mapping/hacking well-known chars
-// to the similar equivalents in the normal characters range.
-function mapPrivateUseChars(code) {
- switch (code) {
- case 0xF8E9: // copyrightsans
- case 0xF6D9: // copyrightserif
- return 0x00A9; // copyright
- default:
- return code;
- }
-}
-
-var FontLoader = {
- loadingContext: {
- requests: [],
- nextRequestId: 0
- },
-
- isSyncFontLoadingSupported: (function detectSyncFontLoadingSupport() {
- if (isWorker)
- return false;
-
- // User agent string sniffing is bad, but there is no reliable way to tell
- // if font is fully loaded and ready to be used with canvas.
- var userAgent = window.navigator.userAgent;
- var m = /Mozilla\/5.0.*?rv:(\d+).*? Gecko/.exec(userAgent);
- if (m && m[1] >= 14)
- return true;
- // TODO other browsers
- return false;
- })(),
-
- bind: function fontLoaderBind(fonts, callback) {
- assert(!isWorker, 'bind() shall be called from main thread');
-
- var rules = [], fontsToLoad = [];
- for (var i = 0, ii = fonts.length; i < ii; i++) {
- var font = fonts[i];
-
- // Add the font to the DOM only once or skip if the font
- // is already loaded.
- if (font.attached || font.loading == false) {
- continue;
- }
- font.attached = true;
-
- var rule = font.bindDOM();
- if (rule) {
- rules.push(rule);
- fontsToLoad.push(font);
- }
- }
-
- var request = FontLoader.queueLoadingCallback(callback);
- if (rules.length > 0 && !this.isSyncFontLoadingSupported) {
- FontLoader.prepareFontLoadEvent(rules, fontsToLoad, request);
- } else {
- request.complete();
- }
- },
-
- queueLoadingCallback: function FontLoader_queueLoadingCallback(callback) {
- function LoadLoader_completeRequest() {
- assert(!request.end, 'completeRequest() cannot be called twice');
- request.end = Date.now();
-
- // sending all completed requests in order how they were queued
- while (context.requests.length > 0 && context.requests[0].end) {
- var otherRequest = context.requests.shift();
- setTimeout(otherRequest.callback, 0);
- }
- }
-
- var context = FontLoader.loadingContext;
- var requestId = 'pdfjs-font-loading-' + (context.nextRequestId++);
- var request = {
- id: requestId,
- complete: LoadLoader_completeRequest,
- callback: callback,
- started: Date.now()
- };
- context.requests.push(request);
- return request;
- },
-
- // Set things up so that at least one pdfjsFontLoad event is
- // dispatched when all the @font-face |rules| for |fonts| have been
- // loaded in a subdocument. It's expected that the load of |rules|
- // has already started in this (outer) document, so that they should
- // be ordered before the load in the subdocument.
- prepareFontLoadEvent: function fontLoaderPrepareFontLoadEvent(rules,
- fonts,
- request) {
- /** Hack begin */
- // There's no event when a font has finished downloading so the
- // following code is a dirty hack to 'guess' when a font is
- // ready. This code will be obsoleted by Mozilla bug 471915.
- //
- // The only reliable way to know if a font is loaded in Gecko
- // (at the moment) is document.onload in a document with
- // a @font-face rule defined in a "static" stylesheet. We use a
- // subdocument in an <iframe>, set up properly, to know when
- // our @font-face rule was loaded. However, the subdocument and
- // outer document can't share CSS rules, so the inner document
- // is only part of the puzzle. The second piece is an invisible
- // div created in order to force loading of the @font-face in
- // the *outer* document. (The font still needs to be loaded for
- // its metrics, for reflow). We create the div first for the
- // outer document, then create the iframe. Unless something
- // goes really wonkily, we expect the @font-face for the outer
- // document to be processed before the inner. That's still
- // fragile, but seems to work in practice.
- //
- // The postMessage() hackery was added to work around chrome bug
- // 82402.
-
- var requestId = request.id;
- // Validate the requestId parameter -- the value used to construct HTML.
- if (!/^[\w\-]+$/.test(requestId)) {
- error('Invalid request id: ' + requestId);
-
- // Normally the error-function throws. But if a malicious code
- // intercepts the function call then the return is needed.
- return;
- }
-
- var names = [];
- for (var i = 0, ii = fonts.length; i < ii; i++)
- names.push(fonts[i].loadedName);
-
- // Validate the names parameter -- the values can used to construct HTML.
- if (!/^\w+$/.test(names.join(''))) {
- error('Invalid font name(s): ' + names.join());
-
- // Normally the error-function throws. But if a malicious code
- // intercepts the function call then the return is needed.
- return;
- }
-
- var div = document.createElement('div');
- div.setAttribute('style',
- 'visibility: hidden;' +
- 'width: 10px; height: 10px;' +
- 'position: absolute; top: 0px; left: 0px;');
- var html = '';
- for (var i = 0, ii = names.length; i < ii; ++i) {
- html += '<span style="font-family:' + names[i] + '">Hi</span>';
- }
- div.innerHTML = html;
- document.body.appendChild(div);
-
- window.addEventListener(
- 'message',
- function fontLoaderMessage(e) {
- if (e.data !== requestId)
- return;
- for (var i = 0, ii = fonts.length; i < ii; ++i) {
- var font = fonts[i];
- font.loading = false;
- }
- request.complete();
- // cleanup
- document.body.removeChild(frame);
- window.removeEventListener('message', fontLoaderMessage, false);
- },
- false);
-
- // XXX we should have a time-out here too, and maybe fire
- // pdfjsFontLoadFailed?
- var src = '<!DOCTYPE HTML><html><head><meta charset="utf-8">';
- src += '<style type="text/css">';
- for (var i = 0, ii = rules.length; i < ii; ++i) {
- src += rules[i];
- }
- src += '</style>';
- src += '<script type="application/javascript">';
- src += ' window.onload = function fontLoaderOnload() {\n';
- src += ' parent.postMessage("' + requestId + '", "*");\n';
- // Chrome stuck on loading (see chrome issue 145227) - resetting url
- src += ' window.location = "about:blank";\n';
- src += ' }';
- // Hack so the end script tag isn't counted if this is inline JS.
- src += '</scr' + 'ipt></head><body>';
- for (var i = 0, ii = names.length; i < ii; ++i) {
- src += '<p style="font-family:\'' + names[i] + '\'">Hi</p>';
- }
- src += '</body></html>';
- var frame = document.createElement('iframe');
- frame.src = 'data:text/html,' + src;
- frame.setAttribute('style',
- 'visibility: hidden;' +
- 'width: 10px; height: 10px;' +
- 'position: absolute; top: 0px; left: 0px;');
- document.body.appendChild(frame);
- /** Hack end */
- }
-};
-
-var UnicodeRanges = [
- { 'begin': 0x0000, 'end': 0x007F }, // Basic Latin
- { 'begin': 0x0080, 'end': 0x00FF }, // Latin-1 Supplement
- { 'begin': 0x0100, 'end': 0x017F }, // Latin Extended-A
- { 'begin': 0x0180, 'end': 0x024F }, // Latin Extended-B
- { 'begin': 0x0250, 'end': 0x02AF }, // IPA Extensions
- { 'begin': 0x02B0, 'end': 0x02FF }, // Spacing Modifier Letters
- { 'begin': 0x0300, 'end': 0x036F }, // Combining Diacritical Marks
- { 'begin': 0x0370, 'end': 0x03FF }, // Greek and Coptic
- { 'begin': 0x2C80, 'end': 0x2CFF }, // Coptic
- { 'begin': 0x0400, 'end': 0x04FF }, // Cyrillic
- { 'begin': 0x0530, 'end': 0x058F }, // Armenian
- { 'begin': 0x0590, 'end': 0x05FF }, // Hebrew
- { 'begin': 0xA500, 'end': 0xA63F }, // Vai
- { 'begin': 0x0600, 'end': 0x06FF }, // Arabic
- { 'begin': 0x07C0, 'end': 0x07FF }, // NKo
- { 'begin': 0x0900, 'end': 0x097F }, // Devanagari
- { 'begin': 0x0980, 'end': 0x09FF }, // Bengali
- { 'begin': 0x0A00, 'end': 0x0A7F }, // Gurmukhi
- { 'begin': 0x0A80, 'end': 0x0AFF }, // Gujarati
- { 'begin': 0x0B00, 'end': 0x0B7F }, // Oriya
- { 'begin': 0x0B80, 'end': 0x0BFF }, // Tamil
- { 'begin': 0x0C00, 'end': 0x0C7F }, // Telugu
- { 'begin': 0x0C80, 'end': 0x0CFF }, // Kannada
- { 'begin': 0x0D00, 'end': 0x0D7F }, // Malayalam
- { 'begin': 0x0E00, 'end': 0x0E7F }, // Thai
- { 'begin': 0x0E80, 'end': 0x0EFF }, // Lao
- { 'begin': 0x10A0, 'end': 0x10FF }, // Georgian
- { 'begin': 0x1B00, 'end': 0x1B7F }, // Balinese
- { 'begin': 0x1100, 'end': 0x11FF }, // Hangul Jamo
- { 'begin': 0x1E00, 'end': 0x1EFF }, // Latin Extended Additional
- { 'begin': 0x1F00, 'end': 0x1FFF }, // Greek Extended
- { 'begin': 0x2000, 'end': 0x206F }, // General Punctuation
- { 'begin': 0x2070, 'end': 0x209F }, // Superscripts And Subscripts
- { 'begin': 0x20A0, 'end': 0x20CF }, // Currency Symbol
- { 'begin': 0x20D0, 'end': 0x20FF }, // Combining Diacritical Marks For Symbols
- { 'begin': 0x2100, 'end': 0x214F }, // Letterlike Symbols
- { 'begin': 0x2150, 'end': 0x218F }, // Number Forms
- { 'begin': 0x2190, 'end': 0x21FF }, // Arrows
- { 'begin': 0x2200, 'end': 0x22FF }, // Mathematical Operators
- { 'begin': 0x2300, 'end': 0x23FF }, // Miscellaneous Technical
- { 'begin': 0x2400, 'end': 0x243F }, // Control Pictures
- { 'begin': 0x2440, 'end': 0x245F }, // Optical Character Recognition
- { 'begin': 0x2460, 'end': 0x24FF }, // Enclosed Alphanumerics
- { 'begin': 0x2500, 'end': 0x257F }, // Box Drawing
- { 'begin': 0x2580, 'end': 0x259F }, // Block Elements
- { 'begin': 0x25A0, 'end': 0x25FF }, // Geometric Shapes
- { 'begin': 0x2600, 'end': 0x26FF }, // Miscellaneous Symbols
- { 'begin': 0x2700, 'end': 0x27BF }, // Dingbats
- { 'begin': 0x3000, 'end': 0x303F }, // CJK Symbols And Punctuation
- { 'begin': 0x3040, 'end': 0x309F }, // Hiragana
- { 'begin': 0x30A0, 'end': 0x30FF }, // Katakana
- { 'begin': 0x3100, 'end': 0x312F }, // Bopomofo
- { 'begin': 0x3130, 'end': 0x318F }, // Hangul Compatibility Jamo
- { 'begin': 0xA840, 'end': 0xA87F }, // Phags-pa
- { 'begin': 0x3200, 'end': 0x32FF }, // Enclosed CJK Letters And Months
- { 'begin': 0x3300, 'end': 0x33FF }, // CJK Compatibility
- { 'begin': 0xAC00, 'end': 0xD7AF }, // Hangul Syllables
- { 'begin': 0xD800, 'end': 0xDFFF }, // Non-Plane 0 *
- { 'begin': 0x10900, 'end': 0x1091F }, // Phoenicia
- { 'begin': 0x4E00, 'end': 0x9FFF }, // CJK Unified Ideographs
- { 'begin': 0xE000, 'end': 0xF8FF }, // Private Use Area (plane 0)
- { 'begin': 0x31C0, 'end': 0x31EF }, // CJK Strokes
- { 'begin': 0xFB00, 'end': 0xFB4F }, // Alphabetic Presentation Forms
- { 'begin': 0xFB50, 'end': 0xFDFF }, // Arabic Presentation Forms-A
- { 'begin': 0xFE20, 'end': 0xFE2F }, // Combining Half Marks
- { 'begin': 0xFE10, 'end': 0xFE1F }, // Vertical Forms
- { 'begin': 0xFE50, 'end': 0xFE6F }, // Small Form Variants
- { 'begin': 0xFE70, 'end': 0xFEFF }, // Arabic Presentation Forms-B
- { 'begin': 0xFF00, 'end': 0xFFEF }, // Halfwidth And Fullwidth Forms
- { 'begin': 0xFFF0, 'end': 0xFFFF }, // Specials
- { 'begin': 0x0F00, 'end': 0x0FFF }, // Tibetan
- { 'begin': 0x0700, 'end': 0x074F }, // Syriac
- { 'begin': 0x0780, 'end': 0x07BF }, // Thaana
- { 'begin': 0x0D80, 'end': 0x0DFF }, // Sinhala
- { 'begin': 0x1000, 'end': 0x109F }, // Myanmar
- { 'begin': 0x1200, 'end': 0x137F }, // Ethiopic
- { 'begin': 0x13A0, 'end': 0x13FF }, // Cherokee
- { 'begin': 0x1400, 'end': 0x167F }, // Unified Canadian Aboriginal Syllabics
- { 'begin': 0x1680, 'end': 0x169F }, // Ogham
- { 'begin': 0x16A0, 'end': 0x16FF }, // Runic
- { 'begin': 0x1780, 'end': 0x17FF }, // Khmer
- { 'begin': 0x1800, 'end': 0x18AF }, // Mongolian
- { 'begin': 0x2800, 'end': 0x28FF }, // Braille Patterns
- { 'begin': 0xA000, 'end': 0xA48F }, // Yi Syllables
- { 'begin': 0x1700, 'end': 0x171F }, // Tagalog
- { 'begin': 0x10300, 'end': 0x1032F }, // Old Italic
- { 'begin': 0x10330, 'end': 0x1034F }, // Gothic
- { 'begin': 0x10400, 'end': 0x1044F }, // Deseret
- { 'begin': 0x1D000, 'end': 0x1D0FF }, // Byzantine Musical Symbols
- { 'begin': 0x1D400, 'end': 0x1D7FF }, // Mathematical Alphanumeric Symbols
- { 'begin': 0xFF000, 'end': 0xFFFFD }, // Private Use (plane 15)
- { 'begin': 0xFE00, 'end': 0xFE0F }, // Variation Selectors
- { 'begin': 0xE0000, 'end': 0xE007F }, // Tags
- { 'begin': 0x1900, 'end': 0x194F }, // Limbu
- { 'begin': 0x1950, 'end': 0x197F }, // Tai Le
- { 'begin': 0x1980, 'end': 0x19DF }, // New Tai Lue
- { 'begin': 0x1A00, 'end': 0x1A1F }, // Buginese
- { 'begin': 0x2C00, 'end': 0x2C5F }, // Glagolitic
- { 'begin': 0x2D30, 'end': 0x2D7F }, // Tifinagh
- { 'begin': 0x4DC0, 'end': 0x4DFF }, // Yijing Hexagram Symbols
- { 'begin': 0xA800, 'end': 0xA82F }, // Syloti Nagri
- { 'begin': 0x10000, 'end': 0x1007F }, // Linear B Syllabary
- { 'begin': 0x10140, 'end': 0x1018F }, // Ancient Greek Numbers
- { 'begin': 0x10380, 'end': 0x1039F }, // Ugaritic
- { 'begin': 0x103A0, 'end': 0x103DF }, // Old Persian
- { 'begin': 0x10450, 'end': 0x1047F }, // Shavian
- { 'begin': 0x10480, 'end': 0x104AF }, // Osmanya
- { 'begin': 0x10800, 'end': 0x1083F }, // Cypriot Syllabary
- { 'begin': 0x10A00, 'end': 0x10A5F }, // Kharoshthi
- { 'begin': 0x1D300, 'end': 0x1D35F }, // Tai Xuan Jing Symbols
- { 'begin': 0x12000, 'end': 0x123FF }, // Cuneiform
- { 'begin': 0x1D360, 'end': 0x1D37F }, // Counting Rod Numerals
- { 'begin': 0x1B80, 'end': 0x1BBF }, // Sundanese
- { 'begin': 0x1C00, 'end': 0x1C4F }, // Lepcha
- { 'begin': 0x1C50, 'end': 0x1C7F }, // Ol Chiki
- { 'begin': 0xA880, 'end': 0xA8DF }, // Saurashtra
- { 'begin': 0xA900, 'end': 0xA92F }, // Kayah Li
- { 'begin': 0xA930, 'end': 0xA95F }, // Rejang
- { 'begin': 0xAA00, 'end': 0xAA5F }, // Cham
- { 'begin': 0x10190, 'end': 0x101CF }, // Ancient Symbols
- { 'begin': 0x101D0, 'end': 0x101FF }, // Phaistos Disc
- { 'begin': 0x102A0, 'end': 0x102DF }, // Carian
- { 'begin': 0x1F030, 'end': 0x1F09F } // Domino Tiles
-];
-
-var MacStandardGlyphOrdering = [
- '.notdef', '.null', 'nonmarkingreturn', 'space', 'exclam', 'quotedbl',
- 'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft',
- 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash',
- 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',
- 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at',
- 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
- 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft',
- 'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b',
- 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',
- 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright',
- 'asciitilde', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde',
- 'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis',
- 'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis',
- 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve',
- 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex',
- 'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet',
- 'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute',
- 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal',
- 'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi',
- 'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash',
- 'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin',
- 'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis',
- 'nonbreakingspace', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash',
- 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright',
- 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency',
- 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered',
- 'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex',
- 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex',
- 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute',
- 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron',
- 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron',
- 'Lslash', 'lslash', 'Scaron', 'scaron', 'Zcaron', 'zcaron', 'brokenbar',
- 'Eth', 'eth', 'Yacute', 'yacute', 'Thorn', 'thorn', 'minus', 'multiply',
- 'onesuperior', 'twosuperior', 'threesuperior', 'onehalf', 'onequarter',
- 'threequarters', 'franc', 'Gbreve', 'gbreve', 'Idotaccent', 'Scedilla',
- 'scedilla', 'Cacute', 'cacute', 'Ccaron', 'ccaron', 'dcroat'];
-
-function getUnicodeRangeFor(value) {
- for (var i = 0, ii = UnicodeRanges.length; i < ii; i++) {
- var range = UnicodeRanges[i];
- if (value >= range.begin && value < range.end)
- return i;
- }
- return -1;
-}
-
-function isRTLRangeFor(value) {
- var range = UnicodeRanges[13];
- if (value >= range.begin && value < range.end)
- return true;
- range = UnicodeRanges[11];
- if (value >= range.begin && value < range.end)
- return true;
- return false;
-}
-
-function isSpecialUnicode(unicode) {
- return (unicode <= 0x1F || (unicode >= 127 && unicode < kSizeOfGlyphArea)) ||
- (unicode >= kCmapGlyphOffset &&
- unicode < kCmapGlyphOffset + kSizeOfGlyphArea);
-}
-
-// The normalization table is obtained by filtering the Unicode characters
-// database with <compat> entries.
-var NormalizedUnicodes = {
- '\u00A8': '\u0020\u0308',
- '\u00AF': '\u0020\u0304',
- '\u00B4': '\u0020\u0301',
- '\u00B5': '\u03BC',
- '\u00B8': '\u0020\u0327',
- '\u0132': '\u0049\u004A',
- '\u0133': '\u0069\u006A',
- '\u013F': '\u004C\u00B7',
- '\u0140': '\u006C\u00B7',
- '\u0149': '\u02BC\u006E',
- '\u017F': '\u0073',
- '\u01C4': '\u0044\u017D',
- '\u01C5': '\u0044\u017E',
- '\u01C6': '\u0064\u017E',
- '\u01C7': '\u004C\u004A',
- '\u01C8': '\u004C\u006A',
- '\u01C9': '\u006C\u006A',
- '\u01CA': '\u004E\u004A',
- '\u01CB': '\u004E\u006A',
- '\u01CC': '\u006E\u006A',
- '\u01F1': '\u0044\u005A',
- '\u01F2': '\u0044\u007A',
- '\u01F3': '\u0064\u007A',
- '\u02D8': '\u0020\u0306',
- '\u02D9': '\u0020\u0307',
- '\u02DA': '\u0020\u030A',
- '\u02DB': '\u0020\u0328',
- '\u02DC': '\u0020\u0303',
- '\u02DD': '\u0020\u030B',
- '\u037A': '\u0020\u0345',
- '\u0384': '\u0020\u0301',
- '\u03D0': '\u03B2',
- '\u03D1': '\u03B8',
- '\u03D2': '\u03A5',
- '\u03D5': '\u03C6',
- '\u03D6': '\u03C0',
- '\u03F0': '\u03BA',
- '\u03F1': '\u03C1',
- '\u03F2': '\u03C2',
- '\u03F4': '\u0398',
- '\u03F5': '\u03B5',
- '\u03F9': '\u03A3',
- '\u0587': '\u0565\u0582',
- '\u0675': '\u0627\u0674',
- '\u0676': '\u0648\u0674',
- '\u0677': '\u06C7\u0674',
- '\u0678': '\u064A\u0674',
- '\u0E33': '\u0E4D\u0E32',
- '\u0EB3': '\u0ECD\u0EB2',
- '\u0EDC': '\u0EAB\u0E99',
- '\u0EDD': '\u0EAB\u0EA1',
- '\u0F77': '\u0FB2\u0F81',
- '\u0F79': '\u0FB3\u0F81',
- '\u1E9A': '\u0061\u02BE',
- '\u1FBD': '\u0020\u0313',
- '\u1FBF': '\u0020\u0313',
- '\u1FC0': '\u0020\u0342',
- '\u1FFE': '\u0020\u0314',
- '\u2002': '\u0020',
- '\u2003': '\u0020',
- '\u2004': '\u0020',
- '\u2005': '\u0020',
- '\u2006': '\u0020',
- '\u2008': '\u0020',
- '\u2009': '\u0020',
- '\u200A': '\u0020',
- '\u2017': '\u0020\u0333',
- '\u2024': '\u002E',
- '\u2025': '\u002E\u002E',
- '\u2026': '\u002E\u002E\u002E',
- '\u2033': '\u2032\u2032',
- '\u2034': '\u2032\u2032\u2032',
- '\u2036': '\u2035\u2035',
- '\u2037': '\u2035\u2035\u2035',
- '\u203C': '\u0021\u0021',
- '\u203E': '\u0020\u0305',
- '\u2047': '\u003F\u003F',
- '\u2048': '\u003F\u0021',
- '\u2049': '\u0021\u003F',
- '\u2057': '\u2032\u2032\u2032\u2032',
- '\u205F': '\u0020',
- '\u20A8': '\u0052\u0073',
- '\u2100': '\u0061\u002F\u0063',
- '\u2101': '\u0061\u002F\u0073',
- '\u2103': '\u00B0\u0043',
- '\u2105': '\u0063\u002F\u006F',
- '\u2106': '\u0063\u002F\u0075',
- '\u2107': '\u0190',
- '\u2109': '\u00B0\u0046',
- '\u2116': '\u004E\u006F',
- '\u2121': '\u0054\u0045\u004C',
- '\u2135': '\u05D0',
- '\u2136': '\u05D1',
- '\u2137': '\u05D2',
- '\u2138': '\u05D3',
- '\u213B': '\u0046\u0041\u0058',
- '\u2160': '\u0049',
- '\u2161': '\u0049\u0049',
- '\u2162': '\u0049\u0049\u0049',
- '\u2163': '\u0049\u0056',
- '\u2164': '\u0056',
- '\u2165': '\u0056\u0049',
- '\u2166': '\u0056\u0049\u0049',
- '\u2167': '\u0056\u0049\u0049\u0049',
- '\u2168': '\u0049\u0058',
- '\u2169': '\u0058',
- '\u216A': '\u0058\u0049',
- '\u216B': '\u0058\u0049\u0049',
- '\u216C': '\u004C',
- '\u216D': '\u0043',
- '\u216E': '\u0044',
- '\u216F': '\u004D',
- '\u2170': '\u0069',
- '\u2171': '\u0069\u0069',
- '\u2172': '\u0069\u0069\u0069',
- '\u2173': '\u0069\u0076',
- '\u2174': '\u0076',
- '\u2175': '\u0076\u0069',
- '\u2176': '\u0076\u0069\u0069',
- '\u2177': '\u0076\u0069\u0069\u0069',
- '\u2178': '\u0069\u0078',
- '\u2179': '\u0078',
- '\u217A': '\u0078\u0069',
- '\u217B': '\u0078\u0069\u0069',
- '\u217C': '\u006C',
- '\u217D': '\u0063',
- '\u217E': '\u0064',
- '\u217F': '\u006D',
- '\u222C': '\u222B\u222B',
- '\u222D': '\u222B\u222B\u222B',
- '\u222F': '\u222E\u222E',
- '\u2230': '\u222E\u222E\u222E',
- '\u2474': '\u0028\u0031\u0029',
- '\u2475': '\u0028\u0032\u0029',
- '\u2476': '\u0028\u0033\u0029',
- '\u2477': '\u0028\u0034\u0029',
- '\u2478': '\u0028\u0035\u0029',
- '\u2479': '\u0028\u0036\u0029',
- '\u247A': '\u0028\u0037\u0029',
- '\u247B': '\u0028\u0038\u0029',
- '\u247C': '\u0028\u0039\u0029',
- '\u247D': '\u0028\u0031\u0030\u0029',
- '\u247E': '\u0028\u0031\u0031\u0029',
- '\u247F': '\u0028\u0031\u0032\u0029',
- '\u2480': '\u0028\u0031\u0033\u0029',
- '\u2481': '\u0028\u0031\u0034\u0029',
- '\u2482': '\u0028\u0031\u0035\u0029',
- '\u2483': '\u0028\u0031\u0036\u0029',
- '\u2484': '\u0028\u0031\u0037\u0029',
- '\u2485': '\u0028\u0031\u0038\u0029',
- '\u2486': '\u0028\u0031\u0039\u0029',
- '\u2487': '\u0028\u0032\u0030\u0029',
- '\u2488': '\u0031\u002E',
- '\u2489': '\u0032\u002E',
- '\u248A': '\u0033\u002E',
- '\u248B': '\u0034\u002E',
- '\u248C': '\u0035\u002E',
- '\u248D': '\u0036\u002E',
- '\u248E': '\u0037\u002E',
- '\u248F': '\u0038\u002E',
- '\u2490': '\u0039\u002E',
- '\u2491': '\u0031\u0030\u002E',
- '\u2492': '\u0031\u0031\u002E',
- '\u2493': '\u0031\u0032\u002E',
- '\u2494': '\u0031\u0033\u002E',
- '\u2495': '\u0031\u0034\u002E',
- '\u2496': '\u0031\u0035\u002E',
- '\u2497': '\u0031\u0036\u002E',
- '\u2498': '\u0031\u0037\u002E',
- '\u2499': '\u0031\u0038\u002E',
- '\u249A': '\u0031\u0039\u002E',
- '\u249B': '\u0032\u0030\u002E',
- '\u249C': '\u0028\u0061\u0029',
- '\u249D': '\u0028\u0062\u0029',
- '\u249E': '\u0028\u0063\u0029',
- '\u249F': '\u0028\u0064\u0029',
- '\u24A0': '\u0028\u0065\u0029',
- '\u24A1': '\u0028\u0066\u0029',
- '\u24A2': '\u0028\u0067\u0029',
- '\u24A3': '\u0028\u0068\u0029',
- '\u24A4': '\u0028\u0069\u0029',
- '\u24A5': '\u0028\u006A\u0029',
- '\u24A6': '\u0028\u006B\u0029',
- '\u24A7': '\u0028\u006C\u0029',
- '\u24A8': '\u0028\u006D\u0029',
- '\u24A9': '\u0028\u006E\u0029',
- '\u24AA': '\u0028\u006F\u0029',
- '\u24AB': '\u0028\u0070\u0029',
- '\u24AC': '\u0028\u0071\u0029',
- '\u24AD': '\u0028\u0072\u0029',
- '\u24AE': '\u0028\u0073\u0029',
- '\u24AF': '\u0028\u0074\u0029',
- '\u24B0': '\u0028\u0075\u0029',
- '\u24B1': '\u0028\u0076\u0029',
- '\u24B2': '\u0028\u0077\u0029',
- '\u24B3': '\u0028\u0078\u0029',
- '\u24B4': '\u0028\u0079\u0029',
- '\u24B5': '\u0028\u007A\u0029',
- '\u2A0C': '\u222B\u222B\u222B\u222B',
- '\u2A74': '\u003A\u003A\u003D',
- '\u2A75': '\u003D\u003D',
- '\u2A76': '\u003D\u003D\u003D',
- '\u2E9F': '\u6BCD',
- '\u2EF3': '\u9F9F',
- '\u2F00': '\u4E00',
- '\u2F01': '\u4E28',
- '\u2F02': '\u4E36',
- '\u2F03': '\u4E3F',
- '\u2F04': '\u4E59',
- '\u2F05': '\u4E85',
- '\u2F06': '\u4E8C',
- '\u2F07': '\u4EA0',
- '\u2F08': '\u4EBA',
- '\u2F09': '\u513F',
- '\u2F0A': '\u5165',
- '\u2F0B': '\u516B',
- '\u2F0C': '\u5182',
- '\u2F0D': '\u5196',
- '\u2F0E': '\u51AB',
- '\u2F0F': '\u51E0',
- '\u2F10': '\u51F5',
- '\u2F11': '\u5200',
- '\u2F12': '\u529B',
- '\u2F13': '\u52F9',
- '\u2F14': '\u5315',
- '\u2F15': '\u531A',
- '\u2F16': '\u5338',
- '\u2F17': '\u5341',
- '\u2F18': '\u535C',
- '\u2F19': '\u5369',
- '\u2F1A': '\u5382',
- '\u2F1B': '\u53B6',
- '\u2F1C': '\u53C8',
- '\u2F1D': '\u53E3',
- '\u2F1E': '\u56D7',
- '\u2F1F': '\u571F',
- '\u2F20': '\u58EB',
- '\u2F21': '\u5902',
- '\u2F22': '\u590A',
- '\u2F23': '\u5915',
- '\u2F24': '\u5927',
- '\u2F25': '\u5973',
- '\u2F26': '\u5B50',
- '\u2F27': '\u5B80',
- '\u2F28': '\u5BF8',
- '\u2F29': '\u5C0F',
- '\u2F2A': '\u5C22',
- '\u2F2B': '\u5C38',
- '\u2F2C': '\u5C6E',
- '\u2F2D': '\u5C71',
- '\u2F2E': '\u5DDB',
- '\u2F2F': '\u5DE5',
- '\u2F30': '\u5DF1',
- '\u2F31': '\u5DFE',
- '\u2F32': '\u5E72',
- '\u2F33': '\u5E7A',
- '\u2F34': '\u5E7F',
- '\u2F35': '\u5EF4',
- '\u2F36': '\u5EFE',
- '\u2F37': '\u5F0B',
- '\u2F38': '\u5F13',
- '\u2F39': '\u5F50',
- '\u2F3A': '\u5F61',
- '\u2F3B': '\u5F73',
- '\u2F3C': '\u5FC3',
- '\u2F3D': '\u6208',
- '\u2F3E': '\u6236',
- '\u2F3F': '\u624B',
- '\u2F40': '\u652F',
- '\u2F41': '\u6534',
- '\u2F42': '\u6587',
- '\u2F43': '\u6597',
- '\u2F44': '\u65A4',
- '\u2F45': '\u65B9',
- '\u2F46': '\u65E0',
- '\u2F47': '\u65E5',
- '\u2F48': '\u66F0',
- '\u2F49': '\u6708',
- '\u2F4A': '\u6728',
- '\u2F4B': '\u6B20',
- '\u2F4C': '\u6B62',
- '\u2F4D': '\u6B79',
- '\u2F4E': '\u6BB3',
- '\u2F4F': '\u6BCB',
- '\u2F50': '\u6BD4',
- '\u2F51': '\u6BDB',
- '\u2F52': '\u6C0F',
- '\u2F53': '\u6C14',
- '\u2F54': '\u6C34',
- '\u2F55': '\u706B',
- '\u2F56': '\u722A',
- '\u2F57': '\u7236',
- '\u2F58': '\u723B',
- '\u2F59': '\u723F',
- '\u2F5A': '\u7247',
- '\u2F5B': '\u7259',
- '\u2F5C': '\u725B',
- '\u2F5D': '\u72AC',
- '\u2F5E': '\u7384',
- '\u2F5F': '\u7389',
- '\u2F60': '\u74DC',
- '\u2F61': '\u74E6',
- '\u2F62': '\u7518',
- '\u2F63': '\u751F',
- '\u2F64': '\u7528',
- '\u2F65': '\u7530',
- '\u2F66': '\u758B',
- '\u2F67': '\u7592',
- '\u2F68': '\u7676',
- '\u2F69': '\u767D',
- '\u2F6A': '\u76AE',
- '\u2F6B': '\u76BF',
- '\u2F6C': '\u76EE',
- '\u2F6D': '\u77DB',
- '\u2F6E': '\u77E2',
- '\u2F6F': '\u77F3',
- '\u2F70': '\u793A',
- '\u2F71': '\u79B8',
- '\u2F72': '\u79BE',
- '\u2F73': '\u7A74',
- '\u2F74': '\u7ACB',
- '\u2F75': '\u7AF9',
- '\u2F76': '\u7C73',
- '\u2F77': '\u7CF8',
- '\u2F78': '\u7F36',
- '\u2F79': '\u7F51',
- '\u2F7A': '\u7F8A',
- '\u2F7B': '\u7FBD',
- '\u2F7C': '\u8001',
- '\u2F7D': '\u800C',
- '\u2F7E': '\u8012',
- '\u2F7F': '\u8033',
- '\u2F80': '\u807F',
- '\u2F81': '\u8089',
- '\u2F82': '\u81E3',
- '\u2F83': '\u81EA',
- '\u2F84': '\u81F3',
- '\u2F85': '\u81FC',
- '\u2F86': '\u820C',
- '\u2F87': '\u821B',
- '\u2F88': '\u821F',
- '\u2F89': '\u826E',
- '\u2F8A': '\u8272',
- '\u2F8B': '\u8278',
- '\u2F8C': '\u864D',
- '\u2F8D': '\u866B',
- '\u2F8E': '\u8840',
- '\u2F8F': '\u884C',
- '\u2F90': '\u8863',
- '\u2F91': '\u897E',
- '\u2F92': '\u898B',
- '\u2F93': '\u89D2',
- '\u2F94': '\u8A00',
- '\u2F95': '\u8C37',
- '\u2F96': '\u8C46',
- '\u2F97': '\u8C55',
- '\u2F98': '\u8C78',
- '\u2F99': '\u8C9D',
- '\u2F9A': '\u8D64',
- '\u2F9B': '\u8D70',
- '\u2F9C': '\u8DB3',
- '\u2F9D': '\u8EAB',
- '\u2F9E': '\u8ECA',
- '\u2F9F': '\u8F9B',
- '\u2FA0': '\u8FB0',
- '\u2FA1': '\u8FB5',
- '\u2FA2': '\u9091',
- '\u2FA3': '\u9149',
- '\u2FA4': '\u91C6',
- '\u2FA5': '\u91CC',
- '\u2FA6': '\u91D1',
- '\u2FA7': '\u9577',
- '\u2FA8': '\u9580',
- '\u2FA9': '\u961C',
- '\u2FAA': '\u96B6',
- '\u2FAB': '\u96B9',
- '\u2FAC': '\u96E8',
- '\u2FAD': '\u9751',
- '\u2FAE': '\u975E',
- '\u2FAF': '\u9762',
- '\u2FB0': '\u9769',
- '\u2FB1': '\u97CB',
- '\u2FB2': '\u97ED',
- '\u2FB3': '\u97F3',
- '\u2FB4': '\u9801',
- '\u2FB5': '\u98A8',
- '\u2FB6': '\u98DB',
- '\u2FB7': '\u98DF',
- '\u2FB8': '\u9996',
- '\u2FB9': '\u9999',
- '\u2FBA': '\u99AC',
- '\u2FBB': '\u9AA8',
- '\u2FBC': '\u9AD8',
- '\u2FBD': '\u9ADF',
- '\u2FBE': '\u9B25',
- '\u2FBF': '\u9B2F',
- '\u2FC0': '\u9B32',
- '\u2FC1': '\u9B3C',
- '\u2FC2': '\u9B5A',
- '\u2FC3': '\u9CE5',
- '\u2FC4': '\u9E75',
- '\u2FC5': '\u9E7F',
- '\u2FC6': '\u9EA5',
- '\u2FC7': '\u9EBB',
- '\u2FC8': '\u9EC3',
- '\u2FC9': '\u9ECD',
- '\u2FCA': '\u9ED1',
- '\u2FCB': '\u9EF9',
- '\u2FCC': '\u9EFD',
- '\u2FCD': '\u9F0E',
- '\u2FCE': '\u9F13',
- '\u2FCF': '\u9F20',
- '\u2FD0': '\u9F3B',
- '\u2FD1': '\u9F4A',
- '\u2FD2': '\u9F52',
- '\u2FD3': '\u9F8D',
- '\u2FD4': '\u9F9C',
- '\u2FD5': '\u9FA0',
- '\u3036': '\u3012',
- '\u3038': '\u5341',
- '\u3039': '\u5344',
- '\u303A': '\u5345',
- '\u309B': '\u0020\u3099',
- '\u309C': '\u0020\u309A',
- '\u3131': '\u1100',
- '\u3132': '\u1101',
- '\u3133': '\u11AA',
- '\u3134': '\u1102',
- '\u3135': '\u11AC',
- '\u3136': '\u11AD',
- '\u3137': '\u1103',
- '\u3138': '\u1104',
- '\u3139': '\u1105',
- '\u313A': '\u11B0',
- '\u313B': '\u11B1',
- '\u313C': '\u11B2',
- '\u313D': '\u11B3',
- '\u313E': '\u11B4',
- '\u313F': '\u11B5',
- '\u3140': '\u111A',
- '\u3141': '\u1106',
- '\u3142': '\u1107',
- '\u3143': '\u1108',
- '\u3144': '\u1121',
- '\u3145': '\u1109',
- '\u3146': '\u110A',
- '\u3147': '\u110B',
- '\u3148': '\u110C',
- '\u3149': '\u110D',
- '\u314A': '\u110E',
- '\u314B': '\u110F',
- '\u314C': '\u1110',
- '\u314D': '\u1111',
- '\u314E': '\u1112',
- '\u314F': '\u1161',
- '\u3150': '\u1162',
- '\u3151': '\u1163',
- '\u3152': '\u1164',
- '\u3153': '\u1165',
- '\u3154': '\u1166',
- '\u3155': '\u1167',
- '\u3156': '\u1168',
- '\u3157': '\u1169',
- '\u3158': '\u116A',
- '\u3159': '\u116B',
- '\u315A': '\u116C',
- '\u315B': '\u116D',
- '\u315C': '\u116E',
- '\u315D': '\u116F',
- '\u315E': '\u1170',
- '\u315F': '\u1171',
- '\u3160': '\u1172',
- '\u3161': '\u1173',
- '\u3162': '\u1174',
- '\u3163': '\u1175',
- '\u3164': '\u1160',
- '\u3165': '\u1114',
- '\u3166': '\u1115',
- '\u3167': '\u11C7',
- '\u3168': '\u11C8',
- '\u3169': '\u11CC',
- '\u316A': '\u11CE',
- '\u316B': '\u11D3',
- '\u316C': '\u11D7',
- '\u316D': '\u11D9',
- '\u316E': '\u111C',
- '\u316F': '\u11DD',
- '\u3170': '\u11DF',
- '\u3171': '\u111D',
- '\u3172': '\u111E',
- '\u3173': '\u1120',
- '\u3174': '\u1122',
- '\u3175': '\u1123',
- '\u3176': '\u1127',
- '\u3177': '\u1129',
- '\u3178': '\u112B',
- '\u3179': '\u112C',
- '\u317A': '\u112D',
- '\u317B': '\u112E',
- '\u317C': '\u112F',
- '\u317D': '\u1132',
- '\u317E': '\u1136',
- '\u317F': '\u1140',
- '\u3180': '\u1147',
- '\u3181': '\u114C',
- '\u3182': '\u11F1',
- '\u3183': '\u11F2',
- '\u3184': '\u1157',
- '\u3185': '\u1158',
- '\u3186': '\u1159',
- '\u3187': '\u1184',
- '\u3188': '\u1185',
- '\u3189': '\u1188',
- '\u318A': '\u1191',
- '\u318B': '\u1192',
- '\u318C': '\u1194',
- '\u318D': '\u119E',
- '\u318E': '\u11A1',
- '\u3200': '\u0028\u1100\u0029',
- '\u3201': '\u0028\u1102\u0029',
- '\u3202': '\u0028\u1103\u0029',
- '\u3203': '\u0028\u1105\u0029',
- '\u3204': '\u0028\u1106\u0029',
- '\u3205': '\u0028\u1107\u0029',
- '\u3206': '\u0028\u1109\u0029',
- '\u3207': '\u0028\u110B\u0029',
- '\u3208': '\u0028\u110C\u0029',
- '\u3209': '\u0028\u110E\u0029',
- '\u320A': '\u0028\u110F\u0029',
- '\u320B': '\u0028\u1110\u0029',
- '\u320C': '\u0028\u1111\u0029',
- '\u320D': '\u0028\u1112\u0029',
- '\u320E': '\u0028\u1100\u1161\u0029',
- '\u320F': '\u0028\u1102\u1161\u0029',
- '\u3210': '\u0028\u1103\u1161\u0029',
- '\u3211': '\u0028\u1105\u1161\u0029',
- '\u3212': '\u0028\u1106\u1161\u0029',
- '\u3213': '\u0028\u1107\u1161\u0029',
- '\u3214': '\u0028\u1109\u1161\u0029',
- '\u3215': '\u0028\u110B\u1161\u0029',
- '\u3216': '\u0028\u110C\u1161\u0029',
- '\u3217': '\u0028\u110E\u1161\u0029',
- '\u3218': '\u0028\u110F\u1161\u0029',
- '\u3219': '\u0028\u1110\u1161\u0029',
- '\u321A': '\u0028\u1111\u1161\u0029',
- '\u321B': '\u0028\u1112\u1161\u0029',
- '\u321C': '\u0028\u110C\u116E\u0029',
- '\u321D': '\u0028\u110B\u1169\u110C\u1165\u11AB\u0029',
- '\u321E': '\u0028\u110B\u1169\u1112\u116E\u0029',
- '\u3220': '\u0028\u4E00\u0029',
- '\u3221': '\u0028\u4E8C\u0029',
- '\u3222': '\u0028\u4E09\u0029',
- '\u3223': '\u0028\u56DB\u0029',
- '\u3224': '\u0028\u4E94\u0029',
- '\u3225': '\u0028\u516D\u0029',
- '\u3226': '\u0028\u4E03\u0029',
- '\u3227': '\u0028\u516B\u0029',
- '\u3228': '\u0028\u4E5D\u0029',
- '\u3229': '\u0028\u5341\u0029',
- '\u322A': '\u0028\u6708\u0029',
- '\u322B': '\u0028\u706B\u0029',
- '\u322C': '\u0028\u6C34\u0029',
- '\u322D': '\u0028\u6728\u0029',
- '\u322E': '\u0028\u91D1\u0029',
- '\u322F': '\u0028\u571F\u0029',
- '\u3230': '\u0028\u65E5\u0029',
- '\u3231': '\u0028\u682A\u0029',
- '\u3232': '\u0028\u6709\u0029',
- '\u3233': '\u0028\u793E\u0029',
- '\u3234': '\u0028\u540D\u0029',
- '\u3235': '\u0028\u7279\u0029',
- '\u3236': '\u0028\u8CA1\u0029',
- '\u3237': '\u0028\u795D\u0029',
- '\u3238': '\u0028\u52B4\u0029',
- '\u3239': '\u0028\u4EE3\u0029',
- '\u323A': '\u0028\u547C\u0029',
- '\u323B': '\u0028\u5B66\u0029',
- '\u323C': '\u0028\u76E3\u0029',
- '\u323D': '\u0028\u4F01\u0029',
- '\u323E': '\u0028\u8CC7\u0029',
- '\u323F': '\u0028\u5354\u0029',
- '\u3240': '\u0028\u796D\u0029',
- '\u3241': '\u0028\u4F11\u0029',
- '\u3242': '\u0028\u81EA\u0029',
- '\u3243': '\u0028\u81F3\u0029',
- '\u32C0': '\u0031\u6708',
- '\u32C1': '\u0032\u6708',
- '\u32C2': '\u0033\u6708',
- '\u32C3': '\u0034\u6708',
- '\u32C4': '\u0035\u6708',
- '\u32C5': '\u0036\u6708',
- '\u32C6': '\u0037\u6708',
- '\u32C7': '\u0038\u6708',
- '\u32C8': '\u0039\u6708',
- '\u32C9': '\u0031\u0030\u6708',
- '\u32CA': '\u0031\u0031\u6708',
- '\u32CB': '\u0031\u0032\u6708',
- '\u3358': '\u0030\u70B9',
- '\u3359': '\u0031\u70B9',
- '\u335A': '\u0032\u70B9',
- '\u335B': '\u0033\u70B9',
- '\u335C': '\u0034\u70B9',
- '\u335D': '\u0035\u70B9',
- '\u335E': '\u0036\u70B9',
- '\u335F': '\u0037\u70B9',
- '\u3360': '\u0038\u70B9',
- '\u3361': '\u0039\u70B9',
- '\u3362': '\u0031\u0030\u70B9',
- '\u3363': '\u0031\u0031\u70B9',
- '\u3364': '\u0031\u0032\u70B9',
- '\u3365': '\u0031\u0033\u70B9',
- '\u3366': '\u0031\u0034\u70B9',
- '\u3367': '\u0031\u0035\u70B9',
- '\u3368': '\u0031\u0036\u70B9',
- '\u3369': '\u0031\u0037\u70B9',
- '\u336A': '\u0031\u0038\u70B9',
- '\u336B': '\u0031\u0039\u70B9',
- '\u336C': '\u0032\u0030\u70B9',
- '\u336D': '\u0032\u0031\u70B9',
- '\u336E': '\u0032\u0032\u70B9',
- '\u336F': '\u0032\u0033\u70B9',
- '\u3370': '\u0032\u0034\u70B9',
- '\u33E0': '\u0031\u65E5',
- '\u33E1': '\u0032\u65E5',
- '\u33E2': '\u0033\u65E5',
- '\u33E3': '\u0034\u65E5',
- '\u33E4': '\u0035\u65E5',
- '\u33E5': '\u0036\u65E5',
- '\u33E6': '\u0037\u65E5',
- '\u33E7': '\u0038\u65E5',
- '\u33E8': '\u0039\u65E5',
- '\u33E9': '\u0031\u0030\u65E5',
- '\u33EA': '\u0031\u0031\u65E5',
- '\u33EB': '\u0031\u0032\u65E5',
- '\u33EC': '\u0031\u0033\u65E5',
- '\u33ED': '\u0031\u0034\u65E5',
- '\u33EE': '\u0031\u0035\u65E5',
- '\u33EF': '\u0031\u0036\u65E5',
- '\u33F0': '\u0031\u0037\u65E5',
- '\u33F1': '\u0031\u0038\u65E5',
- '\u33F2': '\u0031\u0039\u65E5',
- '\u33F3': '\u0032\u0030\u65E5',
- '\u33F4': '\u0032\u0031\u65E5',
- '\u33F5': '\u0032\u0032\u65E5',
- '\u33F6': '\u0032\u0033\u65E5',
- '\u33F7': '\u0032\u0034\u65E5',
- '\u33F8': '\u0032\u0035\u65E5',
- '\u33F9': '\u0032\u0036\u65E5',
- '\u33FA': '\u0032\u0037\u65E5',
- '\u33FB': '\u0032\u0038\u65E5',
- '\u33FC': '\u0032\u0039\u65E5',
- '\u33FD': '\u0033\u0030\u65E5',
- '\u33FE': '\u0033\u0031\u65E5',
- '\uFB00': '\u0066\u0066',
- '\uFB01': '\u0066\u0069',
- '\uFB02': '\u0066\u006C',
- '\uFB03': '\u0066\u0066\u0069',
- '\uFB04': '\u0066\u0066\u006C',
- '\uFB05': '\u017F\u0074',
- '\uFB06': '\u0073\u0074',
- '\uFB13': '\u0574\u0576',
- '\uFB14': '\u0574\u0565',
- '\uFB15': '\u0574\u056B',
- '\uFB16': '\u057E\u0576',
- '\uFB17': '\u0574\u056D',
- '\uFB4F': '\u05D0\u05DC',
- '\uFB50': '\u0671',
- '\uFB51': '\u0671',
- '\uFB52': '\u067B',
- '\uFB53': '\u067B',
- '\uFB54': '\u067B',
- '\uFB55': '\u067B',
- '\uFB56': '\u067E',
- '\uFB57': '\u067E',
- '\uFB58': '\u067E',
- '\uFB59': '\u067E',
- '\uFB5A': '\u0680',
- '\uFB5B': '\u0680',
- '\uFB5C': '\u0680',
- '\uFB5D': '\u0680',
- '\uFB5E': '\u067A',
- '\uFB5F': '\u067A',
- '\uFB60': '\u067A',
- '\uFB61': '\u067A',
- '\uFB62': '\u067F',
- '\uFB63': '\u067F',
- '\uFB64': '\u067F',
- '\uFB65': '\u067F',
- '\uFB66': '\u0679',
- '\uFB67': '\u0679',
- '\uFB68': '\u0679',
- '\uFB69': '\u0679',
- '\uFB6A': '\u06A4',
- '\uFB6B': '\u06A4',
- '\uFB6C': '\u06A4',
- '\uFB6D': '\u06A4',
- '\uFB6E': '\u06A6',
- '\uFB6F': '\u06A6',
- '\uFB70': '\u06A6',
- '\uFB71': '\u06A6',
- '\uFB72': '\u0684',
- '\uFB73': '\u0684',
- '\uFB74': '\u0684',
- '\uFB75': '\u0684',
- '\uFB76': '\u0683',
- '\uFB77': '\u0683',
- '\uFB78': '\u0683',
- '\uFB79': '\u0683',
- '\uFB7A': '\u0686',
- '\uFB7B': '\u0686',
- '\uFB7C': '\u0686',
- '\uFB7D': '\u0686',
- '\uFB7E': '\u0687',
- '\uFB7F': '\u0687',
- '\uFB80': '\u0687',
- '\uFB81': '\u0687',
- '\uFB82': '\u068D',
- '\uFB83': '\u068D',
- '\uFB84': '\u068C',
- '\uFB85': '\u068C',
- '\uFB86': '\u068E',
- '\uFB87': '\u068E',
- '\uFB88': '\u0688',
- '\uFB89': '\u0688',
- '\uFB8A': '\u0698',
- '\uFB8B': '\u0698',
- '\uFB8C': '\u0691',
- '\uFB8D': '\u0691',
- '\uFB8E': '\u06A9',
- '\uFB8F': '\u06A9',
- '\uFB90': '\u06A9',
- '\uFB91': '\u06A9',
- '\uFB92': '\u06AF',
- '\uFB93': '\u06AF',
- '\uFB94': '\u06AF',
- '\uFB95': '\u06AF',
- '\uFB96': '\u06B3',
- '\uFB97': '\u06B3',
- '\uFB98': '\u06B3',
- '\uFB99': '\u06B3',
- '\uFB9A': '\u06B1',
- '\uFB9B': '\u06B1',
- '\uFB9C': '\u06B1',
- '\uFB9D': '\u06B1',
- '\uFB9E': '\u06BA',
- '\uFB9F': '\u06BA',
- '\uFBA0': '\u06BB',
- '\uFBA1': '\u06BB',
- '\uFBA2': '\u06BB',
- '\uFBA3': '\u06BB',
- '\uFBA4': '\u06C0',
- '\uFBA5': '\u06C0',
- '\uFBA6': '\u06C1',
- '\uFBA7': '\u06C1',
- '\uFBA8': '\u06C1',
- '\uFBA9': '\u06C1',
- '\uFBAA': '\u06BE',
- '\uFBAB': '\u06BE',
- '\uFBAC': '\u06BE',
- '\uFBAD': '\u06BE',
- '\uFBAE': '\u06D2',
- '\uFBAF': '\u06D2',
- '\uFBB0': '\u06D3',
- '\uFBB1': '\u06D3',
- '\uFBD3': '\u06AD',
- '\uFBD4': '\u06AD',
- '\uFBD5': '\u06AD',
- '\uFBD6': '\u06AD',
- '\uFBD7': '\u06C7',
- '\uFBD8': '\u06C7',
- '\uFBD9': '\u06C6',
- '\uFBDA': '\u06C6',
- '\uFBDB': '\u06C8',
- '\uFBDC': '\u06C8',
- '\uFBDD': '\u0677',
- '\uFBDE': '\u06CB',
- '\uFBDF': '\u06CB',
- '\uFBE0': '\u06C5',
- '\uFBE1': '\u06C5',
- '\uFBE2': '\u06C9',
- '\uFBE3': '\u06C9',
- '\uFBE4': '\u06D0',
- '\uFBE5': '\u06D0',
- '\uFBE6': '\u06D0',
- '\uFBE7': '\u06D0',
- '\uFBE8': '\u0649',
- '\uFBE9': '\u0649',
- '\uFBEA': '\u0626\u0627',
- '\uFBEB': '\u0626\u0627',
- '\uFBEC': '\u0626\u06D5',
- '\uFBED': '\u0626\u06D5',
- '\uFBEE': '\u0626\u0648',
- '\uFBEF': '\u0626\u0648',
- '\uFBF0': '\u0626\u06C7',
- '\uFBF1': '\u0626\u06C7',
- '\uFBF2': '\u0626\u06C6',
- '\uFBF3': '\u0626\u06C6',
- '\uFBF4': '\u0626\u06C8',
- '\uFBF5': '\u0626\u06C8',
- '\uFBF6': '\u0626\u06D0',
- '\uFBF7': '\u0626\u06D0',
- '\uFBF8': '\u0626\u06D0',
- '\uFBF9': '\u0626\u0649',
- '\uFBFA': '\u0626\u0649',
- '\uFBFB': '\u0626\u0649',
- '\uFBFC': '\u06CC',
- '\uFBFD': '\u06CC',
- '\uFBFE': '\u06CC',
- '\uFBFF': '\u06CC',
- '\uFC00': '\u0626\u062C',
- '\uFC01': '\u0626\u062D',
- '\uFC02': '\u0626\u0645',
- '\uFC03': '\u0626\u0649',
- '\uFC04': '\u0626\u064A',
- '\uFC05': '\u0628\u062C',
- '\uFC06': '\u0628\u062D',
- '\uFC07': '\u0628\u062E',
- '\uFC08': '\u0628\u0645',
- '\uFC09': '\u0628\u0649',
- '\uFC0A': '\u0628\u064A',
- '\uFC0B': '\u062A\u062C',
- '\uFC0C': '\u062A\u062D',
- '\uFC0D': '\u062A\u062E',
- '\uFC0E': '\u062A\u0645',
- '\uFC0F': '\u062A\u0649',
- '\uFC10': '\u062A\u064A',
- '\uFC11': '\u062B\u062C',
- '\uFC12': '\u062B\u0645',
- '\uFC13': '\u062B\u0649',
- '\uFC14': '\u062B\u064A',
- '\uFC15': '\u062C\u062D',
- '\uFC16': '\u062C\u0645',
- '\uFC17': '\u062D\u062C',
- '\uFC18': '\u062D\u0645',
- '\uFC19': '\u062E\u062C',
- '\uFC1A': '\u062E\u062D',
- '\uFC1B': '\u062E\u0645',
- '\uFC1C': '\u0633\u062C',
- '\uFC1D': '\u0633\u062D',
- '\uFC1E': '\u0633\u062E',
- '\uFC1F': '\u0633\u0645',
- '\uFC20': '\u0635\u062D',
- '\uFC21': '\u0635\u0645',
- '\uFC22': '\u0636\u062C',
- '\uFC23': '\u0636\u062D',
- '\uFC24': '\u0636\u062E',
- '\uFC25': '\u0636\u0645',
- '\uFC26': '\u0637\u062D',
- '\uFC27': '\u0637\u0645',
- '\uFC28': '\u0638\u0645',
- '\uFC29': '\u0639\u062C',
- '\uFC2A': '\u0639\u0645',
- '\uFC2B': '\u063A\u062C',
- '\uFC2C': '\u063A\u0645',
- '\uFC2D': '\u0641\u062C',
- '\uFC2E': '\u0641\u062D',
- '\uFC2F': '\u0641\u062E',
- '\uFC30': '\u0641\u0645',
- '\uFC31': '\u0641\u0649',
- '\uFC32': '\u0641\u064A',
- '\uFC33': '\u0642\u062D',
- '\uFC34': '\u0642\u0645',
- '\uFC35': '\u0642\u0649',
- '\uFC36': '\u0642\u064A',
- '\uFC37': '\u0643\u0627',
- '\uFC38': '\u0643\u062C',
- '\uFC39': '\u0643\u062D',
- '\uFC3A': '\u0643\u062E',
- '\uFC3B': '\u0643\u0644',
- '\uFC3C': '\u0643\u0645',
- '\uFC3D': '\u0643\u0649',
- '\uFC3E': '\u0643\u064A',
- '\uFC3F': '\u0644\u062C',
- '\uFC40': '\u0644\u062D',
- '\uFC41': '\u0644\u062E',
- '\uFC42': '\u0644\u0645',
- '\uFC43': '\u0644\u0649',
- '\uFC44': '\u0644\u064A',
- '\uFC45': '\u0645\u062C',
- '\uFC46': '\u0645\u062D',
- '\uFC47': '\u0645\u062E',
- '\uFC48': '\u0645\u0645',
- '\uFC49': '\u0645\u0649',
- '\uFC4A': '\u0645\u064A',
- '\uFC4B': '\u0646\u062C',
- '\uFC4C': '\u0646\u062D',
- '\uFC4D': '\u0646\u062E',
- '\uFC4E': '\u0646\u0645',
- '\uFC4F': '\u0646\u0649',
- '\uFC50': '\u0646\u064A',
- '\uFC51': '\u0647\u062C',
- '\uFC52': '\u0647\u0645',
- '\uFC53': '\u0647\u0649',
- '\uFC54': '\u0647\u064A',
- '\uFC55': '\u064A\u062C',
- '\uFC56': '\u064A\u062D',
- '\uFC57': '\u064A\u062E',
- '\uFC58': '\u064A\u0645',
- '\uFC59': '\u064A\u0649',
- '\uFC5A': '\u064A\u064A',
- '\uFC5B': '\u0630\u0670',
- '\uFC5C': '\u0631\u0670',
- '\uFC5D': '\u0649\u0670',
- '\uFC5E': '\u0020\u064C\u0651',
- '\uFC5F': '\u0020\u064D\u0651',
- '\uFC60': '\u0020\u064E\u0651',
- '\uFC61': '\u0020\u064F\u0651',
- '\uFC62': '\u0020\u0650\u0651',
- '\uFC63': '\u0020\u0651\u0670',
- '\uFC64': '\u0626\u0631',
- '\uFC65': '\u0626\u0632',
- '\uFC66': '\u0626\u0645',
- '\uFC67': '\u0626\u0646',
- '\uFC68': '\u0626\u0649',
- '\uFC69': '\u0626\u064A',
- '\uFC6A': '\u0628\u0631',
- '\uFC6B': '\u0628\u0632',
- '\uFC6C': '\u0628\u0645',
- '\uFC6D': '\u0628\u0646',
- '\uFC6E': '\u0628\u0649',
- '\uFC6F': '\u0628\u064A',
- '\uFC70': '\u062A\u0631',
- '\uFC71': '\u062A\u0632',
- '\uFC72': '\u062A\u0645',
- '\uFC73': '\u062A\u0646',
- '\uFC74': '\u062A\u0649',
- '\uFC75': '\u062A\u064A',
- '\uFC76': '\u062B\u0631',
- '\uFC77': '\u062B\u0632',
- '\uFC78': '\u062B\u0645',
- '\uFC79': '\u062B\u0646',
- '\uFC7A': '\u062B\u0649',
- '\uFC7B': '\u062B\u064A',
- '\uFC7C': '\u0641\u0649',
- '\uFC7D': '\u0641\u064A',
- '\uFC7E': '\u0642\u0649',
- '\uFC7F': '\u0642\u064A',
- '\uFC80': '\u0643\u0627',
- '\uFC81': '\u0643\u0644',
- '\uFC82': '\u0643\u0645',
- '\uFC83': '\u0643\u0649',
- '\uFC84': '\u0643\u064A',
- '\uFC85': '\u0644\u0645',
- '\uFC86': '\u0644\u0649',
- '\uFC87': '\u0644\u064A',
- '\uFC88': '\u0645\u0627',
- '\uFC89': '\u0645\u0645',
- '\uFC8A': '\u0646\u0631',
- '\uFC8B': '\u0646\u0632',
- '\uFC8C': '\u0646\u0645',
- '\uFC8D': '\u0646\u0646',
- '\uFC8E': '\u0646\u0649',
- '\uFC8F': '\u0646\u064A',
- '\uFC90': '\u0649\u0670',
- '\uFC91': '\u064A\u0631',
- '\uFC92': '\u064A\u0632',
- '\uFC93': '\u064A\u0645',
- '\uFC94': '\u064A\u0646',
- '\uFC95': '\u064A\u0649',
- '\uFC96': '\u064A\u064A',
- '\uFC97': '\u0626\u062C',
- '\uFC98': '\u0626\u062D',
- '\uFC99': '\u0626\u062E',
- '\uFC9A': '\u0626\u0645',
- '\uFC9B': '\u0626\u0647',
- '\uFC9C': '\u0628\u062C',
- '\uFC9D': '\u0628\u062D',
- '\uFC9E': '\u0628\u062E',
- '\uFC9F': '\u0628\u0645',
- '\uFCA0': '\u0628\u0647',
- '\uFCA1': '\u062A\u062C',
- '\uFCA2': '\u062A\u062D',
- '\uFCA3': '\u062A\u062E',
- '\uFCA4': '\u062A\u0645',
- '\uFCA5': '\u062A\u0647',
- '\uFCA6': '\u062B\u0645',
- '\uFCA7': '\u062C\u062D',
- '\uFCA8': '\u062C\u0645',
- '\uFCA9': '\u062D\u062C',
- '\uFCAA': '\u062D\u0645',
- '\uFCAB': '\u062E\u062C',
- '\uFCAC': '\u062E\u0645',
- '\uFCAD': '\u0633\u062C',
- '\uFCAE': '\u0633\u062D',
- '\uFCAF': '\u0633\u062E',
- '\uFCB0': '\u0633\u0645',
- '\uFCB1': '\u0635\u062D',
- '\uFCB2': '\u0635\u062E',
- '\uFCB3': '\u0635\u0645',
- '\uFCB4': '\u0636\u062C',
- '\uFCB5': '\u0636\u062D',
- '\uFCB6': '\u0636\u062E',
- '\uFCB7': '\u0636\u0645',
- '\uFCB8': '\u0637\u062D',
- '\uFCB9': '\u0638\u0645',
- '\uFCBA': '\u0639\u062C',
- '\uFCBB': '\u0639\u0645',
- '\uFCBC': '\u063A\u062C',
- '\uFCBD': '\u063A\u0645',
- '\uFCBE': '\u0641\u062C',
- '\uFCBF': '\u0641\u062D',
- '\uFCC0': '\u0641\u062E',
- '\uFCC1': '\u0641\u0645',
- '\uFCC2': '\u0642\u062D',
- '\uFCC3': '\u0642\u0645',
- '\uFCC4': '\u0643\u062C',
- '\uFCC5': '\u0643\u062D',
- '\uFCC6': '\u0643\u062E',
- '\uFCC7': '\u0643\u0644',
- '\uFCC8': '\u0643\u0645',
- '\uFCC9': '\u0644\u062C',
- '\uFCCA': '\u0644\u062D',
- '\uFCCB': '\u0644\u062E',
- '\uFCCC': '\u0644\u0645',
- '\uFCCD': '\u0644\u0647',
- '\uFCCE': '\u0645\u062C',
- '\uFCCF': '\u0645\u062D',
- '\uFCD0': '\u0645\u062E',
- '\uFCD1': '\u0645\u0645',
- '\uFCD2': '\u0646\u062C',
- '\uFCD3': '\u0646\u062D',
- '\uFCD4': '\u0646\u062E',
- '\uFCD5': '\u0646\u0645',
- '\uFCD6': '\u0646\u0647',
- '\uFCD7': '\u0647\u062C',
- '\uFCD8': '\u0647\u0645',
- '\uFCD9': '\u0647\u0670',
- '\uFCDA': '\u064A\u062C',
- '\uFCDB': '\u064A\u062D',
- '\uFCDC': '\u064A\u062E',
- '\uFCDD': '\u064A\u0645',
- '\uFCDE': '\u064A\u0647',
- '\uFCDF': '\u0626\u0645',
- '\uFCE0': '\u0626\u0647',
- '\uFCE1': '\u0628\u0645',
- '\uFCE2': '\u0628\u0647',
- '\uFCE3': '\u062A\u0645',
- '\uFCE4': '\u062A\u0647',
- '\uFCE5': '\u062B\u0645',
- '\uFCE6': '\u062B\u0647',
- '\uFCE7': '\u0633\u0645',
- '\uFCE8': '\u0633\u0647',
- '\uFCE9': '\u0634\u0645',
- '\uFCEA': '\u0634\u0647',
- '\uFCEB': '\u0643\u0644',
- '\uFCEC': '\u0643\u0645',
- '\uFCED': '\u0644\u0645',
- '\uFCEE': '\u0646\u0645',
- '\uFCEF': '\u0646\u0647',
- '\uFCF0': '\u064A\u0645',
- '\uFCF1': '\u064A\u0647',
- '\uFCF2': '\u0640\u064E\u0651',
- '\uFCF3': '\u0640\u064F\u0651',
- '\uFCF4': '\u0640\u0650\u0651',
- '\uFCF5': '\u0637\u0649',
- '\uFCF6': '\u0637\u064A',
- '\uFCF7': '\u0639\u0649',
- '\uFCF8': '\u0639\u064A',
- '\uFCF9': '\u063A\u0649',
- '\uFCFA': '\u063A\u064A',
- '\uFCFB': '\u0633\u0649',
- '\uFCFC': '\u0633\u064A',
- '\uFCFD': '\u0634\u0649',
- '\uFCFE': '\u0634\u064A',
- '\uFCFF': '\u062D\u0649',
- '\uFD00': '\u062D\u064A',
- '\uFD01': '\u062C\u0649',
- '\uFD02': '\u062C\u064A',
- '\uFD03': '\u062E\u0649',
- '\uFD04': '\u062E\u064A',
- '\uFD05': '\u0635\u0649',
- '\uFD06': '\u0635\u064A',
- '\uFD07': '\u0636\u0649',
- '\uFD08': '\u0636\u064A',
- '\uFD09': '\u0634\u062C',
- '\uFD0A': '\u0634\u062D',
- '\uFD0B': '\u0634\u062E',
- '\uFD0C': '\u0634\u0645',
- '\uFD0D': '\u0634\u0631',
- '\uFD0E': '\u0633\u0631',
- '\uFD0F': '\u0635\u0631',
- '\uFD10': '\u0636\u0631',
- '\uFD11': '\u0637\u0649',
- '\uFD12': '\u0637\u064A',
- '\uFD13': '\u0639\u0649',
- '\uFD14': '\u0639\u064A',
- '\uFD15': '\u063A\u0649',
- '\uFD16': '\u063A\u064A',
- '\uFD17': '\u0633\u0649',
- '\uFD18': '\u0633\u064A',
- '\uFD19': '\u0634\u0649',
- '\uFD1A': '\u0634\u064A',
- '\uFD1B': '\u062D\u0649',
- '\uFD1C': '\u062D\u064A',
- '\uFD1D': '\u062C\u0649',
- '\uFD1E': '\u062C\u064A',
- '\uFD1F': '\u062E\u0649',
- '\uFD20': '\u062E\u064A',
- '\uFD21': '\u0635\u0649',
- '\uFD22': '\u0635\u064A',
- '\uFD23': '\u0636\u0649',
- '\uFD24': '\u0636\u064A',
- '\uFD25': '\u0634\u062C',
- '\uFD26': '\u0634\u062D',
- '\uFD27': '\u0634\u062E',
- '\uFD28': '\u0634\u0645',
- '\uFD29': '\u0634\u0631',
- '\uFD2A': '\u0633\u0631',
- '\uFD2B': '\u0635\u0631',
- '\uFD2C': '\u0636\u0631',
- '\uFD2D': '\u0634\u062C',
- '\uFD2E': '\u0634\u062D',
- '\uFD2F': '\u0634\u062E',
- '\uFD30': '\u0634\u0645',
- '\uFD31': '\u0633\u0647',
- '\uFD32': '\u0634\u0647',
- '\uFD33': '\u0637\u0645',
- '\uFD34': '\u0633\u062C',
- '\uFD35': '\u0633\u062D',
- '\uFD36': '\u0633\u062E',
- '\uFD37': '\u0634\u062C',
- '\uFD38': '\u0634\u062D',
- '\uFD39': '\u0634\u062E',
- '\uFD3A': '\u0637\u0645',
- '\uFD3B': '\u0638\u0645',
- '\uFD3C': '\u0627\u064B',
- '\uFD3D': '\u0627\u064B',
- '\uFD50': '\u062A\u062C\u0645',
- '\uFD51': '\u062A\u062D\u062C',
- '\uFD52': '\u062A\u062D\u062C',
- '\uFD53': '\u062A\u062D\u0645',
- '\uFD54': '\u062A\u062E\u0645',
- '\uFD55': '\u062A\u0645\u062C',
- '\uFD56': '\u062A\u0645\u062D',
- '\uFD57': '\u062A\u0645\u062E',
- '\uFD58': '\u062C\u0645\u062D',
- '\uFD59': '\u062C\u0645\u062D',
- '\uFD5A': '\u062D\u0645\u064A',
- '\uFD5B': '\u062D\u0645\u0649',
- '\uFD5C': '\u0633\u062D\u062C',
- '\uFD5D': '\u0633\u062C\u062D',
- '\uFD5E': '\u0633\u062C\u0649',
- '\uFD5F': '\u0633\u0645\u062D',
- '\uFD60': '\u0633\u0645\u062D',
- '\uFD61': '\u0633\u0645\u062C',
- '\uFD62': '\u0633\u0645\u0645',
- '\uFD63': '\u0633\u0645\u0645',
- '\uFD64': '\u0635\u062D\u062D',
- '\uFD65': '\u0635\u062D\u062D',
- '\uFD66': '\u0635\u0645\u0645',
- '\uFD67': '\u0634\u062D\u0645',
- '\uFD68': '\u0634\u062D\u0645',
- '\uFD69': '\u0634\u062C\u064A',
- '\uFD6A': '\u0634\u0645\u062E',
- '\uFD6B': '\u0634\u0645\u062E',
- '\uFD6C': '\u0634\u0645\u0645',
- '\uFD6D': '\u0634\u0645\u0645',
- '\uFD6E': '\u0636\u062D\u0649',
- '\uFD6F': '\u0636\u062E\u0645',
- '\uFD70': '\u0636\u062E\u0645',
- '\uFD71': '\u0637\u0645\u062D',
- '\uFD72': '\u0637\u0645\u062D',
- '\uFD73': '\u0637\u0645\u0645',
- '\uFD74': '\u0637\u0645\u064A',
- '\uFD75': '\u0639\u062C\u0645',
- '\uFD76': '\u0639\u0645\u0645',
- '\uFD77': '\u0639\u0645\u0645',
- '\uFD78': '\u0639\u0645\u0649',
- '\uFD79': '\u063A\u0645\u0645',
- '\uFD7A': '\u063A\u0645\u064A',
- '\uFD7B': '\u063A\u0645\u0649',
- '\uFD7C': '\u0641\u062E\u0645',
- '\uFD7D': '\u0641\u062E\u0645',
- '\uFD7E': '\u0642\u0645\u062D',
- '\uFD7F': '\u0642\u0645\u0645',
- '\uFD80': '\u0644\u062D\u0645',
- '\uFD81': '\u0644\u062D\u064A',
- '\uFD82': '\u0644\u062D\u0649',
- '\uFD83': '\u0644\u062C\u062C',
- '\uFD84': '\u0644\u062C\u062C',
- '\uFD85': '\u0644\u062E\u0645',
- '\uFD86': '\u0644\u062E\u0645',
- '\uFD87': '\u0644\u0645\u062D',
- '\uFD88': '\u0644\u0645\u062D',
- '\uFD89': '\u0645\u062D\u062C',
- '\uFD8A': '\u0645\u062D\u0645',
- '\uFD8B': '\u0645\u062D\u064A',
- '\uFD8C': '\u0645\u062C\u062D',
- '\uFD8D': '\u0645\u062C\u0645',
- '\uFD8E': '\u0645\u062E\u062C',
- '\uFD8F': '\u0645\u062E\u0645',
- '\uFD92': '\u0645\u062C\u062E',
- '\uFD93': '\u0647\u0645\u062C',
- '\uFD94': '\u0647\u0645\u0645',
- '\uFD95': '\u0646\u062D\u0645',
- '\uFD96': '\u0646\u062D\u0649',
- '\uFD97': '\u0646\u062C\u0645',
- '\uFD98': '\u0646\u062C\u0645',
- '\uFD99': '\u0646\u062C\u0649',
- '\uFD9A': '\u0646\u0645\u064A',
- '\uFD9B': '\u0646\u0645\u0649',
- '\uFD9C': '\u064A\u0645\u0645',
- '\uFD9D': '\u064A\u0645\u0645',
- '\uFD9E': '\u0628\u062E\u064A',
- '\uFD9F': '\u062A\u062C\u064A',
- '\uFDA0': '\u062A\u062C\u0649',
- '\uFDA1': '\u062A\u062E\u064A',
- '\uFDA2': '\u062A\u062E\u0649',
- '\uFDA3': '\u062A\u0645\u064A',
- '\uFDA4': '\u062A\u0645\u0649',
- '\uFDA5': '\u062C\u0645\u064A',
- '\uFDA6': '\u062C\u062D\u0649',
- '\uFDA7': '\u062C\u0645\u0649',
- '\uFDA8': '\u0633\u062E\u0649',
- '\uFDA9': '\u0635\u062D\u064A',
- '\uFDAA': '\u0634\u062D\u064A',
- '\uFDAB': '\u0636\u062D\u064A',
- '\uFDAC': '\u0644\u062C\u064A',
- '\uFDAD': '\u0644\u0645\u064A',
- '\uFDAE': '\u064A\u062D\u064A',
- '\uFDAF': '\u064A\u062C\u064A',
- '\uFDB0': '\u064A\u0645\u064A',
- '\uFDB1': '\u0645\u0645\u064A',
- '\uFDB2': '\u0642\u0645\u064A',
- '\uFDB3': '\u0646\u062D\u064A',
- '\uFDB4': '\u0642\u0645\u062D',
- '\uFDB5': '\u0644\u062D\u0645',
- '\uFDB6': '\u0639\u0645\u064A',
- '\uFDB7': '\u0643\u0645\u064A',
- '\uFDB8': '\u0646\u062C\u062D',
- '\uFDB9': '\u0645\u062E\u064A',
- '\uFDBA': '\u0644\u062C\u0645',
- '\uFDBB': '\u0643\u0645\u0645',
- '\uFDBC': '\u0644\u062C\u0645',
- '\uFDBD': '\u0646\u062C\u062D',
- '\uFDBE': '\u062C\u062D\u064A',
- '\uFDBF': '\u062D\u062C\u064A',
- '\uFDC0': '\u0645\u062C\u064A',
- '\uFDC1': '\u0641\u0645\u064A',
- '\uFDC2': '\u0628\u062D\u064A',
- '\uFDC3': '\u0643\u0645\u0645',
- '\uFDC4': '\u0639\u062C\u0645',
- '\uFDC5': '\u0635\u0645\u0645',
- '\uFDC6': '\u0633\u062E\u064A',
- '\uFDC7': '\u0646\u062C\u064A',
- '\uFE49': '\u203E',
- '\uFE4A': '\u203E',
- '\uFE4B': '\u203E',
- '\uFE4C': '\u203E',
- '\uFE4D': '\u005F',
- '\uFE4E': '\u005F',
- '\uFE4F': '\u005F',
- '\uFE80': '\u0621',
- '\uFE81': '\u0622',
- '\uFE82': '\u0622',
- '\uFE83': '\u0623',
- '\uFE84': '\u0623',
- '\uFE85': '\u0624',
- '\uFE86': '\u0624',
- '\uFE87': '\u0625',
- '\uFE88': '\u0625',
- '\uFE89': '\u0626',
- '\uFE8A': '\u0626',
- '\uFE8B': '\u0626',
- '\uFE8C': '\u0626',
- '\uFE8D': '\u0627',
- '\uFE8E': '\u0627',
- '\uFE8F': '\u0628',
- '\uFE90': '\u0628',
- '\uFE91': '\u0628',
- '\uFE92': '\u0628',
- '\uFE93': '\u0629',
- '\uFE94': '\u0629',
- '\uFE95': '\u062A',
- '\uFE96': '\u062A',
- '\uFE97': '\u062A',
- '\uFE98': '\u062A',
- '\uFE99': '\u062B',
- '\uFE9A': '\u062B',
- '\uFE9B': '\u062B',
- '\uFE9C': '\u062B',
- '\uFE9D': '\u062C',
- '\uFE9E': '\u062C',
- '\uFE9F': '\u062C',
- '\uFEA0': '\u062C',
- '\uFEA1': '\u062D',
- '\uFEA2': '\u062D',
- '\uFEA3': '\u062D',
- '\uFEA4': '\u062D',
- '\uFEA5': '\u062E',
- '\uFEA6': '\u062E',
- '\uFEA7': '\u062E',
- '\uFEA8': '\u062E',
- '\uFEA9': '\u062F',
- '\uFEAA': '\u062F',
- '\uFEAB': '\u0630',
- '\uFEAC': '\u0630',
- '\uFEAD': '\u0631',
- '\uFEAE': '\u0631',
- '\uFEAF': '\u0632',
- '\uFEB0': '\u0632',
- '\uFEB1': '\u0633',
- '\uFEB2': '\u0633',
- '\uFEB3': '\u0633',
- '\uFEB4': '\u0633',
- '\uFEB5': '\u0634',
- '\uFEB6': '\u0634',
- '\uFEB7': '\u0634',
- '\uFEB8': '\u0634',
- '\uFEB9': '\u0635',
- '\uFEBA': '\u0635',
- '\uFEBB': '\u0635',
- '\uFEBC': '\u0635',
- '\uFEBD': '\u0636',
- '\uFEBE': '\u0636',
- '\uFEBF': '\u0636',
- '\uFEC0': '\u0636',
- '\uFEC1': '\u0637',
- '\uFEC2': '\u0637',
- '\uFEC3': '\u0637',
- '\uFEC4': '\u0637',
- '\uFEC5': '\u0638',
- '\uFEC6': '\u0638',
- '\uFEC7': '\u0638',
- '\uFEC8': '\u0638',
- '\uFEC9': '\u0639',
- '\uFECA': '\u0639',
- '\uFECB': '\u0639',
- '\uFECC': '\u0639',
- '\uFECD': '\u063A',
- '\uFECE': '\u063A',
- '\uFECF': '\u063A',
- '\uFED0': '\u063A',
- '\uFED1': '\u0641',
- '\uFED2': '\u0641',
- '\uFED3': '\u0641',
- '\uFED4': '\u0641',
- '\uFED5': '\u0642',
- '\uFED6': '\u0642',
- '\uFED7': '\u0642',
- '\uFED8': '\u0642',
- '\uFED9': '\u0643',
- '\uFEDA': '\u0643',
- '\uFEDB': '\u0643',
- '\uFEDC': '\u0643',
- '\uFEDD': '\u0644',
- '\uFEDE': '\u0644',
- '\uFEDF': '\u0644',
- '\uFEE0': '\u0644',
- '\uFEE1': '\u0645',
- '\uFEE2': '\u0645',
- '\uFEE3': '\u0645',
- '\uFEE4': '\u0645',
- '\uFEE5': '\u0646',
- '\uFEE6': '\u0646',
- '\uFEE7': '\u0646',
- '\uFEE8': '\u0646',
- '\uFEE9': '\u0647',
- '\uFEEA': '\u0647',
- '\uFEEB': '\u0647',
- '\uFEEC': '\u0647',
- '\uFEED': '\u0648',
- '\uFEEE': '\u0648',
- '\uFEEF': '\u0649',
- '\uFEF0': '\u0649',
- '\uFEF1': '\u064A',
- '\uFEF2': '\u064A',
- '\uFEF3': '\u064A',
- '\uFEF4': '\u064A',
- '\uFEF5': '\u0644\u0622',
- '\uFEF6': '\u0644\u0622',
- '\uFEF7': '\u0644\u0623',
- '\uFEF8': '\u0644\u0623',
- '\uFEF9': '\u0644\u0625',
- '\uFEFA': '\u0644\u0625',
- '\uFEFB': '\u0644\u0627',
- '\uFEFC': '\u0644\u0627'
-};
-
-function reverseIfRtl(chars) {
- var charsLength = chars.length;
- //reverse an arabic ligature
- if (charsLength <= 1 || !isRTLRangeFor(chars.charCodeAt(0)))
- return chars;
-
- var s = '';
- for (var ii = charsLength - 1; ii >= 0; ii--)
- s += chars[ii];
- return s;
-}
-
-function fontCharsToUnicode(charCodes, font) {
- var glyphs = font.charsToGlyphs(charCodes);
- var result = '';
- for (var i = 0, ii = glyphs.length; i < ii; i++) {
- var glyph = glyphs[i];
- if (!glyph)
- continue;
-
- var glyphUnicode = glyph.unicode;
- if (glyphUnicode in NormalizedUnicodes)
- glyphUnicode = NormalizedUnicodes[glyphUnicode];
- result += reverseIfRtl(glyphUnicode);
- }
- return result;
-}
-
-/**
- * 'Font' is the class the outside world should use, it encapsulate all the font
- * decoding logics whatever type it is (assuming the font type is supported).
- *
- * For example to read a Type1 font and to attach it to the document:
- * var type1Font = new Font("MyFontName", binaryFile, propertiesObject);
- * type1Font.bind();
- */
-var Font = (function FontClosure() {
- function Font(name, file, properties) {
- if (arguments.length === 1) {
- // importing translated data
- var data = arguments[0];
- for (var i in data) {
- this[i] = data[i];
- }
- return;
- }
-
- this.name = name;
- this.loadedName = properties.loadedName;
- this.coded = properties.coded;
- this.loadCharProcs = properties.coded;
- this.sizes = [];
-
- var names = name.split('+');
- names = names.length > 1 ? names[1] : names[0];
- names = names.split(/[-,_]/g)[0];
- this.isSerifFont = !!(properties.flags & FontFlags.Serif);
- this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);
- this.isMonospace = !!(properties.flags & FontFlags.FixedPitch);
-
- var type = properties.type;
- this.type = type;
-
- this.fallbackName = this.isMonospace ? 'monospace' :
- this.isSerifFont ? 'serif' : 'sans-serif';
-
- this.differences = properties.differences;
- this.widths = properties.widths;
- this.defaultWidth = properties.defaultWidth;
- this.composite = properties.composite;
- this.wideChars = properties.wideChars;
- this.hasEncoding = properties.hasEncoding;
-
- this.fontMatrix = properties.fontMatrix;
- this.widthMultiplier = 1.0;
- if (properties.type == 'Type3') {
- this.encoding = properties.baseEncoding;
- return;
- }
-
- // Trying to fix encoding using glyph CIDSystemInfo.
- this.loadCidToUnicode(properties);
-
- if (properties.toUnicode)
- this.toUnicode = properties.toUnicode;
- else
- this.rebuildToUnicode(properties);
-
- this.toFontChar = this.buildToFontChar(this.toUnicode);
-
- if (!file) {
- // The file data is not specified. Trying to fix the font name
- // to be used with the canvas.font.
- var fontName = name.replace(/[,_]/g, '-');
- fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName;
-
- this.bold = (fontName.search(/bold/gi) != -1);
- this.italic = (fontName.search(/oblique/gi) != -1) ||
- (fontName.search(/italic/gi) != -1);
-
- // Use 'name' instead of 'fontName' here because the original
- // name ArialBlack for example will be replaced by Helvetica.
- this.black = (name.search(/Black/g) != -1);
-
- this.encoding = properties.baseEncoding;
- this.noUnicodeAdaptation = true;
- this.loadedName = fontName.split('-')[0];
- this.loading = false;
- return;
- }
-
- // Some fonts might use wrong font types for Type1C or CIDFontType0C
- var subtype = properties.subtype;
- if (subtype == 'Type1C' && (type != 'Type1' && type != 'MMType1'))
- type = 'Type1';
- if (subtype == 'CIDFontType0C' && type != 'CIDFontType0')
- type = 'CIDFontType0';
-
- var data;
- switch (type) {
- case 'Type1':
- case 'CIDFontType0':
- this.mimetype = 'font/opentype';
-
- var cff = (subtype == 'Type1C' || subtype == 'CIDFontType0C') ?
- new CFFFont(file, properties) : new Type1Font(name, file, properties);
-
- // Wrap the CFF data inside an OTF font file
- data = this.convert(name, cff, properties);
- break;
-
- case 'TrueType':
- case 'CIDFontType2':
- this.mimetype = 'font/opentype';
-
- // Repair the TrueType file. It is can be damaged in the point of
- // view of the sanitizer
- data = this.checkAndRepair(name, file, properties);
- break;
-
- default:
- warn('Font ' + properties.type + ' is not supported');
- break;
- }
-
- this.data = data;
- this.fontMatrix = properties.fontMatrix;
- this.widthMultiplier = !properties.fontMatrix ? 1.0 :
- 1.0 / properties.fontMatrix[0];
- this.encoding = properties.baseEncoding;
- this.loading = true;
- };
-
- var numFonts = 0;
- function getUniqueName() {
- return 'pdfFont' + numFonts++;
- }
-
- function stringToArray(str) {
- var array = [];
- for (var i = 0, ii = str.length; i < ii; ++i)
- array[i] = str.charCodeAt(i);
-
- return array;
- };
-
- function arrayToString(arr) {
- var str = '';
- for (var i = 0, ii = arr.length; i < ii; ++i)
- str += String.fromCharCode(arr[i]);
-
- return str;
- };
-
- function int16(bytes) {
- return (bytes[0] << 8) + (bytes[1] & 0xff);
- };
-
- function int32(bytes) {
- return (bytes[0] << 24) + (bytes[1] << 16) +
- (bytes[2] << 8) + (bytes[3] & 0xff);
- };
-
- function getMaxPower2(number) {
- var maxPower = 0;
- var value = number;
- while (value >= 2) {
- value /= 2;
- maxPower++;
- }
-
- value = 2;
- for (var i = 1; i < maxPower; i++)
- value *= 2;
- return value;
- };
-
- function string16(value) {
- return String.fromCharCode((value >> 8) & 0xff) +
- String.fromCharCode(value & 0xff);
- };
-
- function safeString16(value) {
- // clamp value to the 16-bit int range
- value = value > 0x7FFF ? 0x7FFF : value < -0x8000 ? -0x8000 : value;
- return String.fromCharCode((value >> 8) & 0xff) +
- String.fromCharCode(value & 0xff);
- };
-
- function string32(value) {
- return String.fromCharCode((value >> 24) & 0xff) +
- String.fromCharCode((value >> 16) & 0xff) +
- String.fromCharCode((value >> 8) & 0xff) +
- String.fromCharCode(value & 0xff);
- };
-
- function createOpenTypeHeader(sfnt, file, numTables) {
- // Windows hates the Mac TrueType sfnt version number
- if (sfnt == 'true')
- sfnt = string32(0x00010000);
-
- // sfnt version (4 bytes)
- var header = sfnt;
-
- // numTables (2 bytes)
- header += string16(numTables);
-
- // searchRange (2 bytes)
- var tablesMaxPower2 = getMaxPower2(numTables);
- var searchRange = tablesMaxPower2 * 16;
- header += string16(searchRange);
-
- // entrySelector (2 bytes)
- header += string16(Math.log(tablesMaxPower2) / Math.log(2));
-
- // rangeShift (2 bytes)
- header += string16(numTables * 16 - searchRange);
-
- file.file += header;
- file.virtualOffset += header.length;
- };
-
- function createTableEntry(file, tag, data) {
- // offset
- var offset = file.virtualOffset;
-
- // length
- var length = data.length;
-
- // Per spec tables must be 4-bytes align so add padding as needed
- while (data.length & 3)
- data.push(0x00);
-
- while (file.virtualOffset & 3)
- file.virtualOffset++;
-
- // checksum
- var checksum = 0, n = data.length;
- for (var i = 0; i < n; i += 4)
- checksum = (checksum + int32([data[i], data[i + 1], data[i + 2],
- data[i + 3]])) | 0;
-
- var tableEntry = (tag + string32(checksum) +
- string32(offset) + string32(length));
- file.file += tableEntry;
- file.virtualOffset += data.length;
- };
-
- function getRanges(glyphs) {
- // Array.sort() sorts by characters, not numerically, so convert to an
- // array of characters.
- var codes = [];
- var length = glyphs.length;
- for (var n = 0; n < length; ++n)
- codes.push({ unicode: glyphs[n].unicode, code: n });
- codes.sort(function fontGetRangesSort(a, b) {
- return a.unicode - b.unicode;
- });
-
- // Split the sorted codes into ranges.
- var ranges = [];
- for (var n = 0; n < length; ) {
- var start = codes[n].unicode;
- var codeIndices = [codes[n].code];
- ++n;
- var end = start;
- while (n < length && end + 1 == codes[n].unicode) {
- codeIndices.push(codes[n].code);
- ++end;
- ++n;
- }
- ranges.push([start, end, codeIndices]);
- }
-
- return ranges;
- };
-
- function createCMapTable(glyphs, deltas) {
- var ranges = getRanges(glyphs);
-
- var numTables = 1;
- var cmap = '\x00\x00' + // version
- string16(numTables) + // numTables
- '\x00\x03' + // platformID
- '\x00\x01' + // encodingID
- string32(4 + numTables * 8); // start of the table record
-
- var segCount = ranges.length + 1;
- var segCount2 = segCount * 2;
- var searchRange = getMaxPower2(segCount) * 2;
- var searchEntry = Math.log(segCount) / Math.log(2);
- var rangeShift = 2 * segCount - searchRange;
-
- // Fill up the 4 parallel arrays describing the segments.
- var startCount = '';
- var endCount = '';
- var idDeltas = '';
- var idRangeOffsets = '';
- var glyphsIds = '';
- var bias = 0;
-
- if (deltas) {
- for (var i = 0; i < segCount - 1; i++) {
- var range = ranges[i];
- var start = range[0];
- var end = range[1];
- var offset = (segCount - i) * 2 + bias * 2;
- bias += (end - start + 1);
-
- startCount += string16(start);
- endCount += string16(end);
- idDeltas += string16(0);
- idRangeOffsets += string16(offset);
-
- var codes = range[2];
- for (var j = 0, jj = codes.length; j < jj; ++j)
- glyphsIds += string16(deltas[codes[j]]);
- }
- } else {
- for (var i = 0; i < segCount - 1; i++) {
- var range = ranges[i];
- var start = range[0];
- var end = range[1];
- var startCode = range[2][0];
-
- startCount += string16(start);
- endCount += string16(end);
- idDeltas += string16((startCode - start + 1) & 0xFFFF);
- idRangeOffsets += string16(0);
- }
- }
-
- endCount += '\xFF\xFF';
- startCount += '\xFF\xFF';
- idDeltas += '\x00\x01';
- idRangeOffsets += '\x00\x00';
-
- var format314 = '\x00\x00' + // language
- string16(segCount2) +
- string16(searchRange) +
- string16(searchEntry) +
- string16(rangeShift) +
- endCount + '\x00\x00' + startCount +
- idDeltas + idRangeOffsets + glyphsIds;
-
- return stringToArray(cmap +
- '\x00\x04' + // format
- string16(format314.length + 4) + // length
- format314);
- };
-
- function createOS2Table(properties, charstrings, override) {
- override = override || {
- unitsPerEm: 0,
- yMax: 0,
- yMin: 0,
- ascent: 0,
- descent: 0
- };
-
- var ulUnicodeRange1 = 0;
- var ulUnicodeRange2 = 0;
- var ulUnicodeRange3 = 0;
- var ulUnicodeRange4 = 0;
-
- var firstCharIndex = null;
- var lastCharIndex = 0;
-
- if (charstrings) {
- for (var i = 0; i < charstrings.length; ++i) {
- var code = charstrings[i].unicode;
- if (firstCharIndex > code || !firstCharIndex)
- firstCharIndex = code;
- if (lastCharIndex < code)
- lastCharIndex = code;
-
- var position = getUnicodeRangeFor(code);
- if (position < 32) {
- ulUnicodeRange1 |= 1 << position;
- } else if (position < 64) {
- ulUnicodeRange2 |= 1 << position - 32;
- } else if (position < 96) {
- ulUnicodeRange3 |= 1 << position - 64;
- } else if (position < 123) {
- ulUnicodeRange4 |= 1 << position - 96;
- } else {
- error('Unicode ranges Bits > 123 are reserved for internal usage');
- }
- }
- } else {
- // TODO
- firstCharIndex = 0;
- lastCharIndex = 255;
- }
-
- var unitsPerEm = override.unitsPerEm || kPDFGlyphSpaceUnits;
- var typoAscent = override.ascent || properties.ascent;
- var typoDescent = override.descent || properties.descent;
- var winAscent = override.yMax || typoAscent;
- var winDescent = -override.yMin || -typoDescent;
-
- // if there is a units per em value but no other override
- // then scale the calculated ascent
- if (unitsPerEm != kPDFGlyphSpaceUnits &&
- 'undefined' == typeof(override.ascent)) {
- // if the font units differ to the PDF glyph space units
- // then scale up the values
- typoAscent = Math.round(typoAscent * unitsPerEm / kPDFGlyphSpaceUnits);
- typoDescent = Math.round(typoDescent * unitsPerEm / kPDFGlyphSpaceUnits);
- winAscent = typoAscent;
- winDescent = -typoDescent;
- }
-
- return '\x00\x03' + // version
- '\x02\x24' + // xAvgCharWidth
- '\x01\xF4' + // usWeightClass
- '\x00\x05' + // usWidthClass
- '\x00\x00' + // fstype (0 to let the font loads via font-face on IE)
- '\x02\x8A' + // ySubscriptXSize
- '\x02\xBB' + // ySubscriptYSize
- '\x00\x00' + // ySubscriptXOffset
- '\x00\x8C' + // ySubscriptYOffset
- '\x02\x8A' + // ySuperScriptXSize
- '\x02\xBB' + // ySuperScriptYSize
- '\x00\x00' + // ySuperScriptXOffset
- '\x01\xDF' + // ySuperScriptYOffset
- '\x00\x31' + // yStrikeOutSize
- '\x01\x02' + // yStrikeOutPosition
- '\x00\x00' + // sFamilyClass
- '\x00\x00\x06' +
- String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) +
- '\x00\x00\x00\x00\x00\x00' + // Panose
- string32(ulUnicodeRange1) + // ulUnicodeRange1 (Bits 0-31)
- string32(ulUnicodeRange2) + // ulUnicodeRange2 (Bits 32-63)
- string32(ulUnicodeRange3) + // ulUnicodeRange3 (Bits 64-95)
- string32(ulUnicodeRange4) + // ulUnicodeRange4 (Bits 96-127)
- '\x2A\x32\x31\x2A' + // achVendID
- string16(properties.italicAngle ? 1 : 0) + // fsSelection
- string16(firstCharIndex ||
- properties.firstChar) + // usFirstCharIndex
- string16(lastCharIndex || properties.lastChar) + // usLastCharIndex
- string16(typoAscent) + // sTypoAscender
- string16(typoDescent) + // sTypoDescender
- '\x00\x64' + // sTypoLineGap (7%-10% of the unitsPerEM value)
- string16(winAscent) + // usWinAscent
- string16(winDescent) + // usWinDescent
- '\x00\x00\x00\x00' + // ulCodePageRange1 (Bits 0-31)
- '\x00\x00\x00\x00' + // ulCodePageRange2 (Bits 32-63)
- string16(properties.xHeight) + // sxHeight
- string16(properties.capHeight) + // sCapHeight
- string16(0) + // usDefaultChar
- string16(firstCharIndex || properties.firstChar) + // usBreakChar
- '\x00\x03'; // usMaxContext
- };
-
- function createPostTable(properties) {
- var angle = Math.floor(properties.italicAngle * (Math.pow(2, 16)));
- return '\x00\x03\x00\x00' + // Version number
- string32(angle) + // italicAngle
- '\x00\x00' + // underlinePosition
- '\x00\x00' + // underlineThickness
- string32(properties.fixedPitch) + // isFixedPitch
- '\x00\x00\x00\x00' + // minMemType42
- '\x00\x00\x00\x00' + // maxMemType42
- '\x00\x00\x00\x00' + // minMemType1
- '\x00\x00\x00\x00'; // maxMemType1
- };
-
- function createNameTable(name) {
- var strings = [
- 'Original licence', // 0.Copyright
- name, // 1.Font family
- 'Unknown', // 2.Font subfamily (font weight)
- 'uniqueID', // 3.Unique ID
- name, // 4.Full font name
- 'Version 0.11', // 5.Version
- '', // 6.Postscript name
- 'Unknown', // 7.Trademark
- 'Unknown', // 8.Manufacturer
- 'Unknown' // 9.Designer
- ];
-
- // Mac want 1-byte per character strings while Windows want
- // 2-bytes per character, so duplicate the names table
- var stringsUnicode = [];
- for (var i = 0, ii = strings.length; i < ii; i++) {
- var str = strings[i];
-
- var strUnicode = '';
- for (var j = 0, jj = str.length; j < jj; j++)
- strUnicode += string16(str.charCodeAt(j));
- stringsUnicode.push(strUnicode);
- }
-
- var names = [strings, stringsUnicode];
- var platforms = ['\x00\x01', '\x00\x03'];
- var encodings = ['\x00\x00', '\x00\x01'];
- var languages = ['\x00\x00', '\x04\x09'];
-
- var namesRecordCount = strings.length * platforms.length;
- var nameTable =
- '\x00\x00' + // format
- string16(namesRecordCount) + // Number of names Record
- string16(namesRecordCount * 12 + 6); // Storage
-
- // Build the name records field
- var strOffset = 0;
- for (var i = 0, ii = platforms.length; i < ii; i++) {
- var strs = names[i];
- for (var j = 0, jj = strs.length; j < jj; j++) {
- var str = strs[j];
- var nameRecord =
- platforms[i] + // platform ID
- encodings[i] + // encoding ID
- languages[i] + // language ID
- string16(j) + // name ID
- string16(str.length) +
- string16(strOffset);
- nameTable += nameRecord;
- strOffset += str.length;
- }
- }
-
- nameTable += strings.join('') + stringsUnicode.join('');
- return nameTable;
- }
-
- Font.prototype = {
- name: null,
- font: null,
- mimetype: null,
- encoding: null,
-
- exportData: function Font_exportData() {
- var data = {};
- for (var i in this) {
- if (this.hasOwnProperty(i))
- data[i] = this[i];
- }
- return data;
- },
-
- checkAndRepair: function Font_checkAndRepair(name, font, properties) {
- function readTableEntry(file) {
- var tag = file.getBytes(4);
- tag = String.fromCharCode(tag[0]) +
- String.fromCharCode(tag[1]) +
- String.fromCharCode(tag[2]) +
- String.fromCharCode(tag[3]);
-
- var checksum = int32(file.getBytes(4));
- var offset = int32(file.getBytes(4));
- var length = int32(file.getBytes(4));
-
- // Read the table associated data
- var previousPosition = file.pos;
- file.pos = file.start ? file.start : 0;
- file.skip(offset);
- var data = file.getBytes(length);
- file.pos = previousPosition;
-
- if (tag == 'head') {
- // clearing checksum adjustment
- data[8] = data[9] = data[10] = data[11] = 0;
- data[17] |= 0x20; //Set font optimized for cleartype flag
- }
-
- return {
- tag: tag,
- checksum: checksum,
- length: length,
- offset: offset,
- data: data
- };
- };
-
- function readOpenTypeHeader(ttf) {
- return {
- version: arrayToString(ttf.getBytes(4)),
- numTables: int16(ttf.getBytes(2)),
- searchRange: int16(ttf.getBytes(2)),
- entrySelector: int16(ttf.getBytes(2)),
- rangeShift: int16(ttf.getBytes(2))
- };
- };
-
- function createGlyphNameMap(glyphs, ids, properties) {
- var glyphNames = properties.glyphNames;
- if (!glyphNames) {
- properties.glyphNameMap = {};
- return;
- }
- var glyphsLength = glyphs.length;
- var glyphNameMap = {};
- var encoding = [];
- for (var i = 0; i < glyphsLength; ++i) {
- var glyphName = glyphNames[ids[i]];
- if (!glyphName)
- continue;
- var unicode = glyphs[i].unicode;
- glyphNameMap[glyphName] = unicode;
- var code = glyphs[i].code;
- encoding[code] = glyphName;
- }
- properties.glyphNameMap = glyphNameMap;
- if (!properties.hasEncoding)
- properties.baseEncoding = encoding;
- }
-
- function readCMapTable(cmap, font) {
- var start = (font.start ? font.start : 0) + cmap.offset;
- font.pos = start;
-
- var version = int16(font.getBytes(2));
- var numRecords = int16(font.getBytes(2));
-
- var records = [];
- for (var i = 0; i < numRecords; i++) {
- records.push({
- platformID: int16(font.getBytes(2)),
- encodingID: int16(font.getBytes(2)),
- offset: int32(font.getBytes(4))
- });
- }
-
- // Check that table are sorted by platformID then encodingID,
- records.sort(function fontReadCMapTableSort(a, b) {
- return ((a.platformID << 16) + a.encodingID) -
- ((b.platformID << 16) + b.encodingID);
- });
-
- var tables = [records[0]];
- for (var i = 1; i < numRecords; i++) {
- // The sanitizer will drop the font if 2 tables have the same
- // platformID and the same encodingID, this will be correct for
- // most cases but if the font has been made for Mac it could
- // exist a few platformID: 1, encodingID: 0 but with a different
- // language field and that's correct. But the sanitizer does not
- // seem to support this case.
- var current = records[i];
- var previous = records[i - 1];
- if (((current.platformID << 16) + current.encodingID) <=
- ((previous.platformID << 16) + previous.encodingID))
- continue;
- tables.push(current);
- }
-
- var missing = numRecords - tables.length;
- if (missing) {
- numRecords = tables.length;
- var data = string16(version) + string16(numRecords);
-
- for (var i = 0; i < numRecords; i++) {
- var table = tables[i];
- data += string16(table.platformID) +
- string16(table.encodingID) +
- string32(table.offset);
- }
-
- for (var i = 0, ii = data.length; i < ii; i++)
- cmap.data[i] = data.charCodeAt(i);
- }
-
- for (var i = 0; i < numRecords; i++) {
- var table = tables[i];
- font.pos = start + table.offset;
-
- var format = int16(font.getBytes(2));
- var length = int16(font.getBytes(2));
- var language = int16(font.getBytes(2));
-
- if (format == 0) {
- // Characters below 0x20 are controls characters that are hardcoded
- // into the platform so if some characters in the font are assigned
- // under this limit they will not be displayed so let's rewrite the
- // CMap.
- var glyphs = [];
- var ids = [];
- for (var j = 0; j < 256; j++) {
- var index = font.getByte();
- if (index) {
- glyphs.push({ unicode: j, code: j });
- ids.push(index);
- }
- }
- return {
- glyphs: glyphs,
- ids: ids,
- hasShortCmap: true
- };
- } else if (format == 4) {
- // re-creating the table in format 4 since the encoding
- // might be changed
- var segCount = (int16(font.getBytes(2)) >> 1);
- font.getBytes(6); // skipping range fields
- var segIndex, segments = [];
- for (segIndex = 0; segIndex < segCount; segIndex++) {
- segments.push({ end: int16(font.getBytes(2)) });
- }
- font.getBytes(2);
- for (segIndex = 0; segIndex < segCount; segIndex++) {
- segments[segIndex].start = int16(font.getBytes(2));
- }
-
- for (segIndex = 0; segIndex < segCount; segIndex++) {
- segments[segIndex].delta = int16(font.getBytes(2));
- }
-
- var offsetsCount = 0;
- for (segIndex = 0; segIndex < segCount; segIndex++) {
- var segment = segments[segIndex];
- var rangeOffset = int16(font.getBytes(2));
- if (!rangeOffset) {
- segment.offsetIndex = -1;
- continue;
- }
-
- var offsetIndex = (rangeOffset >> 1) - (segCount - segIndex);
- segment.offsetIndex = offsetIndex;
- offsetsCount = Math.max(offsetsCount, offsetIndex +
- segment.end - segment.start + 1);
- }
-
- var offsets = [];
- for (var j = 0; j < offsetsCount; j++)
- offsets.push(int16(font.getBytes(2)));
-
- var glyphs = [], ids = [];
-
- for (segIndex = 0; segIndex < segCount; segIndex++) {
- var segment = segments[segIndex];
- var start = segment.start, end = segment.end;
- var delta = segment.delta, offsetIndex = segment.offsetIndex;
-
- for (var j = start; j <= end; j++) {
- if (j == 0xFFFF)
- continue;
-
- var glyphCode = offsetIndex < 0 ? j :
- offsets[offsetIndex + j - start];
- glyphCode = (glyphCode + delta) & 0xFFFF;
- if (glyphCode == 0)
- continue;
-
- glyphs.push({ unicode: j, code: j });
- ids.push(glyphCode);
- }
- }
-
- return {
- glyphs: glyphs,
- ids: ids
- };
- } else if (format == 6) {
- // Format 6 is a 2-bytes dense mapping, which means the font data
- // lives glue together even if they are pretty far in the unicode
- // table. (This looks weird, so I can have missed something), this
- // works on Linux but seems to fails on Mac so let's rewrite the
- // cmap table to a 3-1-4 style
- var firstCode = int16(font.getBytes(2));
- var entryCount = int16(font.getBytes(2));
-
- var glyphs = [];
- var ids = [];
- for (var j = 0; j < entryCount; j++) {
- var glyphCode = int16(font.getBytes(2));
- var code = firstCode + j;
-
- glyphs.push({ unicode: code, code: code });
- ids.push(glyphCode);
- }
-
- return {
- glyphs: glyphs,
- ids: ids
- };
- }
- }
- error('Unsupported cmap table format');
- };
-
- function sanitizeMetrics(font, header, metrics, numGlyphs) {
- if (!header && !metrics)
- return;
-
- // The vhea/vmtx tables are not required, so it happens that
- // some fonts embed a vmtx table without a vhea table. In this
- // situation the sanitizer assume numOfLongVerMetrics = 1. As
- // a result it tries to read numGlyphs - 1 SHORT from the vmtx
- // table, and if it is not possible, the font is rejected.
- // So remove the vmtx table if there is no vhea table.
- if (!header && metrics) {
- metrics.data = null;
- return;
- }
-
- font.pos = (font.start ? font.start : 0) + header.offset;
- font.pos += header.length - 2;
- var numOfMetrics = int16(font.getBytes(2));
-
- var numOfSidebearings = numGlyphs - numOfMetrics;
- var numMissing = numOfSidebearings -
- ((hmtx.length - numOfMetrics * 4) >> 1);
- if (numMissing > 0) {
- font.pos = (font.start ? font.start : 0) + metrics.offset;
- var entries = '';
- for (var i = 0, ii = hmtx.length; i < ii; i++)
- entries += String.fromCharCode(font.getByte());
- for (var i = 0; i < numMissing; i++)
- entries += '\x00\x00';
- metrics.data = stringToArray(entries);
- }
- };
-
- function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart) {
- if (sourceEnd - sourceStart <= 12) {
- // glyph with data less than 12 is invalid one
- return 0;
- }
- var glyf = source.subarray(sourceStart, sourceEnd);
- var contoursCount = (glyf[0] << 8) | glyf[1];
- if (contoursCount & 0x8000) {
- // complex glyph, writing as is
- dest.set(glyf, destStart);
- return glyf.length;
- }
-
- var j = 10, flagsCount = 0;
- for (var i = 0; i < contoursCount; i++) {
- var endPoint = (glyf[j] << 8) | glyf[j + 1];
- flagsCount = endPoint + 1;
- j += 2;
- }
- // skipping instructions
- var instructionsLength = (glyf[j] << 8) | glyf[j + 1];
- j += 2 + instructionsLength;
- // validating flags
- var coordinatesLength = 0;
- for (var i = 0; i < flagsCount; i++) {
- var flag = glyf[j++];
- if (flag & 0xC0) {
- // reserved flags must be zero, rejecting
- return 0;
- }
- var xyLength = ((flag & 2) ? 1 : (flag & 16) ? 0 : 2) +
- ((flag & 4) ? 1 : (flag & 32) ? 0 : 2);
- coordinatesLength += xyLength;
- if (flag & 8) {
- var repeat = glyf[j++];
- i += repeat;
- coordinatesLength += repeat * xyLength;
- }
- }
- var glyphDataLength = j + coordinatesLength;
- if (glyphDataLength > glyf.length) {
- // not enough data for coordinates
- return 0;
- }
- if (glyf.length - glyphDataLength > 3) {
- // truncating and aligning to 4 bytes the long glyph data
- glyphDataLength = (glyphDataLength + 3) & ~3;
- dest.set(glyf.subarray(0, glyphDataLength), destStart);
- return glyphDataLength;
- }
- // glyph data is fine
- dest.set(glyf, destStart);
- return glyf.length;
- }
-
- function sanitizeGlyphLocations(loca, glyf, numGlyphs,
- isGlyphLocationsLong) {
- var itemSize, itemDecode, itemEncode;
- if (isGlyphLocationsLong) {
- itemSize = 4;
- itemDecode = function fontItemDecodeLong(data, offset) {
- return (data[offset] << 24) | (data[offset + 1] << 16) |
- (data[offset + 2] << 8) | data[offset + 3];
- };
- itemEncode = function fontItemEncodeLong(data, offset, value) {
- data[offset] = (value >>> 24) & 0xFF;
- data[offset + 1] = (value >> 16) & 0xFF;
- data[offset + 2] = (value >> 8) & 0xFF;
- data[offset + 3] = value & 0xFF;
- };
- } else {
- itemSize = 2;
- itemDecode = function fontItemDecode(data, offset) {
- return (data[offset] << 9) | (data[offset + 1] << 1);
- };
- itemEncode = function fontItemEncode(data, offset, value) {
- data[offset] = (value >> 9) & 0xFF;
- data[offset + 1] = (value >> 1) & 0xFF;
- };
- }
- var locaData = loca.data;
- // removing the invalid glyphs
- var oldGlyfData = glyf.data;
- var oldGlyfDataLength = oldGlyfData.length;
- var newGlyfData = new Uint8Array(oldGlyfDataLength);
- var startOffset = itemDecode(locaData, 0);
- var writeOffset = 0;
- itemEncode(locaData, 0, writeOffset);
- for (var i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) {
- var endOffset = itemDecode(locaData, j);
- if (endOffset > oldGlyfDataLength) {
- // glyph end offset points outside glyf data, rejecting the glyph
- itemEncode(locaData, j, writeOffset);
- startOffset = endOffset;
- continue;
- }
-
- var newLength = sanitizeGlyph(oldGlyfData, startOffset, endOffset,
- newGlyfData, writeOffset);
- writeOffset += newLength;
- itemEncode(locaData, j, writeOffset);
- startOffset = endOffset;
- }
-
- if (writeOffset == 0) {
- // glyf table cannot be empty -- redoing the glyf and loca tables
- // to have single glyph with one point
- var simpleGlyph = new Uint8Array(
- [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]);
- for (var i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize)
- itemEncode(locaData, j, simpleGlyph.length);
- glyf.data = simpleGlyph;
- return;
- }
-
- glyf.data = newGlyfData.subarray(0, writeOffset);
- }
-
- function findEmptyGlyphs(locaTable, isGlyphLocationsLong, emptyGlyphIds) {
- var itemSize, itemDecode;
- if (isGlyphLocationsLong) {
- itemSize = 4;
- itemDecode = function fontItemDecodeLong(data, offset) {
- return (data[offset] << 24) | (data[offset + 1] << 16) |
- (data[offset + 2] << 8) | data[offset + 3];
- };
- } else {
- itemSize = 2;
- itemDecode = function fontItemDecode(data, offset) {
- return (data[offset] << 9) | (data[offset + 1] << 1);
- };
- }
- var data = locaTable.data, length = data.length;
- var lastOffset = itemDecode(data, 0);
- for (var i = itemSize, j = 0; i < length; i += itemSize, j++) {
- var offset = itemDecode(data, i);
- if (offset == lastOffset)
- emptyGlyphIds[j] = true;
- lastOffset = offset;
- }
- }
-
- function readGlyphNameMap(post, properties) {
- var start = (font.start ? font.start : 0) + post.offset;
- font.pos = start;
-
- var length = post.length, end = start + length;
- var version = int32(font.getBytes(4));
- // skip rest to the tables
- font.getBytes(28);
-
- var glyphNames;
- switch (version) {
- case 0x00010000:
- glyphNames = MacStandardGlyphOrdering;
- break;
- case 0x00020000:
- var numGlyphs = int16(font.getBytes(2));
- var glyphNameIndexes = [];
- for (var i = 0; i < numGlyphs; ++i)
- glyphNameIndexes.push(int16(font.getBytes(2)));
- var customNames = [];
- while (font.pos < end) {
- var stringLength = font.getByte();
- var string = '';
- for (var i = 0; i < stringLength; ++i)
- string += font.getChar();
- customNames.push(string);
- }
- glyphNames = [];
- for (var i = 0; i < numGlyphs; ++i) {
- var j = glyphNameIndexes[i];
- if (j < 258) {
- glyphNames.push(MacStandardGlyphOrdering[j]);
- continue;
- }
- glyphNames.push(customNames[j - 258]);
- }
- break;
- case 0x00030000:
- break;
- default:
- warn('Unknown/unsupported post table version ' + version);
- break;
- }
- properties.glyphNames = glyphNames;
- }
-
- function isOS2Valid(os2Table) {
- var data = os2Table.data;
- // usWinAscent == 0 makes font unreadable by windows
- var usWinAscent = (data[74] << 8) | data[75];
- if (usWinAscent == 0)
- return false;
-
- return true;
- }
-
- // Check that required tables are present
- var requiredTables = ['OS/2', 'cmap', 'head', 'hhea',
- 'hmtx', 'maxp', 'name', 'post'];
-
- var header = readOpenTypeHeader(font);
- var numTables = header.numTables;
-
- var cmap, post, maxp, hhea, hmtx, vhea, vmtx, head, loca, glyf, os2;
- var tables = [];
- for (var i = 0; i < numTables; i++) {
- var table = readTableEntry(font);
- var index = requiredTables.indexOf(table.tag);
- if (index != -1) {
- if (table.tag == 'cmap')
- cmap = table;
- else if (table.tag == 'post')
- post = table;
- else if (table.tag == 'maxp')
- maxp = table;
- else if (table.tag == 'hhea')
- hhea = table;
- else if (table.tag == 'hmtx')
- hmtx = table;
- else if (table.tag == 'head')
- head = table;
- else if (table.tag == 'OS/2')
- os2 = table;
-
- requiredTables.splice(index, 1);
- } else {
- if (table.tag == 'vmtx')
- vmtx = table;
- else if (table.tag == 'vhea')
- vhea = table;
- else if (table.tag == 'loca')
- loca = table;
- else if (table.tag == 'glyf')
- glyf = table;
- }
- tables.push(table);
- }
-
- var numTables = tables.length + requiredTables.length;
-
- // header and new offsets. Table entry information is appended to the
- // end of file. The virtualOffset represents where to put the actual
- // data of a particular table;
- var ttf = {
- file: '',
- virtualOffset: numTables * (4 * 4)
- };
-
- // The new numbers of tables will be the last one plus the num
- // of missing tables
- createOpenTypeHeader(header.version, ttf, numTables);
-
- // Invalid OS/2 can break the font for the Windows
- if (os2 && !isOS2Valid(os2)) {
- tables.splice(tables.indexOf(os2), 1);
- os2 = null;
- }
-
- // Ensure the [h/v]mtx tables contains the advance width and
- // sidebearings information for numGlyphs in the maxp table
- font.pos = (font.start || 0) + maxp.offset;
- var version = int16(font.getBytes(4));
- var numGlyphs = int16(font.getBytes(2));
-
- sanitizeMetrics(font, hhea, hmtx, numGlyphs);
- sanitizeMetrics(font, vhea, vmtx, numGlyphs);
-
- var isGlyphLocationsLong = int16([head.data[50], head.data[51]]);
- if (head && loca && glyf) {
- sanitizeGlyphLocations(loca, glyf, numGlyphs, isGlyphLocationsLong);
- }
-
- var emptyGlyphIds = [];
- if (glyf)
- findEmptyGlyphs(loca, isGlyphLocationsLong, emptyGlyphIds);
-
- // Sanitizer reduces the glyph advanceWidth to the maxAdvanceWidth
- // Sometimes it's 0. That needs to be fixed
- if (hhea.data[10] == 0 && hhea.data[11] == 0) {
- hhea.data[10] = 0xFF;
- hhea.data[11] = 0xFF;
- }
-
- // The 'post' table has glyphs names.
- if (post) {
- readGlyphNameMap(post, properties);
- }
-
- var glyphs, ids;
- if (properties.type == 'CIDFontType2') {
- // Replace the old CMAP table with a shiny new one
- // Type2 composite fonts map characters directly to glyphs so the cmap
- // table must be replaced.
- // canvas fillText will reencode some characters even if the font has a
- // glyph at that position - e.g. newline is converted to a space and
- // U+00AD (soft hyphen) is not drawn.
- // So, offset all the glyphs by 0xFF to avoid these cases and use
- // the encoding to map incoming characters to the new glyph positions
- if (!cmap) {
- cmap = {
- tag: 'cmap',
- data: null
- };
- tables.push(cmap);
- }
-
- var cidToGidMap = properties.cidToGidMap || [];
- var gidToCidMap = [0];
- if (cidToGidMap.length > 0) {
- for (var j = cidToGidMap.length - 1; j >= 0; j--) {
- var gid = cidToGidMap[j];
- if (gid)
- gidToCidMap[gid] = j;
- }
- // filling the gaps using CID above the CIDs currently used in font
- var nextCid = cidToGidMap.length;
- for (var i = 1; i < numGlyphs; i++) {
- if (!gidToCidMap[i])
- gidToCidMap[i] = nextCid++;
- }
- }
-
- glyphs = [];
- ids = [];
-
- var usedUnicodes = [];
- var unassignedUnicodeItems = [];
- for (var i = 1; i < numGlyphs; i++) {
- var cid = gidToCidMap[i] || i;
- var unicode = this.toFontChar[cid];
- if (!unicode || typeof unicode !== 'number' ||
- isSpecialUnicode(unicode) || unicode in usedUnicodes) {
- unassignedUnicodeItems.push(i);
- continue;
- }
- usedUnicodes[unicode] = true;
- glyphs.push({ unicode: unicode, code: cid });
- ids.push(i);
- }
- // trying to fit as many unassigned symbols as we can
- // in the range allocated for the user defined symbols
- var unusedUnicode = kCmapGlyphOffset;
- for (var j = 0, jj = unassignedUnicodeItems.length; j < jj; j++) {
- var i = unassignedUnicodeItems[j];
- var cid = gidToCidMap[i] || i;
- while (unusedUnicode in usedUnicodes)
- unusedUnicode++;
- if (unusedUnicode >= kCmapGlyphOffset + kSizeOfGlyphArea)
- break;
- var unicode = unusedUnicode++;
- this.toFontChar[cid] = unicode;
- usedUnicodes[unicode] = true;
- glyphs.push({ unicode: unicode, code: cid });
- ids.push(i);
- }
- } else {
- var cmapTable = readCMapTable(cmap, font);
-
- glyphs = cmapTable.glyphs;
- ids = cmapTable.ids;
-
- var hasShortCmap = !!cmapTable.hasShortCmap;
- var toFontChar = this.toFontChar;
-
- if (hasShortCmap && ids.length == numGlyphs) {
- // Fixes the short cmap tables -- some generators use incorrect
- // glyph id.
- for (var i = 0, ii = ids.length; i < ii; i++)
- ids[i] = i;
- }
-
- var unusedUnicode = kCmapGlyphOffset;
- var glyphNames = properties.glyphNames || [];
- var encoding = properties.baseEncoding;
- var differences = properties.differences;
- if (toFontChar && toFontChar.length > 0) {
- // checking if cmap is just identity map
- var isIdentity = true;
- for (var i = 0, ii = glyphs.length; i < ii; i++) {
- if (glyphs[i].unicode != i + 1) {
- isIdentity = false;
- break;
- }
- }
- // if it is, replacing with meaningful toUnicode values
- if (isIdentity && !this.isSymbolicFont) {
- var usedUnicodes = [], unassignedUnicodeItems = [];
- for (var i = 0, ii = glyphs.length; i < ii; i++) {
- var unicode = toFontChar[i + 1];
- if (!unicode || typeof unicode !== 'number' ||
- unicode in usedUnicodes) {
- unassignedUnicodeItems.push(i);
- continue;
- }
- glyphs[i].unicode = unicode;
- usedUnicodes[unicode] = true;
- }
- for (var j = 0, jj = unassignedUnicodeItems.length; j < jj; j++) {
- var i = unassignedUnicodeItems[j];
- while (unusedUnicode in usedUnicodes)
- unusedUnicode++;
- var cid = i + 1;
- // override only if unicode mapping is not specified
- if (!(cid in toFontChar))
- toFontChar[cid] = unusedUnicode;
- glyphs[i].unicode = unusedUnicode++;
- }
- this.useToFontChar = true;
- }
- }
-
- // remove glyph references outside range of avaialable glyphs or empty
- var glyphsRemoved = 0;
- for (var i = ids.length - 1; i >= 0; i--) {
- if (ids[i] < numGlyphs &&
- (!emptyGlyphIds[ids[i]] || this.isSymbolicFont))
- continue;
- ids.splice(i, 1);
- glyphs.splice(i, 1);
- glyphsRemoved++;
- }
-
- // checking if it's a "true" symbolic font
- if (this.isSymbolicFont) {
- var minUnicode = 0xFFFF, maxUnicode = 0;
- for (var i = 0, ii = glyphs.length; i < ii; i++) {
- var unicode = glyphs[i].unicode;
- minUnicode = Math.min(minUnicode, unicode);
- maxUnicode = Math.max(maxUnicode, unicode);
- }
- // high byte must be the same for min and max unicodes
- if ((maxUnicode & 0xFF00) != (minUnicode & 0xFF00))
- this.isSymbolicFont = false;
- }
-
- // heuristics: if removed more than 10 glyphs encoding WinAnsiEncoding
- // does not set properly (broken PDFs have about 100 removed glyphs)
- if (glyphsRemoved > 10) {
- warn('Switching TrueType encoding to MacRomanEncoding for ' +
- this.name + ' font');
- encoding = Encodings.MacRomanEncoding;
- }
-
- if (hasShortCmap && this.hasEncoding && !this.isSymbolicFont) {
- // Re-encode short map encoding to unicode -- that simplifies the
- // resolution of MacRoman encoded glyphs logic for TrueType fonts:
- // copying all characters to private use area, all mapping all known
- // glyphs to the unicodes. The glyphs and ids arrays will grow.
- var usedUnicodes = [];
- for (var i = 0, ii = glyphs.length; i < ii; i++) {
- var code = glyphs[i].unicode;
- var gid = ids[i];
- glyphs[i].unicode += kCmapGlyphOffset;
- toFontChar[code] = glyphs[i].unicode;
-
- var glyphName = glyphNames[gid] || encoding[code];
- if (glyphName in GlyphsUnicode) {
- var unicode = GlyphsUnicode[glyphName];
- if (unicode in usedUnicodes)
- continue;
-
- usedUnicodes[unicode] = true;
- glyphs.push({
- unicode: unicode,
- code: glyphs[i].code
- });
- ids.push(gid);
- toFontChar[code] = unicode;
- }
- }
- this.useToFontChar = true;
- } else if (!this.isSymbolicFont && (this.hasEncoding ||
- properties.glyphNames || differences.length > 0)) {
- // Re-encode cmap encoding to unicode, based on the 'post' table data
- // diffrence array or base encoding
- var reverseMap = [];
- for (var i = 0, ii = glyphs.length; i < ii; i++)
- reverseMap[glyphs[i].unicode] = i;
-
- var newGlyphUnicodes = [];
- for (var i = 0, ii = glyphs.length; i < ii; i++) {
- var code = glyphs[i].unicode;
- var changeCode = false;
- var gid = ids[i];
-
- var glyphName = glyphNames[gid];
- if (!glyphName) {
- glyphName = differences[code] || encoding[code];
- changeCode = true;
- }
- if (glyphName in GlyphsUnicode) {
- var unicode = GlyphsUnicode[glyphName];
- if (!unicode || reverseMap[unicode] === i)
- continue; // unknown glyph name or in its own place
-
- newGlyphUnicodes[i] = unicode;
- if (changeCode)
- toFontChar[code] = unicode;
- delete reverseMap[code];
- }
- }
- for (var index in newGlyphUnicodes) {
- if (newGlyphUnicodes.hasOwnProperty(index)) {
- var unicode = newGlyphUnicodes[index];
- if (reverseMap[unicode]) {
- // avoiding assigning to the same unicode
- glyphs[index].unicode = unusedUnicode++;
- continue;
- }
- glyphs[index].unicode = unicode;
- reverseMap[unicode] = index;
- }
- }
- this.useToFontChar = true;
- }
-
- // Moving all symbolic font glyphs into 0xF000 - 0xF0FF range.
- if (this.isSymbolicFont) {
- for (var i = 0, ii = glyphs.length; i < ii; i++) {
- var code = glyphs[i].unicode & 0xFF;
- var fontCharCode = kSymbolicFontGlyphOffset | code;
- glyphs[i].unicode = toFontChar[code] = fontCharCode;
- }
- this.useToFontChar = true;
- }
-
- createGlyphNameMap(glyphs, ids, properties);
- this.glyphNameMap = properties.glyphNameMap;
- }
-
- // Converting glyphs and ids into font's cmap table
- cmap.data = createCMapTable(glyphs, ids);
- var unicodeIsEnabled = [];
- for (var i = 0, ii = glyphs.length; i < ii; i++) {
- unicodeIsEnabled[glyphs[i].unicode] = true;
- }
- this.unicodeIsEnabled = unicodeIsEnabled;
-
- if (!os2) {
- // extract some more font properties from the OpenType head and
- // hhea tables; yMin and descent value are always negative
- var override = {
- unitsPerEm: int16([head.data[18], head.data[19]]),
- yMax: int16([head.data[42], head.data[43]]),
- yMin: int16([head.data[38], head.data[39]]) - 0x10000,
- ascent: int16([hhea.data[4], hhea.data[5]]),
- descent: int16([hhea.data[6], hhea.data[7]]) - 0x10000
- };
-
- tables.push({
- tag: 'OS/2',
- data: stringToArray(createOS2Table(properties, glyphs, override))
- });
- }
-
- // Rewrite the 'post' table if needed
- if (requiredTables.indexOf('post') != -1) {
- tables.push({
- tag: 'post',
- data: stringToArray(createPostTable(properties))
- });
- }
-
- // Rewrite the 'name' table if needed
- if (requiredTables.indexOf('name') != -1) {
- tables.push({
- tag: 'name',
- data: stringToArray(createNameTable(this.name))
- });
- }
-
- // Tables needs to be written by ascendant alphabetic order
- tables.sort(function tables_sort(a, b) {
- return (a.tag > b.tag) - (a.tag < b.tag);
- });
-
- // rewrite the tables but tweak offsets
- for (var i = 0, ii = tables.length; i < ii; i++) {
- var table = tables[i];
- var data = [];
-
- var tableData = table.data;
- for (var j = 0, jj = tableData.length; j < jj; j++)
- data.push(tableData[j]);
- createTableEntry(ttf, table.tag, data);
- }
-
- // Add the table datas
- for (var i = 0, ii = tables.length; i < ii; i++) {
- var table = tables[i];
- var tableData = table.data;
- ttf.file += arrayToString(tableData);
-
- // 4-byte aligned data
- while (ttf.file.length & 3)
- ttf.file += String.fromCharCode(0);
- }
-
- return stringToArray(ttf.file);
- },
-
- convert: function Font_convert(fontName, font, properties) {
- function isFixedPitch(glyphs) {
- for (var i = 0, ii = glyphs.length - 1; i < ii; i++) {
- if (glyphs[i] != glyphs[i + 1])
- return false;
- }
- return true;
- }
-
- // The offsets object holds at the same time a representation of where
- // to write the table entry information about a table and another offset
- // representing the offset where to draw the actual data of a particular
- // table
- var kRequiredTablesCount = 9;
-
- var otf = {
- file: '',
- virtualOffset: 9 * (4 * 4)
- };
-
- createOpenTypeHeader('\x4F\x54\x54\x4F', otf, 9);
-
- var charstrings = font.charstrings;
- properties.fixedPitch = isFixedPitch(charstrings);
-
- var glyphNameMap = {};
- for (var i = 0; i < charstrings.length; ++i) {
- var charstring = charstrings[i];
- glyphNameMap[charstring.glyph] = charstring.unicode;
- }
- this.glyphNameMap = glyphNameMap;
-
- if (!properties.hasEncoding && (properties.subtype == 'Type1C' ||
- properties.subtype == 'CIDFontType0C')) {
- var encoding = [];
- for (var i = 0; i < charstrings.length; ++i) {
- var charstring = charstrings[i];
- encoding[charstring.code] = charstring.glyph;
- }
- properties.baseEncoding = encoding;
- }
- if (properties.subtype == 'CIDFontType0C') {
- var toFontChar = [];
- for (var i = 0; i < charstrings.length; ++i) {
- var charstring = charstrings[i];
- toFontChar[charstring.code] = charstring.unicode;
- }
- this.toFontChar = toFontChar;
- }
- var unitsPerEm = properties.unitsPerEm || 1000; // defaulting to 1000
-
- var fields = {
- // PostScript Font Program
- 'CFF ': font.data,
-
- // OS/2 and Windows Specific metrics
- 'OS/2': stringToArray(createOS2Table(properties, charstrings)),
-
- // Character to glyphs mapping
- 'cmap': createCMapTable(charstrings.slice(),
- ('glyphIds' in font) ? font.glyphIds : null),
-
- // Font header
- 'head': (function fontFieldsHead() {
- return stringToArray(
- '\x00\x01\x00\x00' + // Version number
- '\x00\x00\x10\x00' + // fontRevision
- '\x00\x00\x00\x00' + // checksumAdjustement
- '\x5F\x0F\x3C\xF5' + // magicNumber
- '\x00\x00' + // Flags
- safeString16(unitsPerEm) + // unitsPerEM
- '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // creation date
- '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // modifification date
- '\x00\x00' + // xMin
- safeString16(properties.descent) + // yMin
- '\x0F\xFF' + // xMax
- safeString16(properties.ascent) + // yMax
- string16(properties.italicAngle ? 2 : 0) + // macStyle
- '\x00\x11' + // lowestRecPPEM
- '\x00\x00' + // fontDirectionHint
- '\x00\x00' + // indexToLocFormat
- '\x00\x00'); // glyphDataFormat
- })(),
-
- // Horizontal header
- 'hhea': (function fontFieldsHhea() {
- return stringToArray(
- '\x00\x01\x00\x00' + // Version number
- safeString16(properties.ascent) + // Typographic Ascent
- safeString16(properties.descent) + // Typographic Descent
- '\x00\x00' + // Line Gap
- '\xFF\xFF' + // advanceWidthMax
- '\x00\x00' + // minLeftSidebearing
- '\x00\x00' + // minRightSidebearing
- '\x00\x00' + // xMaxExtent
- safeString16(properties.capHeight) + // caretSlopeRise
- safeString16(Math.tan(properties.italicAngle) *
- properties.xHeight) + // caretSlopeRun
- '\x00\x00' + // caretOffset
- '\x00\x00' + // -reserved-
- '\x00\x00' + // -reserved-
- '\x00\x00' + // -reserved-
- '\x00\x00' + // -reserved-
- '\x00\x00' + // metricDataFormat
- string16(charstrings.length + 1)); // Number of HMetrics
- })(),
-
- // Horizontal metrics
- 'hmtx': (function fontFieldsHmtx() {
- var hmtx = '\x00\x00\x00\x00'; // Fake .notdef
- for (var i = 0, ii = charstrings.length; i < ii; i++) {
- var charstring = charstrings[i];
- var width = 'width' in charstring ? charstring.width : 0;
- hmtx += string16(width) + string16(0);
- }
- return stringToArray(hmtx);
- })(),
-
- // Maximum profile
- 'maxp': (function fontFieldsMaxp() {
- return stringToArray(
- '\x00\x00\x50\x00' + // Version number
- string16(charstrings.length + 1)); // Num of glyphs
- })(),
-
- // Naming tables
- 'name': stringToArray(createNameTable(fontName)),
-
- // PostScript informations
- 'post': stringToArray(createPostTable(properties))
- };
-
- for (var field in fields)
- createTableEntry(otf, field, fields[field]);
-
- for (var field in fields) {
- var table = fields[field];
- otf.file += arrayToString(table);
- }
-
- return stringToArray(otf.file);
- },
-
- buildToFontChar: function Font_buildToFontChar(toUnicode) {
- var result = [];
- var unusedUnicode = kCmapGlyphOffset;
- for (var i = 0, ii = toUnicode.length; i < ii; i++) {
- var unicode = toUnicode[i];
- var fontCharCode = typeof unicode === 'object' ? unusedUnicode++ :
- unicode;
- if (typeof unicode !== 'undefined')
- result[i] = fontCharCode;
- }
- return result;
- },
-
- rebuildToUnicode: function Font_rebuildToUnicode(properties) {
- var firstChar = properties.firstChar, lastChar = properties.lastChar;
- var map = [];
- if (properties.composite) {
- var isIdentityMap = this.cidToUnicode.length == 0;
- for (var i = firstChar, ii = lastChar; i <= ii; i++) {
- // TODO missing map the character according font's CMap
- var cid = i;
- map[i] = isIdentityMap ? cid : this.cidToUnicode[cid];
- }
- } else {
- for (var i = firstChar, ii = lastChar; i <= ii; i++) {
- var glyph = properties.differences[i];
- if (!glyph)
- glyph = properties.baseEncoding[i];
- if (!!glyph && (glyph in GlyphsUnicode))
- map[i] = GlyphsUnicode[glyph];
- }
- }
- this.toUnicode = map;
- },
-
- loadCidToUnicode: function Font_loadCidToUnicode(properties) {
- if (!properties.cidSystemInfo)
- return;
-
- var cidToUnicodeMap = [], unicodeToCIDMap = [];
- this.cidToUnicode = cidToUnicodeMap;
- this.unicodeToCID = unicodeToCIDMap;
-
- var cidSystemInfo = properties.cidSystemInfo;
- var cidToUnicode;
- if (cidSystemInfo) {
- cidToUnicode = CIDToUnicodeMaps[
- cidSystemInfo.registry + '-' + cidSystemInfo.ordering];
- }
-
- if (!cidToUnicode)
- return; // identity encoding
-
- var cid = 1, i, j, k, ii;
- for (i = 0, ii = cidToUnicode.length; i < ii; ++i) {
- var unicode = cidToUnicode[i];
- if (isArray(unicode)) {
- var length = unicode.length;
- for (j = 0; j < length; j++) {
- cidToUnicodeMap[cid] = unicode[j];
- unicodeToCIDMap[unicode[j]] = cid;
- }
- cid++;
- } else if (typeof unicode === 'object') {
- var fillLength = unicode.f;
- if (fillLength) {
- k = unicode.c;
- for (j = 0; j < fillLength; ++j) {
- cidToUnicodeMap[cid] = k;
- unicodeToCIDMap[k] = cid;
- cid++;
- k++;
- }
- } else
- cid += unicode.s;
- } else if (unicode) {
- cidToUnicodeMap[cid] = unicode;
- unicodeToCIDMap[unicode] = cid;
- cid++;
- } else
- cid++;
- }
- },
-
- bindDOM: function Font_bindDOM() {
- if (!this.data)
- return null;
-
- var data = bytesToString(this.data);
- var fontName = this.loadedName;
-
- // Add the font-face rule to the document
- var url = ('url(data:' + this.mimetype + ';base64,' +
- window.btoa(data) + ');');
- var rule = "@font-face { font-family:'" + fontName + "';src:" + url + '}';
-
- var styleElement = document.getElementById('PDFJS_FONT_STYLE_TAG');
- if (!styleElement) {
- styleElement = document.createElement('style');
- styleElement.id = 'PDFJS_FONT_STYLE_TAG';
- document.documentElement.getElementsByTagName('head')[0].appendChild(
- styleElement);
- }
-
- var styleSheet = styleElement.sheet;
- styleSheet.insertRule(rule, styleSheet.cssRules.length);
-
- if (PDFJS.pdfBug && 'FontInspector' in globalScope &&
- globalScope['FontInspector'].enabled)
- globalScope['FontInspector'].fontAdded(this, url);
-
- return rule;
- },
-
- get spaceWidth() {
- if ('_shadowWidth' in this) {
- return this._shadowWidth;
- }
-
- // trying to estimate space character width
- var possibleSpaceReplacements = ['space', 'minus', 'one', 'i'];
- var width;
- for (var i = 0, ii = possibleSpaceReplacements.length; i < ii; i++) {
- var glyphName = possibleSpaceReplacements[i];
- // if possible, getting width by glyph name
- if (glyphName in this.widths) {
- width = this.widths[glyphName];
- break;
- }
- var glyphUnicode = GlyphsUnicode[glyphName];
- // finding the charcode via unicodeToCID map
- var charcode = 0;
- if (this.composite)
- charcode = this.unicodeToCID[glyphUnicode];
- // ... via toUnicode map
- if (!charcode && 'toUnicode' in this)
- charcode = this.toUnicode.indexOf(glyphUnicode);
- // setting it to unicode if negative or undefined
- if (!(charcode > 0))
- charcode = glyphUnicode;
- // trying to get width via charcode
- width = this.widths[charcode];
- if (width)
- break; // the non-zero width found
- }
- width = (width || this.defaultWidth) * this.widthMultiplier;
- // Do not shadow the property here. See discussion:
- // https://github.com/mozilla/pdf.js/pull/2127#discussion_r1662280
- this._shadowWidth = width;
- return width;
- },
-
- charToGlyph: function Font_charToGlyph(charcode) {
- var fontCharCode, width, operatorList, disabled;
-
- var width = this.widths[charcode];
-
- switch (this.type) {
- case 'CIDFontType0':
- if (this.noUnicodeAdaptation) {
- width = this.widths[this.unicodeToCID[charcode] || charcode];
- fontCharCode = mapPrivateUseChars(charcode);
- break;
- }
- fontCharCode = this.toFontChar[charcode] || charcode;
- break;
- case 'CIDFontType2':
- if (this.noUnicodeAdaptation) {
- width = this.widths[this.unicodeToCID[charcode] || charcode];
- fontCharCode = mapPrivateUseChars(charcode);
- break;
- }
- fontCharCode = this.toFontChar[charcode] || charcode;
- break;
- case 'Type1':
- var glyphName = this.differences[charcode] || this.encoding[charcode];
- if (!isNum(width))
- width = this.widths[glyphName];
- if (this.noUnicodeAdaptation) {
- fontCharCode = mapPrivateUseChars(GlyphsUnicode[glyphName] ||
- charcode);
- break;
- }
- fontCharCode = this.glyphNameMap[glyphName] ||
- GlyphsUnicode[glyphName] || charcode;
- break;
- case 'Type3':
- var glyphName = this.differences[charcode] || this.encoding[charcode];
- operatorList = this.charProcOperatorList[glyphName];
- fontCharCode = charcode;
- break;
- case 'TrueType':
- if (this.useToFontChar) {
- fontCharCode = this.toFontChar[charcode] || charcode;
- break;
- }
- var glyphName = this.differences[charcode] || this.encoding[charcode];
- if (!glyphName)
- glyphName = Encodings.StandardEncoding[charcode];
- if (!isNum(width))
- width = this.widths[glyphName];
- if (this.noUnicodeAdaptation) {
- fontCharCode = GlyphsUnicode[glyphName] || charcode;
- break;
- }
- if (!this.hasEncoding || this.isSymbolicFont) {
- fontCharCode = this.useToFontChar ? this.toFontChar[charcode] :
- charcode;
- break;
- }
-
- // MacRoman encoding address by re-encoding the cmap table
-
- fontCharCode = glyphName in this.glyphNameMap ?
- this.glyphNameMap[glyphName] : GlyphsUnicode[glyphName];
- break;
- default:
- warn('Unsupported font type: ' + this.type);
- break;
- }
-
- var unicodeChars = !('toUnicode' in this) ? charcode :
- this.toUnicode[charcode] || charcode;
- if (typeof unicodeChars === 'number')
- unicodeChars = String.fromCharCode(unicodeChars);
-
- width = (isNum(width) ? width : this.defaultWidth) * this.widthMultiplier;
- disabled = this.unicodeIsEnabled ?
- !this.unicodeIsEnabled[fontCharCode] : false;
-
- return {
- fontChar: String.fromCharCode(fontCharCode),
- unicode: unicodeChars,
- width: width,
- disabled: disabled,
- operatorList: operatorList
- };
- },
-
- charsToGlyphs: function Font_charsToGlyphs(chars) {
- var charsCache = this.charsCache;
- var glyphs;
-
- // if we translated this string before, just grab it from the cache
- if (charsCache) {
- glyphs = charsCache[chars];
- if (glyphs)
- return glyphs;
- }
-
- // lazily create the translation cache
- if (!charsCache)
- charsCache = this.charsCache = Object.create(null);
-
- glyphs = [];
-
- if (this.wideChars) {
- // composite fonts have multi-byte strings convert the string from
- // single-byte to multi-byte
- // XXX assuming CIDFonts are two-byte - later need to extract the
- // correct byte encoding according to the PDF spec
- var length = chars.length - 1; // looping over two bytes at a time so
- // loop should never end on the last byte
- for (var i = 0; i < length; i++) {
- var charcode = int16([chars.charCodeAt(i++), chars.charCodeAt(i)]);
- var glyph = this.charToGlyph(charcode);
- glyphs.push(glyph);
- // placing null after each word break charcode (ASCII SPACE)
- if (charcode == 0x20)
- glyphs.push(null);
- }
- }
- else {
- for (var i = 0, ii = chars.length; i < ii; ++i) {
- var charcode = chars.charCodeAt(i);
- var glyph = this.charToGlyph(charcode);
- glyphs.push(glyph);
- if (charcode == 0x20)
- glyphs.push(null);
- }
- }
-
- // Enter the translated string into the cache
- return (charsCache[chars] = glyphs);
- }
- };
-
- return Font;
-})();
-
-var ErrorFont = (function ErrorFontClosure() {
- function ErrorFont(error) {
- this.error = error;
- }
-
- ErrorFont.prototype = {
- charsToGlyphs: function ErrorFont_charsToGlyphs() {
- return [];
- }
- };
-
- return ErrorFont;
-})();
-
-var CallothersubrCmd = (function CallothersubrCmdClosure() {
- function CallothersubrCmd(index) {
- this.index = index;
- }
-
- return CallothersubrCmd;
-})();
-
-/*
- * Type1Parser encapsulate the needed code for parsing a Type1 font
- * program. Some of its logic depends on the Type2 charstrings
- * structure.
- */
-var Type1Parser = function type1Parser() {
- /*
- * Decrypt a Sequence of Ciphertext Bytes to Produce the Original Sequence
- * of Plaintext Bytes. The function took a key as a parameter which can be
- * for decrypting the eexec block of for decoding charStrings.
- */
- var kEexecEncryptionKey = 55665;
- var kCharStringsEncryptionKey = 4330;
-
- function decrypt(stream, key, discardNumber) {
- var r = key, c1 = 52845, c2 = 22719;
- var decryptedString = [];
-
- var value = '';
- var count = stream.length;
- for (var i = 0; i < count; i++) {
- value = stream[i];
- decryptedString[i] = value ^ (r >> 8);
- r = ((value + r) * c1 + c2) & ((1 << 16) - 1);
- }
- return decryptedString.slice(discardNumber);
- }
-
- /*
- * CharStrings are encoded following the the CharString Encoding sequence
- * describe in Chapter 6 of the "Adobe Type1 Font Format" specification.
- * The value in a byte indicates a command, a number, or subsequent bytes
- * that are to be interpreted in a special way.
- *
- * CharString Number Encoding:
- * A CharString byte containing the values from 32 through 255 inclusive
- * indicate an integer. These values are decoded in four ranges.
- *
- * 1. A CharString byte containing a value, v, between 32 and 246 inclusive,
- * indicate the integer v - 139. Thus, the integer values from -107 through
- * 107 inclusive may be encoded in single byte.
- *
- * 2. A CharString byte containing a value, v, between 247 and 250 inclusive,
- * indicates an integer involving the next byte, w, according to the formula:
- * [(v - 247) x 256] + w + 108
- *
- * 3. A CharString byte containing a value, v, between 251 and 254 inclusive,
- * indicates an integer involving the next byte, w, according to the formula:
- * -[(v - 251) * 256] - w - 108
- *
- * 4. A CharString containing the value 255 indicates that the next 4 bytes
- * are a two complement signed integer. The first of these bytes contains the
- * highest order bits, the second byte contains the next higher order bits
- * and the fourth byte contain the lowest order bits.
- *
- *
- * CharString Command Encoding:
- * CharStrings commands are encoded in 1 or 2 bytes.
- *
- * Single byte commands are encoded in 1 byte that contains a value between
- * 0 and 31 inclusive.
- * If a command byte contains the value 12, then the value in the next byte
- * indicates a command. This "escape" mechanism allows many extra commands
- * to be encoded and this encoding technique helps to minimize the length of
- * the charStrings.
- */
- var charStringDictionary = {
- '1': 'hstem',
- '3': 'vstem',
- '4': 'vmoveto',
- '5': 'rlineto',
- '6': 'hlineto',
- '7': 'vlineto',
- '8': 'rrcurveto',
-
- // closepath is a Type1 command that do not take argument and is useless
- // in Type2 and it can simply be ignored.
- '9': null, // closepath
-
- '10': 'callsubr',
-
- // return is normally used inside sub-routines to tells to the execution
- // flow that it can be back to normal.
- // During the translation process Type1 charstrings will be flattened and
- // sub-routines will be embedded directly into the charstring directly, so
- // this can be ignored safely.
- '11': 'return',
-
- '12': {
- // dotsection is a Type1 command to specify some hinting feature for dots
- // that do not take a parameter and it can safely be ignored for Type2.
- '0': null, // dotsection
-
- // [vh]stem3 are Type1 only and Type2 supports [vh]stem with multiple
- // parameters, so instead of returning [vh]stem3 take a shortcut and
- // return [vhstem] instead.
- '1': 'vstem',
- '2': 'hstem',
-
- '6': 'endchar', // seac
- // Type1 only command with command not (yet) built-in ,throw an error
- '7': -1, // sbw
-
- '11': 'sub',
- '12': 'div',
-
- // callothersubr is a mechanism to make calls on the postscript
- // interpreter, this is not supported by Type2 charstring but hopefully
- // most of the default commands can be ignored safely.
- '16': 'callothersubr',
-
- '17': 'pop',
-
- // setcurrentpoint sets the current point to x, y without performing a
- // moveto (this is a one shot positionning command). This is used only
- // with the return of an OtherSubrs call.
- // TODO Implement the OtherSubrs charstring embedding and replace this
- // call by a no-op, like 2 'pop' commands for example.
- '33': null // setcurrentpoint
- },
- '13': 'hsbw',
- '14': 'endchar',
- '21': 'rmoveto',
- '22': 'hmoveto',
- '30': 'vhcurveto',
- '31': 'hvcurveto'
- };
-
- var kEscapeCommand = 12;
-
- // Breaks up the stack by arguments and also calculates the value.
- function breakUpArgs(stack, numArgs) {
- var args = [];
- var index = stack.length - 1;
- for (var i = 0; i < numArgs; i++) {
- if (index < 0) {
- args.unshift({ arg: [0],
- value: 0,
- offset: 0 });
- warn('Malformed charstring stack: not enough values on stack.');
- continue;
- }
- var token = stack[index];
- if (token === 'div') {
- var a = stack[index - 2];
- var b = stack[index - 1];
- if (!isInt(a) || !isInt(b)) {
- warn('Malformed charsting stack: expected ints on stack for div.');
- a = 0;
- b = 1;
- }
- args.unshift({ arg: [a, b, 'div'],
- value: a / b,
- offset: index - 2 });
- index -= 3;
- } else if (isInt(token)) {
- args.unshift({ arg: stack.slice(index, index + 1),
- value: token,
- offset: index });
- index--;
- } else {
- warn('Malformed charsting stack: found bad token ' + token + '.');
- }
- }
- return args;
- }
-
- function decodeCharString(array) {
- var charstring = [];
- var lsb = 0;
- var width = 0;
- var flexState = 0;
-
- var value = '';
- var count = array.length;
- for (var i = 0; i < count; i++) {
- value = array[i];
-
- if (value < 32) {
- var command = null;
- if (value == kEscapeCommand) {
- var escape = array[++i];
-
- // TODO Clean this code
- if (escape == 16) {
- var index = charstring.pop();
- var argc = charstring.pop();
- for (var j = 0; j < argc; j++)
- charstring.push('drop');
-
- // If the flex mechanism is not used in a font program, Adobe
- // states that entries 0, 1 and 2 can simply be replaced by
- // {}, which means that we can simply ignore them.
- if (index < 3) {
- continue;
- }
-
- // This is the same things about hint replacement, if it is not used
- // entry 3 can be replaced by {3}
- // TODO support hint replacment
- if (index == 3) {
- charstring.push(3);
- i++;
- continue;
- }
-
- assert(argc == 0, 'callothersubr with arguments is not supported');
- charstring.push(new CallothersubrCmd(index));
- continue;
- } else if (escape == 17 || escape == 33) {
- // pop or setcurrentpoint commands can be ignored
- // since we are not doing callothersubr
- continue;
- } else if (escape == 6) {
- // seac is like type 2's special endchar but it doesn't use the
- // first argument asb, so remove it.
- var args = breakUpArgs(charstring, 5);
- var arg0 = args[0];
- charstring.splice(arg0.offset, arg0.arg.length);
- } else if (!kHintingEnabled && (escape == 1 || escape == 2)) {
- charstring.push('drop', 'drop', 'drop', 'drop', 'drop', 'drop');
- continue;
- }
-
- command = charStringDictionary['12'][escape];
- } else {
- if (value == 13) { // hsbw
- var args = breakUpArgs(charstring, 2);
- var arg0 = args[0];
- var arg1 = args[1];
- lsb = arg0.value;
- width = arg1.value;
- // To convert to type2 we have to move the width value to the first
- // part of the charstring and then use hmoveto with lsb.
- charstring = arg1.arg;
- charstring = charstring.concat(arg0.arg);
- charstring.push('hmoveto');
- continue;
- } else if (value == 10) { // callsubr
- if (charstring[charstring.length - 1] < 3) { // subr #0..2
- var subrNumber = charstring.pop();
- switch (subrNumber) {
- case 1:
- flexState = 1; // prepare for flex coordinates
- break;
- case 2:
- flexState = 2; // flex in progress
- break;
- case 0:
- // type2 flex command does not need final coords
- charstring.push('exch', 'drop', 'exch', 'drop');
- charstring.push('flex');
- flexState = 0;
- break;
- }
- continue;
- }
- } else if (value == 21 && flexState > 0) {
- if (flexState > 1)
- continue; // ignoring rmoveto
- value = 5; // first segment replacing with rlineto
- } else if (!kHintingEnabled && (value == 1 || value == 3)) {
- charstring.push('drop', 'drop');
- continue;
- }
- command = charStringDictionary[value];
- }
-
- // Some charstring commands are meaningless in Type2 and will return
- // a null, let's just ignored them
- if (!command && i < count) {
- continue;
- } else if (!command) {
- break;
- } else if (command == -1) {
- warn('Support for Type1 command ' + value +
- ' (' + escape + ') is not implemented in charstring: ' +
- charstring);
- if (value == 12) {
- // we know how to ignore only some the Type1 commands
- switch (escape) {
- case 7:
- charstring.push('drop', 'drop', 'drop', 'drop');
- continue;
- case 8:
- charstring.push('drop');
- continue;
- }
- }
- }
-
- value = command;
- } else if (value <= 246) {
- value = value - 139;
- } else if (value <= 250) {
- value = ((value - 247) * 256) + array[++i] + 108;
- } else if (value <= 254) {
- value = -((value - 251) * 256) - array[++i] - 108;
- } else {
- value = (array[++i] & 0xff) << 24 | (array[++i] & 0xff) << 16 |
- (array[++i] & 0xff) << 8 | (array[++i] & 0xff) << 0;
- }
-
- charstring.push(value);
- }
-
- return { charstring: charstring, width: width, lsb: lsb };
- }
-
- /*
- * Returns an object containing a Subrs array and a CharStrings
- * array extracted from and eexec encrypted block of data
- */
- function readNumberArray(str, index) {
- var start = index;
- while (str[index++] != '[')
- start++;
- start++;
-
- var count = 0;
- while (str[index++] != ']')
- count++;
-
- str = str.substr(start, count);
-
- str = str.trim();
- // Remove adjacent spaces
- str = str.replace(/\s+/g, ' ');
-
- var array = str.split(' ');
- for (var i = 0, ii = array.length; i < ii; i++)
- array[i] = parseFloat(array[i] || 0);
- return array;
- }
-
- function readNumber(str, index) {
- while (str[index] == ' ')
- index++;
-
- var start = index;
-
- var count = 0;
- while (str[index++] != ' ')
- count++;
-
- return parseFloat(str.substr(start, count) || 0);
- }
-
- function isSeparator(c) {
- return c == ' ' || c == '\n' || c == '\x0d';
- }
-
- this.extractFontProgram = function Type1Parser_extractFontProgram(stream) {
- var eexec = decrypt(stream, kEexecEncryptionKey, 4);
- var eexecStr = '';
- for (var i = 0, ii = eexec.length; i < ii; i++)
- eexecStr += String.fromCharCode(eexec[i]);
-
- var glyphsSection = false, subrsSection = false;
- var program = {
- subrs: [],
- charstrings: [],
- properties: {
- 'privateData': {
- 'lenIV': 4
- }
- }
- };
-
- var glyph = '';
- var token = '';
- var length = 0;
-
- var c = '';
- var count = eexecStr.length;
- for (var i = 0; i < count; i++) {
- var getToken = function getToken() {
- while (i < count && isSeparator(eexecStr[i]))
- ++i;
-
- var token = '';
- while (i < count && !isSeparator(eexecStr[i]))
- token += eexecStr[i++];
-
- return token;
- };
- var c = eexecStr[i];
-
- if ((glyphsSection || subrsSection) &&
- (token == 'RD' || token == '-|')) {
- i++;
- var data = eexec.slice(i, i + length);
- var lenIV = program.properties.privateData['lenIV'];
- var encoded = decrypt(data, kCharStringsEncryptionKey, lenIV);
- var str = decodeCharString(encoded);
-
- if (glyphsSection) {
- program.charstrings.push({
- glyph: glyph,
- data: str.charstring,
- lsb: str.lsb,
- width: str.width
- });
- } else {
- program.subrs.push(str.charstring);
- }
- i += length;
- token = '';
- } else if (isSeparator(c)) {
- length = parseInt(token, 10);
- token = '';
- } else {
- token += c;
- if (!glyphsSection) {
- switch (token) {
- case '/CharString':
- glyphsSection = true;
- break;
- case '/Subrs':
- ++i;
- var num = parseInt(getToken(), 10);
- getToken(); // read in 'array'
- for (var j = 0; j < num; ++j) {
- var t = getToken(); // read in 'dup'
- if (t == 'ND' || t == '|-' || t == 'noaccess')
- break;
- var index = parseInt(getToken(), 10);
- if (index > j)
- j = index;
- var length = parseInt(getToken(), 10);
- getToken(); // read in 'RD'
- var data = eexec.slice(i + 1, i + 1 + length);
- var lenIV = program.properties.privateData['lenIV'];
- var encoded = decrypt(data, kCharStringsEncryptionKey, lenIV);
- var str = decodeCharString(encoded);
- i = i + 1 + length;
- t = getToken(); // read in 'NP'
- if (t == 'noaccess')
- getToken(); // read in 'put'
- program.subrs[index] = str.charstring;
- }
- break;
- case '/BlueValues':
- case '/OtherBlues':
- case '/FamilyBlues':
- case '/FamilyOtherBlues':
- var blueArray = readNumberArray(eexecStr, i + 1);
- if (blueArray.length > 0 && (blueArray.length % 2) == 0)
- program.properties.privateData[token.substring(1)] = blueArray;
- break;
- case '/StemSnapH':
- case '/StemSnapV':
- program.properties.privateData[token.substring(1)] =
- readNumberArray(eexecStr, i + 1);
- break;
- case '/StdHW':
- case '/StdVW':
- program.properties.privateData[token.substring(1)] =
- readNumberArray(eexecStr, i + 2)[0];
- break;
- case '/BlueShift':
- case '/lenIV':
- case '/BlueFuzz':
- case '/BlueScale':
- case '/LanguageGroup':
- case '/ExpansionFactor':
- program.properties.privateData[token.substring(1)] =
- readNumber(eexecStr, i + 1);
- break;
- }
- } else if (c == '/') {
- token = glyph = '';
- while ((c = eexecStr[++i]) != ' ')
- glyph += c;
- }
- }
- }
-
- return program;
- };
-
- this.extractFontHeader = function Type1Parser_extractFontHeader(stream,
- properties) {
- var headerString = '';
- for (var i = 0, ii = stream.length; i < ii; i++)
- headerString += String.fromCharCode(stream[i]);
-
- var token = '';
- var count = headerString.length;
- for (var i = 0; i < count; i++) {
- var getToken = function getToken() {
- var character = headerString[i];
- while (i < count && (isSeparator(character) || character == '/'))
- character = headerString[++i];
-
- var token = '';
- while (i < count && !(isSeparator(character) || character == '/')) {
- token += character;
- character = headerString[++i];
- }
-
- return token;
- };
-
- var c = headerString[i];
- if (isSeparator(c)) {
- switch (token) {
- case '/FontMatrix':
- var matrix = readNumberArray(headerString, i + 1);
-
- // The FontMatrix is in unitPerEm, so make it pixels
- for (var j = 0, jj = matrix.length; j < jj; j++)
- matrix[j] *= 1000;
-
- // Make the angle into the right direction
- matrix[2] *= -1;
-
- properties.fontMatrix = matrix;
- break;
- case '/Encoding':
- var encodingArg = getToken();
- var encoding;
- if (!/^\d+$/.test(encodingArg)) {
- // encoding name is specified
- encoding = Encodings[encodingArg];
- } else {
- encoding = [];
- var size = parseInt(encodingArg, 10);
- getToken(); // read in 'array'
-
- for (var j = 0; j < size; j++) {
- var token = getToken();
- if (token == 'dup') {
- var index = parseInt(getToken(), 10);
- var glyph = getToken();
- encoding[index] = glyph;
- getToken(); // read the in 'put'
- }
- }
- }
- if (!properties.hasEncoding && encoding) {
- properties.baseEncoding = encoding;
- break;
- }
- break;
- }
- token = '';
- } else {
- token += c;
- }
- }
- };
-};
-
-/**
- * The CFF class takes a Type1 file and wrap it into a
- * 'Compact Font Format' which itself embed Type2 charstrings.
- */
-var CFFStandardStrings = [
- '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
- 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus',
- 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four',
- 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',
- 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
- 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
- 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum',
- 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
- 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
- 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent',
- 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
- 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
- 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl',
- 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase',
- 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown',
- 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent',
- 'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash',
- 'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae',
- 'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior',
- 'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn',
- 'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters',
- 'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior',
- 'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring',
- 'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave',
- 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute',
- 'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute',
- 'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron',
- 'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde',
- 'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute',
- 'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex',
- 'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex',
- 'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron', 'exclamsmall',
- 'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall',
- 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', '266 ff',
- 'onedotenleader', 'zerooldstyle', 'oneoldstyle', 'twooldstyle',
- 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle',
- 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'commasuperior',
- 'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior',
- 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior',
- 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
- 'tsuperior', 'ff', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior',
- 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall',
- 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall',
- 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall',
- 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',
- 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah',
- 'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall',
- 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall',
- 'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior',
- 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'questiondownsmall', 'oneeighth',
- 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds',
- 'zerosuperior', 'foursuperior', 'fivesuperior', 'sixsuperior',
- 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior',
- 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior',
- 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior',
- 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior',
- 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall',
- 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall',
- 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall',
- 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall',
- 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall',
- 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall',
- 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall',
- 'Thornsmall', 'Ydieresissmall', '001.000', '001.001', '001.002', '001.003',
- 'Black', 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold'
-];
-
-var type1Parser = new Type1Parser();
-
-// Type1Font is also a CIDFontType0.
-var Type1Font = function Type1Font(name, file, properties) {
- // Get the data block containing glyphs and subrs informations
- var headerBlock = file.getBytes(properties.length1);
- type1Parser.extractFontHeader(headerBlock, properties);
-
- // Decrypt the data blocks and retrieve it's content
- var eexecBlock = file.getBytes(properties.length2);
- var data = type1Parser.extractFontProgram(eexecBlock);
- for (var info in data.properties)
- properties[info] = data.properties[info];
-
- var charstrings = this.getOrderedCharStrings(data.charstrings, properties);
- var type2Charstrings = this.getType2Charstrings(charstrings);
- var subrs = this.getType2Subrs(data.subrs);
-
- this.charstrings = charstrings;
- this.data = this.wrap(name, type2Charstrings, this.charstrings,
- subrs, properties);
-};
-
-Type1Font.prototype = {
- createCFFIndexHeader: function Type1Font_createCFFIndexHeader(objects,
- isByte) {
- // First 2 bytes contains the number of objects contained into this index
- var count = objects.length;
-
- // If there is no object, just create an array saying that with another
- // offset byte.
- if (count == 0)
- return '\x00\x00\x00';
-
- var data = String.fromCharCode((count >> 8) & 0xFF, count & 0xff);
-
- // Next byte contains the offset size use to reference object in the file
- // Actually we're using 0x04 to be sure to be able to store everything
- // without thinking of it while coding.
- data += '\x04';
-
- // Add another offset after this one because we need a new offset
- var relativeOffset = 1;
- for (var i = 0; i < count + 1; i++) {
- data += String.fromCharCode((relativeOffset >>> 24) & 0xFF,
- (relativeOffset >> 16) & 0xFF,
- (relativeOffset >> 8) & 0xFF,
- relativeOffset & 0xFF);
-
- if (objects[i])
- relativeOffset += objects[i].length;
- }
-
- for (var i = 0; i < count; i++) {
- for (var j = 0, jj = objects[i].length; j < jj; j++)
- data += isByte ? String.fromCharCode(objects[i][j] & 0xFF) :
- objects[i][j];
- }
- return data;
- },
-
- encodeNumber: function Type1Font_encodeNumber(value) {
- // some of the fonts has ouf-of-range values
- // they are just arithmetic overflows
- // make sanitizer happy
- value |= 0;
- if (value >= -32768 && value <= 32767) {
- return '\x1c' +
- String.fromCharCode((value >> 8) & 0xFF) +
- String.fromCharCode(value & 0xFF);
- } else {
- return '\x1d' +
- String.fromCharCode((value >> 24) & 0xFF) +
- String.fromCharCode((value >> 16) & 0xFF) +
- String.fromCharCode((value >> 8) & 0xFF) +
- String.fromCharCode(value & 0xFF);
- }
- },
-
- getOrderedCharStrings: function Type1Font_getOrderedCharStrings(glyphs,
- properties) {
- var charstrings = [];
- var i, length, glyphName;
- var unusedUnicode = kCmapGlyphOffset;
- for (i = 0, length = glyphs.length; i < length; i++) {
- var item = glyphs[i];
- var glyphName = item.glyph;
- var unicode = glyphName in GlyphsUnicode ?
- GlyphsUnicode[glyphName] : unusedUnicode++;
- charstrings.push({
- glyph: glyphName,
- unicode: unicode,
- gid: i,
- charstring: item.data,
- width: item.width,
- lsb: item.lsb
- });
- }
-
- charstrings.sort(function charstrings_sort(a, b) {
- return a.unicode - b.unicode;
- });
- return charstrings;
- },
-
- getType2Charstrings: function Type1Font_getType2Charstrings(
- type1Subrs) {
- var type2Charstrings = [];
- var count = type1Subrs.length;
- var type1Charstrings = [];
- for (var i = 0; i < count; i++)
- type1Charstrings.push(type1Subrs[i].charstring.slice());
- for (var i = 0; i < count; i++)
- type2Charstrings.push(this.flattenCharstring(type1Charstrings, i));
- return type2Charstrings;
- },
-
- getType2Subrs: function Type1Font_getType2Subrs(type1Subrs) {
- var bias = 0;
- var count = type1Subrs.length;
- if (count < 1133)
- bias = 107;
- else if (count < 33769)
- bias = 1131;
- else
- bias = 32768;
-
- // Add a bunch of empty subrs to deal with the Type2 bias
- var type2Subrs = [];
- for (var i = 0; i < bias; i++)
- type2Subrs.push([0x0B]);
-
- for (var i = 0; i < count; i++) {
- type2Subrs.push(this.flattenCharstring(type1Subrs, i));
- }
-
- return type2Subrs;
- },
-
- /*
- * Flatten the commands by interpreting the postscript code and replacing
- * every 'callsubr', 'callothersubr' by the real commands.
- */
- commandsMap: {
- 'hstem': 1,
- 'vstem': 3,
- 'vmoveto': 4,
- 'rlineto': 5,
- 'hlineto': 6,
- 'vlineto': 7,
- 'rrcurveto': 8,
- 'callsubr': 10,
- 'return': 11,
- 'sub': [12, 11],
- 'div': [12, 12],
- 'exch': [12, 28],
- 'flex': [12, 35],
- 'drop' : [12, 18],
- 'endchar': 14,
- 'rmoveto': 21,
- 'hmoveto': 22,
- 'vhcurveto': 30,
- 'hvcurveto': 31
- },
-
- flattenCharstring: function Type1Font_flattenCharstring(charstrings, index) {
- var charstring = charstrings[index];
- if (!charstring)
- return [0x0B];
- var map = this.commandsMap;
- // charstring changes size - can't cache .length in loop
- for (var i = 0; i < charstring.length; i++) {
- var command = charstring[i];
- if (typeof command === 'string') {
- var cmd = map[command];
- assert(cmd, 'Unknow command: ' + command);
-
- if (isArray(cmd))
- charstring.splice(i++, 1, cmd[0], cmd[1]);
- else
- charstring[i] = cmd;
- } else if (command instanceof CallothersubrCmd) {
- var otherSubrCharstring = charstrings[command.index];
- if (otherSubrCharstring) {
- var lastCommand = otherSubrCharstring.indexOf('return');
- if (lastCommand >= 0)
- otherSubrCharstring = otherSubrCharstring.slice(0, lastCommand);
- charstring.splice.apply(charstring,
- [i, 1].concat(otherSubrCharstring));
- } else
- charstring.splice(i, 1); // ignoring empty subr call
- i--;
- } else {
- // Type1 charstring use a division for number above 32000
- if (command > 32000) {
- var divisor = charstring[i + 1];
- command /= divisor;
- charstring.splice(i, 3, 28, command >> 8, command & 0xff);
- } else {
- charstring.splice(i, 1, 28, command >> 8, command & 0xff);
- }
- i += 2;
- }
- }
- return charstring;
- },
-
- wrap: function Type1Font_wrap(name, glyphs, charstrings, subrs, properties) {
- var fields = {
- // major version, minor version, header size, offset size
- 'header': '\x01\x00\x04\x04',
-
- 'names': this.createCFFIndexHeader([name]),
-
- 'topDict': (function topDict(self) {
- return function cffWrapTopDict() {
- var header = '\x00\x01\x01\x01';
- var dict =
- '\xf8\x1b\x00' + // version
- '\xf8\x1c\x01' + // Notice
- '\xf8\x1d\x02' + // FullName
- '\xf8\x1e\x03' + // FamilyName
- '\xf8\x1f\x04' + // Weight
- '\x1c\x00\x00\x10'; // Encoding
-
- var boundingBox = properties.bbox;
- for (var i = 0, ii = boundingBox.length; i < ii; i++)
- dict += self.encodeNumber(boundingBox[i]);
- dict += '\x05'; // FontBBox;
-
- var offset = fields.header.length +
- fields.names.length +
- (header.length + 1) +
- (dict.length + (4 + 4)) +
- fields.strings.length +
- fields.globalSubrs.length;
-
- // If the offset if over 32767, encodeNumber is going to return
- // 5 bytes to encode the position instead of 3.
- if ((offset + fields.charstrings.length) > 32767) {
- offset += 9;
- } else {
- offset += 7;
- }
-
- dict += self.encodeNumber(offset) + '\x0f'; // Charset
-
- offset = offset + (glyphs.length * 2) + 1;
- dict += self.encodeNumber(offset) + '\x11'; // Charstrings
-
- offset = offset + fields.charstrings.length;
- dict += self.encodeNumber(fields.privateData.length);
- dict += self.encodeNumber(offset) + '\x12'; // Private
-
- return header + String.fromCharCode(dict.length + 1) + dict;
- };
- })(this),
-
- 'strings': (function strings(self) {
- var strings = [
- 'Version 0.11', // Version
- 'See original notice', // Notice
- name, // FullName
- name, // FamilyName
- 'Medium' // Weight
- ];
- return self.createCFFIndexHeader(strings);
- })(this),
-
- 'globalSubrs': this.createCFFIndexHeader([]),
-
- 'charset': (function charset(self) {
- var charsetString = '\x00'; // Encoding
-
- var count = glyphs.length;
- for (var i = 0; i < count; i++) {
- var index = CFFStandardStrings.indexOf(charstrings[i].glyph);
- // Some characters like asterikmath && circlecopyrt are
- // missing from the original strings, for the moment let's
- // map them to .notdef and see later if it cause any
- // problems
- if (index == -1)
- index = 0;
-
- charsetString += String.fromCharCode(index >> 8, index & 0xff);
- }
- return charsetString;
- })(this),
-
- 'charstrings': this.createCFFIndexHeader([[0x8B, 0x0E]].concat(glyphs),
- true),
-
- 'privateData': (function cffWrapPrivate(self) {
- var data =
- '\x8b\x14' + // defaultWidth
- '\x8b\x15'; // nominalWidth
- var fieldMap = {
- BlueValues: '\x06',
- OtherBlues: '\x07',
- FamilyBlues: '\x08',
- FamilyOtherBlues: '\x09',
- StemSnapH: '\x0c\x0c',
- StemSnapV: '\x0c\x0d',
- BlueShift: '\x0c\x0a',
- BlueFuzz: '\x0c\x0b',
- BlueScale: '\x0c\x09',
- LanguageGroup: '\x0c\x11',
- ExpansionFactor: '\x0c\x18'
- };
- for (var field in fieldMap) {
- if (!properties.privateData.hasOwnProperty(field))
- continue;
- var value = properties.privateData[field];
-
- if (isArray(value)) {
- data += self.encodeNumber(value[0]);
- for (var i = 1, ii = value.length; i < ii; i++)
- data += self.encodeNumber(value[i] - value[i - 1]);
- } else {
- data += self.encodeNumber(value);
- }
- data += fieldMap[field];
- }
-
- data += self.encodeNumber(data.length + 4) + '\x13'; // Subrs offset
-
- return data;
- })(this),
-
- 'localSubrs': this.createCFFIndexHeader(subrs, true)
- };
- fields.topDict = fields.topDict();
-
-
- var cff = [];
- for (var index in fields) {
- var field = fields[index];
- for (var i = 0, ii = field.length; i < ii; i++)
- cff.push(field.charCodeAt(i));
- }
-
- return cff;
- }
-};
-
-var CFFFont = (function CFFFontClosure() {
- function CFFFont(file, properties) {
- this.properties = properties;
-
- var parser = new CFFParser(file, properties);
- var cff = parser.parse(true);
- var compiler = new CFFCompiler(cff);
- this.readExtra(cff);
- try {
- this.data = compiler.compile();
- } catch (e) {
- warn('Failed to compile font ' + properties.loadedName);
- // There may have just been an issue with the compiler, set the data
- // anyway and hope the font loaded.
- this.data = file;
- }
- }
-
- CFFFont.prototype = {
- readExtra: function CFFFont_readExtra(cff) {
- // charstrings contains info about glyphs (one element per glyph
- // containing mappings for {unicode, width})
- var charset = cff.charset.charset;
- var encoding = cff.encoding ? cff.encoding.encoding : null;
- var charstrings = this.getCharStrings(charset, encoding);
-
- // create the mapping between charstring and glyph id
- var glyphIds = [];
- for (var i = 0, ii = charstrings.length; i < ii; i++)
- glyphIds.push(charstrings[i].gid);
-
- this.charstrings = charstrings;
- this.glyphIds = glyphIds;
- },
- getCharStrings: function CFFFont_getCharStrings(charsets, encoding) {
- var charstrings = [];
- var unicodeUsed = [];
- var unassignedUnicodeItems = [];
- var inverseEncoding = [];
- // CID fonts don't have an encoding.
- if (encoding !== null)
- for (var charcode in encoding)
- inverseEncoding[encoding[charcode]] = charcode | 0;
- else
- inverseEncoding = charsets;
- for (var i = 0, ii = charsets.length; i < ii; i++) {
- var glyph = charsets[i];
- if (glyph == '.notdef')
- continue;
-
- var code = inverseEncoding[i];
- if (!code || isSpecialUnicode(code)) {
- unassignedUnicodeItems.push(i);
- continue;
- }
- charstrings.push({
- unicode: code,
- code: code,
- gid: i,
- glyph: glyph
- });
- unicodeUsed[code] = true;
- }
-
- var nextUnusedUnicode = kCmapGlyphOffset;
- for (var j = 0, jj = unassignedUnicodeItems.length; j < jj; ++j) {
- var i = unassignedUnicodeItems[j];
- // giving unicode value anyway
- while (nextUnusedUnicode in unicodeUsed)
- nextUnusedUnicode++;
- var unicode = nextUnusedUnicode++;
- charstrings.push({
- unicode: unicode,
- code: inverseEncoding[i] || 0,
- gid: i,
- glyph: charsets[i]
- });
- }
-
- // sort the array by the unicode value (again)
- charstrings.sort(function getCharStringsSort(a, b) {
- return a.unicode - b.unicode;
- });
- return charstrings;
- }
- };
-
- return CFFFont;
-})();
-
-var CFFParser = (function CFFParserClosure() {
- function CFFParser(file, properties) {
- this.bytes = file.getBytes();
- this.properties = properties;
- }
- CFFParser.prototype = {
- parse: function CFFParser_parse(normalizeCIDData) {
- var properties = this.properties;
- var cff = new CFF();
- this.cff = cff;
-
- // The first five sections must be in order, all the others are reached
- // via offsets contained in one of the below.
- var header = this.parseHeader();
- var nameIndex = this.parseIndex(header.endPos);
- var topDictIndex = this.parseIndex(nameIndex.endPos);
- var stringIndex = this.parseIndex(topDictIndex.endPos);
- var globalSubrIndex = this.parseIndex(stringIndex.endPos);
-
- var topDictParsed = this.parseDict(topDictIndex.obj.get(0));
- var topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings);
-
- cff.header = header.obj;
- cff.names = this.parseNameIndex(nameIndex.obj);
- cff.strings = this.parseStringIndex(stringIndex.obj);
- cff.topDict = topDict;
- cff.globalSubrIndex = globalSubrIndex.obj;
-
- this.parsePrivateDict(cff.topDict);
-
- cff.isCIDFont = topDict.hasName('ROS');
-
- var charStringOffset = topDict.getByName('CharStrings');
- cff.charStrings = this.parseCharStrings(charStringOffset);
-
- var fontMatrix = topDict.getByName('FontMatrix');
- if (fontMatrix) {
- // estimating unitsPerEM for the font
- properties.unitsPerEm = 1 / fontMatrix[0];
- }
-
- var fontBBox = topDict.getByName('FontBBox');
- if (fontBBox) {
- // adjusting ascent/descent
- properties.ascent = fontBBox[3];
- properties.descent = fontBBox[1];
- }
-
- var charset, encoding;
- if (cff.isCIDFont) {
- var fdArrayIndex = this.parseIndex(topDict.getByName('FDArray')).obj;
- for (var i = 0, ii = fdArrayIndex.count; i < ii; ++i) {
- var dictRaw = fdArrayIndex.get(i);
- var fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw),
- cff.strings);
- this.parsePrivateDict(fontDict);
- cff.fdArray.push(fontDict);
- }
- // cid fonts don't have an encoding
- encoding = null;
- charset = this.parseCharsets(topDict.getByName('charset'),
- cff.charStrings.count, cff.strings, true);
- cff.fdSelect = this.parseFDSelect(topDict.getByName('FDSelect'),
- cff.charStrings.count);
- } else {
- charset = this.parseCharsets(topDict.getByName('charset'),
- cff.charStrings.count, cff.strings, false);
- encoding = this.parseEncoding(topDict.getByName('Encoding'),
- properties,
- cff.strings, charset.charset);
- }
- cff.charset = charset;
- cff.encoding = encoding;
-
- if (!cff.isCIDFont || !normalizeCIDData)
- return cff;
-
- // DirectWrite does not like CID fonts data. Trying to convert/flatten
- // the font data and remove CID properties.
- if (cff.fdArray.length !== 1) {
- warn('Unable to normalize CID font in CFF data -- using font as is');
- return cff;
- }
-
- var fontDict = cff.fdArray[0];
- fontDict.setByKey(17, topDict.getByName('CharStrings'));
- cff.topDict = fontDict;
- cff.isCIDFont = false;
- delete cff.fdArray;
- delete cff.fdSelect;
-
- return cff;
- },
- parseHeader: function CFFParser_parseHeader() {
- var bytes = this.bytes;
- var offset = 0;
-
- while (bytes[offset] != 1)
- ++offset;
-
- if (offset != 0) {
- info('cff data is shifted');
- bytes = bytes.subarray(offset);
- this.bytes = bytes;
- }
- var major = bytes[0];
- var minor = bytes[1];
- var hdrSize = bytes[2];
- var offSize = bytes[3];
- var header = new CFFHeader(major, minor, hdrSize, offSize);
- return {obj: header, endPos: hdrSize};
- },
- parseDict: function CFFParser_parseDict(dict) {
- var pos = 0;
-
- function parseOperand() {
- var value = dict[pos++];
- if (value === 30) {
- return parseFloatOperand(pos);
- } else if (value === 28) {
- value = dict[pos++];
- value = ((value << 24) | (dict[pos++] << 16)) >> 16;
- return value;
- } else if (value === 29) {
- value = dict[pos++];
- value = (value << 8) | dict[pos++];
- value = (value << 8) | dict[pos++];
- value = (value << 8) | dict[pos++];
- return value;
- } else if (value >= 32 && value <= 246) {
- return value - 139;
- } else if (value >= 247 && value <= 250) {
- return ((value - 247) * 256) + dict[pos++] + 108;
- } else if (value >= 251 && value <= 254) {
- return -((value - 251) * 256) - dict[pos++] - 108;
- } else {
- error('255 is not a valid DICT command');
- }
- return -1;
- }
-
- function parseFloatOperand() {
- var str = '';
- var eof = 15;
- var lookup = ['0', '1', '2', '3', '4', '5', '6', '7', '8',
- '9', '.', 'E', 'E-', null, '-'];
- var length = dict.length;
- while (pos < length) {
- var b = dict[pos++];
- var b1 = b >> 4;
- var b2 = b & 15;
-
- if (b1 == eof)
- break;
- str += lookup[b1];
-
- if (b2 == eof)
- break;
- str += lookup[b2];
- }
- return parseFloat(str);
- }
-
- var operands = [];
- var entries = [];
-
- var pos = 0;
- var end = dict.length;
- while (pos < end) {
- var b = dict[pos];
- if (b <= 21) {
- if (b === 12)
- b = (b << 8) | dict[++pos];
- entries.push([b, operands]);
- operands = [];
- ++pos;
- } else {
- operands.push(parseOperand());
- }
- }
- return entries;
- },
- parseIndex: function CFFParser_parseIndex(pos) {
- var cffIndex = new CFFIndex();
- var bytes = this.bytes;
- var count = (bytes[pos++] << 8) | bytes[pos++];
- var offsets = [];
- var start = pos;
- var end = pos;
-
- if (count != 0) {
- var offsetSize = bytes[pos++];
- // add 1 for offset to determine size of last object
- var startPos = pos + ((count + 1) * offsetSize) - 1;
-
- for (var i = 0, ii = count + 1; i < ii; ++i) {
- var offset = 0;
- for (var j = 0; j < offsetSize; ++j) {
- offset <<= 8;
- offset += bytes[pos++];
- }
- offsets.push(startPos + offset);
- }
- end = offsets[count];
- }
- for (var i = 0, ii = offsets.length - 1; i < ii; ++i) {
- var offsetStart = offsets[i];
- var offsetEnd = offsets[i + 1];
- cffIndex.add(bytes.subarray(offsetStart, offsetEnd));
- }
- return {obj: cffIndex, endPos: end};
- },
- parseNameIndex: function CFFParser_parseNameIndex(index) {
- var names = [];
- for (var i = 0, ii = index.count; i < ii; ++i) {
- var name = index.get(i);
- // OTS doesn't allow names to be over 127 characters.
- var length = Math.min(name.length, 127);
- var data = [];
- // OTS also only permits certain characters in the name.
- for (var j = 0; j < length; ++j) {
- var c = name[j];
- if (j === 0 && c === 0) {
- data[j] = c;
- continue;
- }
- if ((c < 33 || c > 126) || c === 91 /* [ */ || c === 93 /* ] */ ||
- c === 40 /* ( */ || c === 41 /* ) */ || c === 123 /* { */ ||
- c === 125 /* } */ || c === 60 /* < */ || c === 62 /* > */ ||
- c === 47 /* / */ || c === 37 /* % */) {
- data[j] = 95;
- continue;
- }
- data[j] = c;
- }
- names.push(String.fromCharCode.apply(null, data));
- }
- return names;
- },
- parseStringIndex: function CFFParser_parseStringIndex(index) {
- var strings = new CFFStrings();
- for (var i = 0, ii = index.count; i < ii; ++i) {
- var data = index.get(i);
- strings.add(String.fromCharCode.apply(null, data));
- }
- return strings;
- },
- createDict: function CFFParser_createDict(type, dict, strings) {
- var cffDict = new type(strings);
- var types = cffDict.types;
-
- for (var i = 0, ii = dict.length; i < ii; ++i) {
- var pair = dict[i];
- var key = pair[0];
- var value = pair[1];
- cffDict.setByKey(key, value);
- }
- return cffDict;
- },
- parseCharStrings: function CFFParser_parseCharStrings(charStringOffset) {
- var charStrings = this.parseIndex(charStringOffset).obj;
- // The CFF specification state that the 'dotsection' command
- // (12, 0) is deprecated and treated as a no-op, but all Type2
- // charstrings processors should support them. Unfortunately
- // the font sanitizer don't. As a workaround the sequence (12, 0)
- // is replaced by a useless (0, hmoveto).
- var count = charStrings.count;
- for (var i = 0; i < count; i++) {
- var charstring = charStrings.get(i);
-
- var data = charstring;
- var length = data.length;
- for (var j = 0; j <= length;) {
- var value = data[j++];
- if (value == 12 && data[j++] == 0) {
- data[j - 2] = 139;
- data[j - 1] = 22;
- } else if (value === 28) {
- j += 2;
- } else if (value >= 247 && value <= 254) {
- j++;
- } else if (value == 255) {
- j += 4;
- }
- }
- }
- return charStrings;
- },
- parsePrivateDict: function CFFParser_parsePrivateDict(parentDict) {
- // no private dict, do nothing
- if (!parentDict.hasName('Private'))
- return;
- var privateOffset = parentDict.getByName('Private');
- // make sure the params are formatted correctly
- if (!isArray(privateOffset) || privateOffset.length !== 2) {
- parentDict.removeByName('Private');
- return;
- }
- var size = privateOffset[0];
- var offset = privateOffset[1];
- // remove empty dicts or ones that refer to invalid location
- if (size === 0 || offset >= this.bytes.length) {
- parentDict.removeByName('Private');
- return;
- }
-
- var privateDictEnd = offset + size;
- var dictData = this.bytes.subarray(offset, privateDictEnd);
- var dict = this.parseDict(dictData);
- var privateDict = this.createDict(CFFPrivateDict, dict,
- parentDict.strings);
- parentDict.privateDict = privateDict;
-
- // Parse the Subrs index also since it's relative to the private dict.
- if (!privateDict.getByName('Subrs'))
- return;
- var subrsOffset = privateDict.getByName('Subrs');
- var relativeOffset = offset + subrsOffset;
- // Validate the offset.
- if (subrsOffset === 0 || relativeOffset >= this.bytes.length) {
- privateDict.removeByName('Subrs');
- return;
- }
- var subrsIndex = this.parseIndex(relativeOffset);
- privateDict.subrsIndex = subrsIndex.obj;
- },
- parseCharsets: function CFFParser_parseCharsets(pos, length, strings, cid) {
- if (pos == 0) {
- return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE,
- ISOAdobeCharset);
- } else if (pos == 1) {
- return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT,
- ExpertCharset);
- } else if (pos == 2) {
- return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET,
- ExpertSubsetCharset);
- }
-
- var bytes = this.bytes;
- var start = pos;
- var format = bytes[pos++];
- var charset = ['.notdef'];
-
- // subtract 1 for the .notdef glyph
- length -= 1;
-
- switch (format) {
- case 0:
- for (var i = 0; i < length; i++) {
- var id = (bytes[pos++] << 8) | bytes[pos++];
- charset.push(cid ? id : strings.get(id));
- }
- break;
- case 1:
- while (charset.length <= length) {
- var id = (bytes[pos++] << 8) | bytes[pos++];
- var count = bytes[pos++];
- for (var i = 0; i <= count; i++)
- charset.push(cid ? id++ : strings.get(id++));
- }
- break;
- case 2:
- while (charset.length <= length) {
- var id = (bytes[pos++] << 8) | bytes[pos++];
- var count = (bytes[pos++] << 8) | bytes[pos++];
- for (var i = 0; i <= count; i++)
- charset.push(cid ? id++ : strings.get(id++));
- }
- break;
- default:
- error('Unknown charset format');
- }
- // Raw won't be needed if we actually compile the charset.
- var end = pos;
- var raw = bytes.subarray(start, end);
-
- return new CFFCharset(false, format, charset, raw);
- },
- parseEncoding: function CFFParser_parseEncoding(pos,
- properties,
- strings,
- charset) {
- var encoding = {};
- var bytes = this.bytes;
- var predefined = false;
- var hasSupplement = false;
- var format;
- var raw = null;
-
- function readSupplement() {
- var supplementsCount = bytes[pos++];
- for (var i = 0; i < supplementsCount; i++) {
- var code = bytes[pos++];
- var sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff);
- encoding[code] = properties.differences.indexOf(strings.get(sid));
- }
- }
-
- if (pos == 0 || pos == 1) {
- predefined = true;
- format = pos;
- var gid = 1;
- var baseEncoding = pos ? Encodings.ExpertEncoding :
- Encodings.StandardEncoding;
- for (var i = 0, ii = charset.length; i < ii; i++) {
- var index = baseEncoding.indexOf(charset[i]);
- if (index != -1)
- encoding[index] = gid++;
- }
- } else {
- var dataStart = pos;
- var format = bytes[pos++];
- switch (format & 0x7f) {
- case 0:
- var glyphsCount = bytes[pos++];
- for (var i = 1; i <= glyphsCount; i++)
- encoding[bytes[pos++]] = i;
- break;
-
- case 1:
- var rangesCount = bytes[pos++];
- var gid = 1;
- for (var i = 0; i < rangesCount; i++) {
- var start = bytes[pos++];
- var left = bytes[pos++];
- for (var j = start; j <= start + left; j++)
- encoding[j] = gid++;
- }
- break;
-
- default:
- error('Unknow encoding format: ' + format + ' in CFF');
- break;
- }
- var dataEnd = pos;
- if (format & 0x80) {
- // The font sanitizer does not support CFF encoding with a
- // supplement, since the encoding is not really used to map
- // between gid to glyph, let's overwrite what is declared in
- // the top dictionary to let the sanitizer think the font use
- // StandardEncoding, that's a lie but that's ok.
- bytes[dataStart] &= 0x7f;
- readSupplement();
- hasSupplement = true;
- }
- raw = bytes.subarray(dataStart, dataEnd);
- }
- format = format & 0x7f;
- return new CFFEncoding(predefined, format, encoding, raw);
- },
- parseFDSelect: function CFFParser_parseFDSelect(pos, length) {
- var start = pos;
- var bytes = this.bytes;
- var format = bytes[pos++];
- var fdSelect = [];
- switch (format) {
- case 0:
- for (var i = 0; i < length; ++i) {
- var id = bytes[pos++];
- fdSelect.push(id);
- }
- break;
- case 3:
- var rangesCount = (bytes[pos++] << 8) | bytes[pos++];
- for (var i = 0; i < rangesCount; ++i) {
- var first = (bytes[pos++] << 8) | bytes[pos++];
- var fdIndex = bytes[pos++];
- var next = (bytes[pos] << 8) | bytes[pos + 1];
- for (var j = first; j < next; ++j)
- fdSelect.push(fdIndex);
- }
- // Advance past the sentinel(next).
- pos += 2;
- break;
- default:
- error('Unknown fdselect format ' + format);
- break;
- }
- var end = pos;
- return new CFFFDSelect(fdSelect, bytes.subarray(start, end));
- }
- };
- return CFFParser;
-})();
-
-// Compact Font Format
-var CFF = (function CFFClosure() {
- function CFF() {
- this.header = null;
- this.names = [];
- this.topDict = null;
- this.strings = new CFFStrings();
- this.globalSubrIndex = null;
-
- // The following could really be per font, but since we only have one font
- // store them here.
- this.encoding = null;
- this.charset = null;
- this.charStrings = null;
- this.fdArray = [];
- this.fdSelect = null;
-
- this.isCIDFont = false;
- }
- return CFF;
-})();
-
-var CFFHeader = (function CFFHeaderClosure() {
- function CFFHeader(major, minor, hdrSize, offSize) {
- this.major = major;
- this.minor = minor;
- this.hdrSize = hdrSize;
- this.offSize = offSize;
- }
- return CFFHeader;
-})();
-
-var CFFStrings = (function CFFStringsClosure() {
- function CFFStrings() {
- this.strings = [];
- }
- CFFStrings.prototype = {
- get: function CFFStrings_get(index) {
- if (index >= 0 && index <= 390)
- return CFFStandardStrings[index];
- if (index - 391 <= this.strings.length)
- return this.strings[index - 391];
- return CFFStandardStrings[0];
- },
- add: function CFFStrings_add(value) {
- this.strings.push(value);
- },
- get count() {
- return this.strings.length;
- }
- };
- return CFFStrings;
-})();
-
-var CFFIndex = (function CFFIndexClosure() {
- function CFFIndex() {
- this.objects = [];
- this.length = 0;
- }
- CFFIndex.prototype = {
- add: function CFFIndex_add(data) {
- this.length += data.length;
- this.objects.push(data);
- },
- get: function CFFIndex_get(index) {
- return this.objects[index];
- },
- get count() {
- return this.objects.length;
- }
- };
- return CFFIndex;
-})();
-
-var CFFDict = (function CFFDictClosure() {
- function CFFDict(tables, strings) {
- this.keyToNameMap = tables.keyToNameMap;
- this.nameToKeyMap = tables.nameToKeyMap;
- this.defaults = tables.defaults;
- this.types = tables.types;
- this.opcodes = tables.opcodes;
- this.order = tables.order;
- this.strings = strings;
- this.values = {};
- }
- CFFDict.prototype = {
- // value should always be an array
- setByKey: function CFFDict_setByKey(key, value) {
- if (!(key in this.keyToNameMap))
- return false;
- // ignore empty values
- if (value.length === 0)
- return true;
- var type = this.types[key];
- // remove the array wrapping these types of values
- if (type === 'num' || type === 'sid' || type === 'offset')
- value = value[0];
- this.values[key] = value;
- return true;
- },
- hasName: function CFFDict_hasName(name) {
- return this.nameToKeyMap[name] in this.values;
- },
- getByName: function CFFDict_getByName(name) {
- if (!(name in this.nameToKeyMap))
- error('Invalid dictionary name "' + name + '"');
- var key = this.nameToKeyMap[name];
- if (!(key in this.values))
- return this.defaults[key];
- return this.values[key];
- },
- removeByName: function CFFDict_removeByName(name) {
- delete this.values[this.nameToKeyMap[name]];
- }
- };
- CFFDict.createTables = function CFFDict_createTables(layout) {
- var tables = {
- keyToNameMap: {},
- nameToKeyMap: {},
- defaults: {},
- types: {},
- opcodes: {},
- order: []
- };
- for (var i = 0, ii = layout.length; i < ii; ++i) {
- var entry = layout[i];
- var key = isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0];
- tables.keyToNameMap[key] = entry[1];
- tables.nameToKeyMap[entry[1]] = key;
- tables.types[key] = entry[2];
- tables.defaults[key] = entry[3];
- tables.opcodes[key] = isArray(entry[0]) ? entry[0] : [entry[0]];
- tables.order.push(key);
- }
- return tables;
- };
- return CFFDict;
-})();
-
-var CFFTopDict = (function CFFTopDictClosure() {
- var layout = [
- [[12, 30], 'ROS', ['sid', 'sid', 'num'], null],
- [[12, 20], 'SyntheticBase', 'num', null],
- [0, 'version', 'sid', null],
- [1, 'Notice', 'sid', null],
- [[12, 0], 'Copyright', 'sid', null],
- [2, 'FullName', 'sid', null],
- [3, 'FamilyName', 'sid', null],
- [4, 'Weight', 'sid', null],
- [[12, 1], 'isFixedPitch', 'num', 0],
- [[12, 2], 'ItalicAngle', 'num', 0],
- [[12, 3], 'UnderlinePosition', 'num', -100],
- [[12, 4], 'UnderlineThickness', 'num', 50],
- [[12, 5], 'PaintType', 'num', 0],
- [[12, 6], 'CharstringType', 'num', 2],
- [[12, 7], 'FontMatrix', ['num', 'num', 'num', 'num', 'num', 'num'],
- [.001, 0, 0, .001, 0, 0]],
- [13, 'UniqueID', 'num', null],
- [5, 'FontBBox', ['num', 'num', 'num', 'num'], [0, 0, 0, 0]],
- [[12, 8], 'StrokeWidth', 'num', 0],
- [14, 'XUID', 'array', null],
- [15, 'charset', 'offset', 0],
- [16, 'Encoding', 'offset', 0],
- [17, 'CharStrings', 'offset', 0],
- [18, 'Private', ['offset', 'offset'], null],
- [[12, 21], 'PostScript', 'sid', null],
- [[12, 22], 'BaseFontName', 'sid', null],
- [[12, 23], 'BaseFontBlend', 'delta', null],
- [[12, 31], 'CIDFontVersion', 'num', 0],
- [[12, 32], 'CIDFontRevision', 'num', 0],
- [[12, 33], 'CIDFontType', 'num', 0],
- [[12, 34], 'CIDCount', 'num', 8720],
- [[12, 35], 'UIDBase', 'num', null],
- [[12, 36], 'FDArray', 'offset', null],
- [[12, 37], 'FDSelect', 'offset', null],
- [[12, 38], 'FontName', 'sid', null]];
- var tables = null;
- function CFFTopDict(strings) {
- if (tables === null)
- tables = CFFDict.createTables(layout);
- CFFDict.call(this, tables, strings);
- this.privateDict = null;
- }
- CFFTopDict.prototype = Object.create(CFFDict.prototype);
- return CFFTopDict;
-})();
-
-var CFFPrivateDict = (function CFFPrivateDictClosure() {
- var layout = [
- [6, 'BlueValues', 'delta', null],
- [7, 'OtherBlues', 'delta', null],
- [8, 'FamilyBlues', 'delta', null],
- [9, 'FamilyOtherBlues', 'delta', null],
- [[12, 9], 'BlueScale', 'num', 0.039625],
- [[12, 10], 'BlueShift', 'num', 7],
- [[12, 11], 'BlueFuzz', 'num', 1],
- [10, 'StdHW', 'num', null],
- [11, 'StdVW', 'num', null],
- [[12, 12], 'StemSnapH', 'delta', null],
- [[12, 13], 'StemSnapV', 'delta', null],
- [[12, 14], 'ForceBold', 'num', 0],
- [[12, 17], 'LanguageGroup', 'num', 0],
- [[12, 18], 'ExpansionFactor', 'num', 0.06],
- [[12, 19], 'initialRandomSeed', 'num', 0],
- [20, 'defaultWidthX', 'num', 0],
- [21, 'nominalWidthX', 'num', 0],
- [19, 'Subrs', 'offset', null]
- ];
- var tables = null;
- function CFFPrivateDict(strings) {
- if (tables === null)
- tables = CFFDict.createTables(layout);
- CFFDict.call(this, tables, strings);
- this.subrsIndex = null;
- }
- CFFPrivateDict.prototype = Object.create(CFFDict.prototype);
- return CFFPrivateDict;
-})();
-
-var CFFCharsetPredefinedTypes = {
- ISO_ADOBE: 0,
- EXPERT: 1,
- EXPERT_SUBSET: 2
-};
-var CFFCharsetEmbeddedTypes = {
- FORMAT0: 0,
- FORMAT1: 1,
- FORMAT2: 2
-};
-var CFFCharset = (function CFFCharsetClosure() {
- function CFFCharset(predefined, format, charset, raw) {
- this.predefined = predefined;
- this.format = format;
- this.charset = charset;
- this.raw = raw;
- }
- return CFFCharset;
-})();
-
-var CFFEncodingPredefinedTypes = {
- STANDARD: 0,
- EXPERT: 1
-};
-var CFFCharsetEmbeddedTypes = {
- FORMAT0: 0,
- FORMAT1: 1
-};
-var CFFEncoding = (function CFFEncodingClosure() {
- function CFFEncoding(predefined, format, encoding, raw) {
- this.predefined = predefined;
- this.format = format;
- this.encoding = encoding;
- this.raw = raw;
- }
- return CFFEncoding;
-})();
-
-var CFFFDSelect = (function CFFFDSelectClosure() {
- function CFFFDSelect(fdSelect, raw) {
- this.fdSelect = fdSelect;
- this.raw = raw;
- }
- return CFFFDSelect;
-})();
-
-// Helper class to keep track of where an offset is within the data and helps
-// filling in that offset once it's known.
-var CFFOffsetTracker = (function CFFOffsetTrackerClosure() {
- function CFFOffsetTracker() {
- this.offsets = {};
- }
- CFFOffsetTracker.prototype = {
- isTracking: function CFFOffsetTracker_isTracking(key) {
- return key in this.offsets;
- },
- track: function CFFOffsetTracker_track(key, location) {
- if (key in this.offsets)
- error('Already tracking location of ' + key);
- this.offsets[key] = location;
- },
- offset: function CFFOffsetTracker_offset(value) {
- for (var key in this.offsets) {
- this.offsets[key] += value;
- }
- },
- setEntryLocation: function CFFOffsetTracker_setEntryLocation(key,
- values,
- output) {
- if (!(key in this.offsets))
- error('Not tracking location of ' + key);
- var data = output.data;
- var dataOffset = this.offsets[key];
- var size = 5;
- for (var i = 0, ii = values.length; i < ii; ++i) {
- var offset0 = i * size + dataOffset;
- var offset1 = offset0 + 1;
- var offset2 = offset0 + 2;
- var offset3 = offset0 + 3;
- var offset4 = offset0 + 4;
- // It's easy to screw up offsets so perform this sanity check.
- if (data[offset0] !== 0x1d || data[offset1] !== 0 ||
- data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0)
- error('writing to an offset that is not empty');
- var value = values[i];
- data[offset0] = 0x1d;
- data[offset1] = (value >> 24) & 0xFF;
- data[offset2] = (value >> 16) & 0xFF;
- data[offset3] = (value >> 8) & 0xFF;
- data[offset4] = value & 0xFF;
- }
- }
- };
- return CFFOffsetTracker;
-})();
-
-// Takes a CFF and converts it to the binary representation.
-var CFFCompiler = (function CFFCompilerClosure() {
- function stringToArray(str) {
- var array = [];
- for (var i = 0, ii = str.length; i < ii; ++i)
- array[i] = str.charCodeAt(i);
-
- return array;
- };
- function CFFCompiler(cff) {
- this.cff = cff;
- }
- CFFCompiler.prototype = {
- compile: function CFFCompiler_compile() {
- var cff = this.cff;
- var output = {
- data: [],
- length: 0,
- add: function CFFCompiler_add(data) {
- this.data = this.data.concat(data);
- this.length = this.data.length;
- }
- };
-
- // Compile the five entries that must be in order.
- var header = this.compileHeader(cff.header);
- output.add(header);
-
- var nameIndex = this.compileNameIndex(cff.names);
- output.add(nameIndex);
-
- var compiled = this.compileTopDicts([cff.topDict], output.length);
- output.add(compiled.output);
- var topDictTracker = compiled.trackers[0];
-
- var stringIndex = this.compileStringIndex(cff.strings.strings);
- output.add(stringIndex);
-
- var globalSubrIndex = this.compileIndex(cff.globalSubrIndex);
- output.add(globalSubrIndex);
-
- // Now start on the other entries that have no specfic order.
- if (cff.encoding && cff.topDict.hasName('Encoding')) {
- if (cff.encoding.predefined) {
- topDictTracker.setEntryLocation('Encoding', [cff.encoding.format],
- output);
- } else {
- var encoding = this.compileEncoding(cff.encoding);
- topDictTracker.setEntryLocation('Encoding', [output.length], output);
- output.add(encoding);
- }
- }
-
- if (cff.charset && cff.topDict.hasName('charset')) {
- if (cff.charset.predefined) {
- topDictTracker.setEntryLocation('charset', [cff.charset.format],
- output);
- } else {
- var charset = this.compileCharset(cff.charset);
- topDictTracker.setEntryLocation('charset', [output.length], output);
- output.add(charset);
- }
- }
-
- var charStrings = this.compileCharStrings(cff.charStrings);
- topDictTracker.setEntryLocation('CharStrings', [output.length], output);
- output.add(charStrings);
-
- if (cff.isCIDFont) {
- // For some reason FDSelect must be in front of FDArray on windows. OSX
- // and linux don't seem to care.
- topDictTracker.setEntryLocation('FDSelect', [output.length], output);
- var fdSelect = this.compileFDSelect(cff.fdSelect.raw);
- output.add(fdSelect);
-
- var compiled = this.compileTopDicts(cff.fdArray, output.length);
- topDictTracker.setEntryLocation('FDArray', [output.length], output);
- output.add(compiled.output);
- var fontDictTrackers = compiled.trackers;
-
- this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output);
- }
-
- this.compilePrivateDicts([cff.topDict], [topDictTracker], output);
-
- return output.data;
- },
- encodeNumber: function CFFCompiler_encodeNumber(value) {
- if (parseFloat(value) == parseInt(value) && !isNaN(value)) // isInt
- return this.encodeInteger(value);
- else
- return this.encodeFloat(value);
- },
- encodeFloat: function CFFCompiler_encodeFloat(value) {
- value = value.toString();
- // Strip off the any leading zeros.
- if (value.substr(0, 2) === '0.')
- value = value.substr(1);
- else if (value.substr(0, 3) === '-0.')
- value = '-' + value.substr(2);
- var nibbles = [];
- for (var i = 0, ii = value.length; i < ii; ++i) {
- var a = value.charAt(i), b = value.charAt(i + 1);
- var nibble;
- if (a === 'e' && b === '-') {
- nibble = 0xc;
- ++i;
- } else if (a === '.') {
- nibble = 0xa;
- } else if (a === 'E') {
- nibble = 0xb;
- } else if (a === '-') {
- nibble = 0xe;
- } else {
- nibble = a;
- }
- nibbles.push(nibble);
- }
- nibbles.push(0xf);
- if (nibbles.length % 2)
- nibbles.push(0xf);
- var out = [30];
- for (var i = 0, ii = nibbles.length; i < ii; i += 2)
- out.push(nibbles[i] << 4 | nibbles[i + 1]);
- return out;
- },
- encodeInteger: function CFFCompiler_encodeInteger(value) {
- var code;
- if (value >= -107 && value <= 107) {
- code = [value + 139];
- } else if (value >= 108 && value <= 1131) {
- value = [value - 108];
- code = [(value >> 8) + 247, value & 0xFF];
- } else if (value >= -1131 && value <= -108) {
- value = -value - 108;
- code = [(value >> 8) + 251, value & 0xFF];
- } else if (value >= -32768 && value <= 32767) {
- code = [0x1c, (value >> 8) & 0xFF, value & 0xFF];
- } else {
- code = [0x1d,
- (value >> 24) & 0xFF,
- (value >> 16) & 0xFF,
- (value >> 8) & 0xFF,
- value & 0xFF];
- }
- return code;
- },
- compileHeader: function CFFCompiler_compileHeader(header) {
- return [
- header.major,
- header.minor,
- header.hdrSize,
- header.offSize
- ];
- },
- compileNameIndex: function CFFCompiler_compileNameIndex(names) {
- var nameIndex = new CFFIndex();
- for (var i = 0, ii = names.length; i < ii; ++i)
- nameIndex.add(stringToArray(names[i]));
- return this.compileIndex(nameIndex);
- },
- compileTopDicts: function CFFCompiler_compileTopDicts(dicts, length) {
- var fontDictTrackers = [];
- var fdArrayIndex = new CFFIndex();
- for (var i = 0, ii = dicts.length; i < ii; ++i) {
- var fontDict = dicts[i];
- var fontDictTracker = new CFFOffsetTracker();
- var fontDictData = this.compileDict(fontDict, fontDictTracker);
- fontDictTrackers.push(fontDictTracker);
- fdArrayIndex.add(fontDictData);
- fontDictTracker.offset(length);
- }
- fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers);
- return {
- trackers: fontDictTrackers,
- output: fdArrayIndex
- };
- },
- compilePrivateDicts: function CFFCompiler_compilePrivateDicts(dicts,
- trackers,
- output) {
- for (var i = 0, ii = dicts.length; i < ii; ++i) {
- var fontDict = dicts[i];
- if (!fontDict.privateDict || !fontDict.hasName('Private'))
- continue;
- var privateDict = fontDict.privateDict;
- var privateDictTracker = new CFFOffsetTracker();
- var privateDictData = this.compileDict(privateDict, privateDictTracker);
-
- privateDictTracker.offset(output.length);
- trackers[i].setEntryLocation('Private',
- [privateDictData.length, output.length],
- output);
- output.add(privateDictData);
-
- if (privateDict.subrsIndex && privateDict.hasName('Subrs')) {
- var subrs = this.compileIndex(privateDict.subrsIndex);
- privateDictTracker.setEntryLocation('Subrs', [privateDictData.length],
- output);
- output.add(subrs);
- }
- }
- },
- compileDict: function CFFCompiler_compileDict(dict, offsetTracker) {
- var out = [];
- // The dictionary keys must be in a certain order.
- var order = dict.order;
- for (var i = 0; i < order.length; ++i) {
- var key = order[i];
- if (!(key in dict.values))
- continue;
- var values = dict.values[key];
- var types = dict.types[key];
- if (!isArray(types)) types = [types];
- if (!isArray(values)) values = [values];
-
- // Remove any empty dict values.
- if (values.length === 0)
- continue;
-
- for (var j = 0, jj = types.length; j < jj; ++j) {
- var type = types[j];
- var value = values[j];
- switch (type) {
- case 'num':
- case 'sid':
- out = out.concat(this.encodeNumber(value));
- break;
- case 'offset':
- // For offsets we just insert a 32bit integer so we don't have to
- // deal with figuring out the length of the offset when it gets
- // replaced later on by the compiler.
- var name = dict.keyToNameMap[key];
- // Some offsets have the offset and the length, so just record the
- // position of the first one.
- if (!offsetTracker.isTracking(name))
- offsetTracker.track(name, out.length);
- out = out.concat([0x1d, 0, 0, 0, 0]);
- break;
- case 'array':
- case 'delta':
- out = out.concat(this.encodeNumber(value));
- for (var k = 1, kk = values.length; k < kk; ++k)
- out = out.concat(this.encodeNumber(values[k]));
- break;
- default:
- error('Unknown data type of ' + type);
- break;
- }
- }
- out = out.concat(dict.opcodes[key]);
- }
- return out;
- },
- compileStringIndex: function CFFCompiler_compileStringIndex(strings) {
- var stringIndex = new CFFIndex();
- for (var i = 0, ii = strings.length; i < ii; ++i)
- stringIndex.add(stringToArray(strings[i]));
- return this.compileIndex(stringIndex);
- },
- compileGlobalSubrIndex: function CFFCompiler_compileGlobalSubrIndex() {
- var globalSubrIndex = this.cff.globalSubrIndex;
- this.out.writeByteArray(this.compileIndex(globalSubrIndex));
- },
- compileCharStrings: function CFFCompiler_compileCharStrings(charStrings) {
- return this.compileIndex(charStrings);
- },
- compileCharset: function CFFCompiler_compileCharset(charset) {
- return this.compileTypedArray(charset.raw);
- },
- compileEncoding: function CFFCompiler_compileEncoding(encoding) {
- return this.compileTypedArray(encoding.raw);
- },
- compileFDSelect: function CFFCompiler_compileFDSelect(fdSelect) {
- return this.compileTypedArray(fdSelect);
- },
- compileTypedArray: function CFFCompiler_compileTypedArray(data) {
- var out = [];
- for (var i = 0, ii = data.length; i < ii; ++i)
- out[i] = data[i];
- return out;
- },
- compileIndex: function CFFCompiler_compileIndex(index, trackers) {
- trackers = trackers || [];
- var objects = index.objects;
- // First 2 bytes contains the number of objects contained into this index
- var count = objects.length;
-
- // If there is no object, just create an index. This technically
- // should just be [0, 0] but OTS has an issue with that.
- if (count == 0)
- return [0, 0, 0];
-
- var data = [(count >> 8) & 0xFF, count & 0xff];
-
- var lastOffset = 1;
- for (var i = 0; i < count; ++i)
- lastOffset += objects[i].length;
-
- var offsetSize;
- if (lastOffset < 0x100)
- offsetSize = 1;
- else if (lastOffset < 0x10000)
- offsetSize = 2;
- else if (lastOffset < 0x1000000)
- offsetSize = 3;
- else
- offsetSize = 4;
-
- // Next byte contains the offset size use to reference object in the file
- data.push(offsetSize);
-
- // Add another offset after this one because we need a new offset
- var relativeOffset = 1;
- for (var i = 0; i < count + 1; i++) {
- if (offsetSize === 1) {
- data.push(relativeOffset & 0xFF);
- } else if (offsetSize === 2) {
- data.push((relativeOffset >> 8) & 0xFF,
- relativeOffset & 0xFF);
- } else if (offsetSize === 3) {
- data.push((relativeOffset >> 16) & 0xFF,
- (relativeOffset >> 8) & 0xFF,
- relativeOffset & 0xFF);
- } else {
- data.push((relativeOffset >>> 24) & 0xFF,
- (relativeOffset >> 16) & 0xFF,
- (relativeOffset >> 8) & 0xFF,
- relativeOffset & 0xFF);
- }
-
- if (objects[i])
- relativeOffset += objects[i].length;
- }
- var offset = data.length;
-
- for (var i = 0; i < count; i++) {
- // Notify the tracker where the object will be offset in the data.
- if (trackers[i])
- trackers[i].offset(data.length);
- for (var j = 0, jj = objects[i].length; j < jj; j++)
- data.push(objects[i][j]);
- }
- return data;
- }
- };
- return CFFCompiler;
-})();
-
-
-
-var GlyphsUnicode = {
- A: 0x0041,
- AE: 0x00C6,
- AEacute: 0x01FC,
- AEmacron: 0x01E2,
- AEsmall: 0xF7E6,
- Aacute: 0x00C1,
- Aacutesmall: 0xF7E1,
- Abreve: 0x0102,
- Abreveacute: 0x1EAE,
- Abrevecyrillic: 0x04D0,
- Abrevedotbelow: 0x1EB6,
- Abrevegrave: 0x1EB0,
- Abrevehookabove: 0x1EB2,
- Abrevetilde: 0x1EB4,
- Acaron: 0x01CD,
- Acircle: 0x24B6,
- Acircumflex: 0x00C2,
- Acircumflexacute: 0x1EA4,
- Acircumflexdotbelow: 0x1EAC,
- Acircumflexgrave: 0x1EA6,
- Acircumflexhookabove: 0x1EA8,
- Acircumflexsmall: 0xF7E2,
- Acircumflextilde: 0x1EAA,
- Acute: 0xF6C9,
- Acutesmall: 0xF7B4,
- Acyrillic: 0x0410,
- Adblgrave: 0x0200,
- Adieresis: 0x00C4,
- Adieresiscyrillic: 0x04D2,
- Adieresismacron: 0x01DE,
- Adieresissmall: 0xF7E4,
- Adotbelow: 0x1EA0,
- Adotmacron: 0x01E0,
- Agrave: 0x00C0,
- Agravesmall: 0xF7E0,
- Ahookabove: 0x1EA2,
- Aiecyrillic: 0x04D4,
- Ainvertedbreve: 0x0202,
- Alpha: 0x0391,
- Alphatonos: 0x0386,
- Amacron: 0x0100,
- Amonospace: 0xFF21,
- Aogonek: 0x0104,
- Aring: 0x00C5,
- Aringacute: 0x01FA,
- Aringbelow: 0x1E00,
- Aringsmall: 0xF7E5,
- Asmall: 0xF761,
- Atilde: 0x00C3,
- Atildesmall: 0xF7E3,
- Aybarmenian: 0x0531,
- B: 0x0042,
- Bcircle: 0x24B7,
- Bdotaccent: 0x1E02,
- Bdotbelow: 0x1E04,
- Becyrillic: 0x0411,
- Benarmenian: 0x0532,
- Beta: 0x0392,
- Bhook: 0x0181,
- Blinebelow: 0x1E06,
- Bmonospace: 0xFF22,
- Brevesmall: 0xF6F4,
- Bsmall: 0xF762,
- Btopbar: 0x0182,
- C: 0x0043,
- Caarmenian: 0x053E,
- Cacute: 0x0106,
- Caron: 0xF6CA,
- Caronsmall: 0xF6F5,
- Ccaron: 0x010C,
- Ccedilla: 0x00C7,
- Ccedillaacute: 0x1E08,
- Ccedillasmall: 0xF7E7,
- Ccircle: 0x24B8,
- Ccircumflex: 0x0108,
- Cdot: 0x010A,
- Cdotaccent: 0x010A,
- Cedillasmall: 0xF7B8,
- Chaarmenian: 0x0549,
- Cheabkhasiancyrillic: 0x04BC,
- Checyrillic: 0x0427,
- Chedescenderabkhasiancyrillic: 0x04BE,
- Chedescendercyrillic: 0x04B6,
- Chedieresiscyrillic: 0x04F4,
- Cheharmenian: 0x0543,
- Chekhakassiancyrillic: 0x04CB,
- Cheverticalstrokecyrillic: 0x04B8,
- Chi: 0x03A7,
- Chook: 0x0187,
- Circumflexsmall: 0xF6F6,
- Cmonospace: 0xFF23,
- Coarmenian: 0x0551,
- Csmall: 0xF763,
- D: 0x0044,
- DZ: 0x01F1,
- DZcaron: 0x01C4,
- Daarmenian: 0x0534,
- Dafrican: 0x0189,
- Dcaron: 0x010E,
- Dcedilla: 0x1E10,
- Dcircle: 0x24B9,
- Dcircumflexbelow: 0x1E12,
- Dcroat: 0x0110,
- Ddotaccent: 0x1E0A,
- Ddotbelow: 0x1E0C,
- Decyrillic: 0x0414,
- Deicoptic: 0x03EE,
- Delta: 0x2206,
- Deltagreek: 0x0394,
- Dhook: 0x018A,
- Dieresis: 0xF6CB,
- DieresisAcute: 0xF6CC,
- DieresisGrave: 0xF6CD,
- Dieresissmall: 0xF7A8,
- Digammagreek: 0x03DC,
- Djecyrillic: 0x0402,
- Dlinebelow: 0x1E0E,
- Dmonospace: 0xFF24,
- Dotaccentsmall: 0xF6F7,
- Dslash: 0x0110,
- Dsmall: 0xF764,
- Dtopbar: 0x018B,
- Dz: 0x01F2,
- Dzcaron: 0x01C5,
- Dzeabkhasiancyrillic: 0x04E0,
- Dzecyrillic: 0x0405,
- Dzhecyrillic: 0x040F,
- E: 0x0045,
- Eacute: 0x00C9,
- Eacutesmall: 0xF7E9,
- Ebreve: 0x0114,
- Ecaron: 0x011A,
- Ecedillabreve: 0x1E1C,
- Echarmenian: 0x0535,
- Ecircle: 0x24BA,
- Ecircumflex: 0x00CA,
- Ecircumflexacute: 0x1EBE,
- Ecircumflexbelow: 0x1E18,
- Ecircumflexdotbelow: 0x1EC6,
- Ecircumflexgrave: 0x1EC0,
- Ecircumflexhookabove: 0x1EC2,
- Ecircumflexsmall: 0xF7EA,
- Ecircumflextilde: 0x1EC4,
- Ecyrillic: 0x0404,
- Edblgrave: 0x0204,
- Edieresis: 0x00CB,
- Edieresissmall: 0xF7EB,
- Edot: 0x0116,
- Edotaccent: 0x0116,
- Edotbelow: 0x1EB8,
- Efcyrillic: 0x0424,
- Egrave: 0x00C8,
- Egravesmall: 0xF7E8,
- Eharmenian: 0x0537,
- Ehookabove: 0x1EBA,
- Eightroman: 0x2167,
- Einvertedbreve: 0x0206,
- Eiotifiedcyrillic: 0x0464,
- Elcyrillic: 0x041B,
- Elevenroman: 0x216A,
- Emacron: 0x0112,
- Emacronacute: 0x1E16,
- Emacrongrave: 0x1E14,
- Emcyrillic: 0x041C,
- Emonospace: 0xFF25,
- Encyrillic: 0x041D,
- Endescendercyrillic: 0x04A2,
- Eng: 0x014A,
- Enghecyrillic: 0x04A4,
- Enhookcyrillic: 0x04C7,
- Eogonek: 0x0118,
- Eopen: 0x0190,
- Epsilon: 0x0395,
- Epsilontonos: 0x0388,
- Ercyrillic: 0x0420,
- Ereversed: 0x018E,
- Ereversedcyrillic: 0x042D,
- Escyrillic: 0x0421,
- Esdescendercyrillic: 0x04AA,
- Esh: 0x01A9,
- Esmall: 0xF765,
- Eta: 0x0397,
- Etarmenian: 0x0538,
- Etatonos: 0x0389,
- Eth: 0x00D0,
- Ethsmall: 0xF7F0,
- Etilde: 0x1EBC,
- Etildebelow: 0x1E1A,
- Euro: 0x20AC,
- Ezh: 0x01B7,
- Ezhcaron: 0x01EE,
- Ezhreversed: 0x01B8,
- F: 0x0046,
- Fcircle: 0x24BB,
- Fdotaccent: 0x1E1E,
- Feharmenian: 0x0556,
- Feicoptic: 0x03E4,
- Fhook: 0x0191,
- Fitacyrillic: 0x0472,
- Fiveroman: 0x2164,
- Fmonospace: 0xFF26,
- Fourroman: 0x2163,
- Fsmall: 0xF766,
- G: 0x0047,
- GBsquare: 0x3387,
- Gacute: 0x01F4,
- Gamma: 0x0393,
- Gammaafrican: 0x0194,
- Gangiacoptic: 0x03EA,
- Gbreve: 0x011E,
- Gcaron: 0x01E6,
- Gcedilla: 0x0122,
- Gcircle: 0x24BC,
- Gcircumflex: 0x011C,
- Gcommaaccent: 0x0122,
- Gdot: 0x0120,
- Gdotaccent: 0x0120,
- Gecyrillic: 0x0413,
- Ghadarmenian: 0x0542,
- Ghemiddlehookcyrillic: 0x0494,
- Ghestrokecyrillic: 0x0492,
- Gheupturncyrillic: 0x0490,
- Ghook: 0x0193,
- Gimarmenian: 0x0533,
- Gjecyrillic: 0x0403,
- Gmacron: 0x1E20,
- Gmonospace: 0xFF27,
- Grave: 0xF6CE,
- Gravesmall: 0xF760,
- Gsmall: 0xF767,
- Gsmallhook: 0x029B,
- Gstroke: 0x01E4,
- H: 0x0048,
- H18533: 0x25CF,
- H18543: 0x25AA,
- H18551: 0x25AB,
- H22073: 0x25A1,
- HPsquare: 0x33CB,
- Haabkhasiancyrillic: 0x04A8,
- Hadescendercyrillic: 0x04B2,
- Hardsigncyrillic: 0x042A,
- Hbar: 0x0126,
- Hbrevebelow: 0x1E2A,
- Hcedilla: 0x1E28,
- Hcircle: 0x24BD,
- Hcircumflex: 0x0124,
- Hdieresis: 0x1E26,
- Hdotaccent: 0x1E22,
- Hdotbelow: 0x1E24,
- Hmonospace: 0xFF28,
- Hoarmenian: 0x0540,
- Horicoptic: 0x03E8,
- Hsmall: 0xF768,
- Hungarumlaut: 0xF6CF,
- Hungarumlautsmall: 0xF6F8,
- Hzsquare: 0x3390,
- I: 0x0049,
- IAcyrillic: 0x042F,
- IJ: 0x0132,
- IUcyrillic: 0x042E,
- Iacute: 0x00CD,
- Iacutesmall: 0xF7ED,
- Ibreve: 0x012C,
- Icaron: 0x01CF,
- Icircle: 0x24BE,
- Icircumflex: 0x00CE,
- Icircumflexsmall: 0xF7EE,
- Icyrillic: 0x0406,
- Idblgrave: 0x0208,
- Idieresis: 0x00CF,
- Idieresisacute: 0x1E2E,
- Idieresiscyrillic: 0x04E4,
- Idieresissmall: 0xF7EF,
- Idot: 0x0130,
- Idotaccent: 0x0130,
- Idotbelow: 0x1ECA,
- Iebrevecyrillic: 0x04D6,
- Iecyrillic: 0x0415,
- Ifraktur: 0x2111,
- Igrave: 0x00CC,
- Igravesmall: 0xF7EC,
- Ihookabove: 0x1EC8,
- Iicyrillic: 0x0418,
- Iinvertedbreve: 0x020A,
- Iishortcyrillic: 0x0419,
- Imacron: 0x012A,
- Imacroncyrillic: 0x04E2,
- Imonospace: 0xFF29,
- Iniarmenian: 0x053B,
- Iocyrillic: 0x0401,
- Iogonek: 0x012E,
- Iota: 0x0399,
- Iotaafrican: 0x0196,
- Iotadieresis: 0x03AA,
- Iotatonos: 0x038A,
- Ismall: 0xF769,
- Istroke: 0x0197,
- Itilde: 0x0128,
- Itildebelow: 0x1E2C,
- Izhitsacyrillic: 0x0474,
- Izhitsadblgravecyrillic: 0x0476,
- J: 0x004A,
- Jaarmenian: 0x0541,
- Jcircle: 0x24BF,
- Jcircumflex: 0x0134,
- Jecyrillic: 0x0408,
- Jheharmenian: 0x054B,
- Jmonospace: 0xFF2A,
- Jsmall: 0xF76A,
- K: 0x004B,
- KBsquare: 0x3385,
- KKsquare: 0x33CD,
- Kabashkircyrillic: 0x04A0,
- Kacute: 0x1E30,
- Kacyrillic: 0x041A,
- Kadescendercyrillic: 0x049A,
- Kahookcyrillic: 0x04C3,
- Kappa: 0x039A,
- Kastrokecyrillic: 0x049E,
- Kaverticalstrokecyrillic: 0x049C,
- Kcaron: 0x01E8,
- Kcedilla: 0x0136,
- Kcircle: 0x24C0,
- Kcommaaccent: 0x0136,
- Kdotbelow: 0x1E32,
- Keharmenian: 0x0554,
- Kenarmenian: 0x053F,
- Khacyrillic: 0x0425,
- Kheicoptic: 0x03E6,
- Khook: 0x0198,
- Kjecyrillic: 0x040C,
- Klinebelow: 0x1E34,
- Kmonospace: 0xFF2B,
- Koppacyrillic: 0x0480,
- Koppagreek: 0x03DE,
- Ksicyrillic: 0x046E,
- Ksmall: 0xF76B,
- L: 0x004C,
- LJ: 0x01C7,
- LL: 0xF6BF,
- Lacute: 0x0139,
- Lambda: 0x039B,
- Lcaron: 0x013D,
- Lcedilla: 0x013B,
- Lcircle: 0x24C1,
- Lcircumflexbelow: 0x1E3C,
- Lcommaaccent: 0x013B,
- Ldot: 0x013F,
- Ldotaccent: 0x013F,
- Ldotbelow: 0x1E36,
- Ldotbelowmacron: 0x1E38,
- Liwnarmenian: 0x053C,
- Lj: 0x01C8,
- Ljecyrillic: 0x0409,
- Llinebelow: 0x1E3A,
- Lmonospace: 0xFF2C,
- Lslash: 0x0141,
- Lslashsmall: 0xF6F9,
- Lsmall: 0xF76C,
- M: 0x004D,
- MBsquare: 0x3386,
- Macron: 0xF6D0,
- Macronsmall: 0xF7AF,
- Macute: 0x1E3E,
- Mcircle: 0x24C2,
- Mdotaccent: 0x1E40,
- Mdotbelow: 0x1E42,
- Menarmenian: 0x0544,
- Mmonospace: 0xFF2D,
- Msmall: 0xF76D,
- Mturned: 0x019C,
- Mu: 0x039C,
- N: 0x004E,
- NJ: 0x01CA,
- Nacute: 0x0143,
- Ncaron: 0x0147,
- Ncedilla: 0x0145,
- Ncircle: 0x24C3,
- Ncircumflexbelow: 0x1E4A,
- Ncommaaccent: 0x0145,
- Ndotaccent: 0x1E44,
- Ndotbelow: 0x1E46,
- Nhookleft: 0x019D,
- Nineroman: 0x2168,
- Nj: 0x01CB,
- Njecyrillic: 0x040A,
- Nlinebelow: 0x1E48,
- Nmonospace: 0xFF2E,
- Nowarmenian: 0x0546,
- Nsmall: 0xF76E,
- Ntilde: 0x00D1,
- Ntildesmall: 0xF7F1,
- Nu: 0x039D,
- O: 0x004F,
- OE: 0x0152,
- OEsmall: 0xF6FA,
- Oacute: 0x00D3,
- Oacutesmall: 0xF7F3,
- Obarredcyrillic: 0x04E8,
- Obarreddieresiscyrillic: 0x04EA,
- Obreve: 0x014E,
- Ocaron: 0x01D1,
- Ocenteredtilde: 0x019F,
- Ocircle: 0x24C4,
- Ocircumflex: 0x00D4,
- Ocircumflexacute: 0x1ED0,
- Ocircumflexdotbelow: 0x1ED8,
- Ocircumflexgrave: 0x1ED2,
- Ocircumflexhookabove: 0x1ED4,
- Ocircumflexsmall: 0xF7F4,
- Ocircumflextilde: 0x1ED6,
- Ocyrillic: 0x041E,
- Odblacute: 0x0150,
- Odblgrave: 0x020C,
- Odieresis: 0x00D6,
- Odieresiscyrillic: 0x04E6,
- Odieresissmall: 0xF7F6,
- Odotbelow: 0x1ECC,
- Ogoneksmall: 0xF6FB,
- Ograve: 0x00D2,
- Ogravesmall: 0xF7F2,
- Oharmenian: 0x0555,
- Ohm: 0x2126,
- Ohookabove: 0x1ECE,
- Ohorn: 0x01A0,
- Ohornacute: 0x1EDA,
- Ohorndotbelow: 0x1EE2,
- Ohorngrave: 0x1EDC,
- Ohornhookabove: 0x1EDE,
- Ohorntilde: 0x1EE0,
- Ohungarumlaut: 0x0150,
- Oi: 0x01A2,
- Oinvertedbreve: 0x020E,
- Omacron: 0x014C,
- Omacronacute: 0x1E52,
- Omacrongrave: 0x1E50,
- Omega: 0x2126,
- Omegacyrillic: 0x0460,
- Omegagreek: 0x03A9,
- Omegaroundcyrillic: 0x047A,
- Omegatitlocyrillic: 0x047C,
- Omegatonos: 0x038F,
- Omicron: 0x039F,
- Omicrontonos: 0x038C,
- Omonospace: 0xFF2F,
- Oneroman: 0x2160,
- Oogonek: 0x01EA,
- Oogonekmacron: 0x01EC,
- Oopen: 0x0186,
- Oslash: 0x00D8,
- Oslashacute: 0x01FE,
- Oslashsmall: 0xF7F8,
- Osmall: 0xF76F,
- Ostrokeacute: 0x01FE,
- Otcyrillic: 0x047E,
- Otilde: 0x00D5,
- Otildeacute: 0x1E4C,
- Otildedieresis: 0x1E4E,
- Otildesmall: 0xF7F5,
- P: 0x0050,
- Pacute: 0x1E54,
- Pcircle: 0x24C5,
- Pdotaccent: 0x1E56,
- Pecyrillic: 0x041F,
- Peharmenian: 0x054A,
- Pemiddlehookcyrillic: 0x04A6,
- Phi: 0x03A6,
- Phook: 0x01A4,
- Pi: 0x03A0,
- Piwrarmenian: 0x0553,
- Pmonospace: 0xFF30,
- Psi: 0x03A8,
- Psicyrillic: 0x0470,
- Psmall: 0xF770,
- Q: 0x0051,
- Qcircle: 0x24C6,
- Qmonospace: 0xFF31,
- Qsmall: 0xF771,
- R: 0x0052,
- Raarmenian: 0x054C,
- Racute: 0x0154,
- Rcaron: 0x0158,
- Rcedilla: 0x0156,
- Rcircle: 0x24C7,
- Rcommaaccent: 0x0156,
- Rdblgrave: 0x0210,
- Rdotaccent: 0x1E58,
- Rdotbelow: 0x1E5A,
- Rdotbelowmacron: 0x1E5C,
- Reharmenian: 0x0550,
- Rfraktur: 0x211C,
- Rho: 0x03A1,
- Ringsmall: 0xF6FC,
- Rinvertedbreve: 0x0212,
- Rlinebelow: 0x1E5E,
- Rmonospace: 0xFF32,
- Rsmall: 0xF772,
- Rsmallinverted: 0x0281,
- Rsmallinvertedsuperior: 0x02B6,
- S: 0x0053,
- SF010000: 0x250C,
- SF020000: 0x2514,
- SF030000: 0x2510,
- SF040000: 0x2518,
- SF050000: 0x253C,
- SF060000: 0x252C,
- SF070000: 0x2534,
- SF080000: 0x251C,
- SF090000: 0x2524,
- SF100000: 0x2500,
- SF110000: 0x2502,
- SF190000: 0x2561,
- SF200000: 0x2562,
- SF210000: 0x2556,
- SF220000: 0x2555,
- SF230000: 0x2563,
- SF240000: 0x2551,
- SF250000: 0x2557,
- SF260000: 0x255D,
- SF270000: 0x255C,
- SF280000: 0x255B,
- SF360000: 0x255E,
- SF370000: 0x255F,
- SF380000: 0x255A,
- SF390000: 0x2554,
- SF400000: 0x2569,
- SF410000: 0x2566,
- SF420000: 0x2560,
- SF430000: 0x2550,
- SF440000: 0x256C,
- SF450000: 0x2567,
- SF460000: 0x2568,
- SF470000: 0x2564,
- SF480000: 0x2565,
- SF490000: 0x2559,
- SF500000: 0x2558,
- SF510000: 0x2552,
- SF520000: 0x2553,
- SF530000: 0x256B,
- SF540000: 0x256A,
- Sacute: 0x015A,
- Sacutedotaccent: 0x1E64,
- Sampigreek: 0x03E0,
- Scaron: 0x0160,
- Scarondotaccent: 0x1E66,
- Scaronsmall: 0xF6FD,
- Scedilla: 0x015E,
- Schwa: 0x018F,
- Schwacyrillic: 0x04D8,
- Schwadieresiscyrillic: 0x04DA,
- Scircle: 0x24C8,
- Scircumflex: 0x015C,
- Scommaaccent: 0x0218,
- Sdotaccent: 0x1E60,
- Sdotbelow: 0x1E62,
- Sdotbelowdotaccent: 0x1E68,
- Seharmenian: 0x054D,
- Sevenroman: 0x2166,
- Shaarmenian: 0x0547,
- Shacyrillic: 0x0428,
- Shchacyrillic: 0x0429,
- Sheicoptic: 0x03E2,
- Shhacyrillic: 0x04BA,
- Shimacoptic: 0x03EC,
- Sigma: 0x03A3,
- Sixroman: 0x2165,
- Smonospace: 0xFF33,
- Softsigncyrillic: 0x042C,
- Ssmall: 0xF773,
- Stigmagreek: 0x03DA,
- T: 0x0054,
- Tau: 0x03A4,
- Tbar: 0x0166,
- Tcaron: 0x0164,
- Tcedilla: 0x0162,
- Tcircle: 0x24C9,
- Tcircumflexbelow: 0x1E70,
- Tcommaaccent: 0x0162,
- Tdotaccent: 0x1E6A,
- Tdotbelow: 0x1E6C,
- Tecyrillic: 0x0422,
- Tedescendercyrillic: 0x04AC,
- Tenroman: 0x2169,
- Tetsecyrillic: 0x04B4,
- Theta: 0x0398,
- Thook: 0x01AC,
- Thorn: 0x00DE,
- Thornsmall: 0xF7FE,
- Threeroman: 0x2162,
- Tildesmall: 0xF6FE,
- Tiwnarmenian: 0x054F,
- Tlinebelow: 0x1E6E,
- Tmonospace: 0xFF34,
- Toarmenian: 0x0539,
- Tonefive: 0x01BC,
- Tonesix: 0x0184,
- Tonetwo: 0x01A7,
- Tretroflexhook: 0x01AE,
- Tsecyrillic: 0x0426,
- Tshecyrillic: 0x040B,
- Tsmall: 0xF774,
- Twelveroman: 0x216B,
- Tworoman: 0x2161,
- U: 0x0055,
- Uacute: 0x00DA,
- Uacutesmall: 0xF7FA,
- Ubreve: 0x016C,
- Ucaron: 0x01D3,
- Ucircle: 0x24CA,
- Ucircumflex: 0x00DB,
- Ucircumflexbelow: 0x1E76,
- Ucircumflexsmall: 0xF7FB,
- Ucyrillic: 0x0423,
- Udblacute: 0x0170,
- Udblgrave: 0x0214,
- Udieresis: 0x00DC,
- Udieresisacute: 0x01D7,
- Udieresisbelow: 0x1E72,
- Udieresiscaron: 0x01D9,
- Udieresiscyrillic: 0x04F0,
- Udieresisgrave: 0x01DB,
- Udieresismacron: 0x01D5,
- Udieresissmall: 0xF7FC,
- Udotbelow: 0x1EE4,
- Ugrave: 0x00D9,
- Ugravesmall: 0xF7F9,
- Uhookabove: 0x1EE6,
- Uhorn: 0x01AF,
- Uhornacute: 0x1EE8,
- Uhorndotbelow: 0x1EF0,
- Uhorngrave: 0x1EEA,
- Uhornhookabove: 0x1EEC,
- Uhorntilde: 0x1EEE,
- Uhungarumlaut: 0x0170,
- Uhungarumlautcyrillic: 0x04F2,
- Uinvertedbreve: 0x0216,
- Ukcyrillic: 0x0478,
- Umacron: 0x016A,
- Umacroncyrillic: 0x04EE,
- Umacrondieresis: 0x1E7A,
- Umonospace: 0xFF35,
- Uogonek: 0x0172,
- Upsilon: 0x03A5,
- Upsilon1: 0x03D2,
- Upsilonacutehooksymbolgreek: 0x03D3,
- Upsilonafrican: 0x01B1,
- Upsilondieresis: 0x03AB,
- Upsilondieresishooksymbolgreek: 0x03D4,
- Upsilonhooksymbol: 0x03D2,
- Upsilontonos: 0x038E,
- Uring: 0x016E,
- Ushortcyrillic: 0x040E,
- Usmall: 0xF775,
- Ustraightcyrillic: 0x04AE,
- Ustraightstrokecyrillic: 0x04B0,
- Utilde: 0x0168,
- Utildeacute: 0x1E78,
- Utildebelow: 0x1E74,
- V: 0x0056,
- Vcircle: 0x24CB,
- Vdotbelow: 0x1E7E,
- Vecyrillic: 0x0412,
- Vewarmenian: 0x054E,
- Vhook: 0x01B2,
- Vmonospace: 0xFF36,
- Voarmenian: 0x0548,
- Vsmall: 0xF776,
- Vtilde: 0x1E7C,
- W: 0x0057,
- Wacute: 0x1E82,
- Wcircle: 0x24CC,
- Wcircumflex: 0x0174,
- Wdieresis: 0x1E84,
- Wdotaccent: 0x1E86,
- Wdotbelow: 0x1E88,
- Wgrave: 0x1E80,
- Wmonospace: 0xFF37,
- Wsmall: 0xF777,
- X: 0x0058,
- Xcircle: 0x24CD,
- Xdieresis: 0x1E8C,
- Xdotaccent: 0x1E8A,
- Xeharmenian: 0x053D,
- Xi: 0x039E,
- Xmonospace: 0xFF38,
- Xsmall: 0xF778,
- Y: 0x0059,
- Yacute: 0x00DD,
- Yacutesmall: 0xF7FD,
- Yatcyrillic: 0x0462,
- Ycircle: 0x24CE,
- Ycircumflex: 0x0176,
- Ydieresis: 0x0178,
- Ydieresissmall: 0xF7FF,
- Ydotaccent: 0x1E8E,
- Ydotbelow: 0x1EF4,
- Yericyrillic: 0x042B,
- Yerudieresiscyrillic: 0x04F8,
- Ygrave: 0x1EF2,
- Yhook: 0x01B3,
- Yhookabove: 0x1EF6,
- Yiarmenian: 0x0545,
- Yicyrillic: 0x0407,
- Yiwnarmenian: 0x0552,
- Ymonospace: 0xFF39,
- Ysmall: 0xF779,
- Ytilde: 0x1EF8,
- Yusbigcyrillic: 0x046A,
- Yusbigiotifiedcyrillic: 0x046C,
- Yuslittlecyrillic: 0x0466,
- Yuslittleiotifiedcyrillic: 0x0468,
- Z: 0x005A,
- Zaarmenian: 0x0536,
- Zacute: 0x0179,
- Zcaron: 0x017D,
- Zcaronsmall: 0xF6FF,
- Zcircle: 0x24CF,
- Zcircumflex: 0x1E90,
- Zdot: 0x017B,
- Zdotaccent: 0x017B,
- Zdotbelow: 0x1E92,
- Zecyrillic: 0x0417,
- Zedescendercyrillic: 0x0498,
- Zedieresiscyrillic: 0x04DE,
- Zeta: 0x0396,
- Zhearmenian: 0x053A,
- Zhebrevecyrillic: 0x04C1,
- Zhecyrillic: 0x0416,
- Zhedescendercyrillic: 0x0496,
- Zhedieresiscyrillic: 0x04DC,
- Zlinebelow: 0x1E94,
- Zmonospace: 0xFF3A,
- Zsmall: 0xF77A,
- Zstroke: 0x01B5,
- a: 0x0061,
- aabengali: 0x0986,
- aacute: 0x00E1,
- aadeva: 0x0906,
- aagujarati: 0x0A86,
- aagurmukhi: 0x0A06,
- aamatragurmukhi: 0x0A3E,
- aarusquare: 0x3303,
- aavowelsignbengali: 0x09BE,
- aavowelsigndeva: 0x093E,
- aavowelsigngujarati: 0x0ABE,
- abbreviationmarkarmenian: 0x055F,
- abbreviationsigndeva: 0x0970,
- abengali: 0x0985,
- abopomofo: 0x311A,
- abreve: 0x0103,
- abreveacute: 0x1EAF,
- abrevecyrillic: 0x04D1,
- abrevedotbelow: 0x1EB7,
- abrevegrave: 0x1EB1,
- abrevehookabove: 0x1EB3,
- abrevetilde: 0x1EB5,
- acaron: 0x01CE,
- acircle: 0x24D0,
- acircumflex: 0x00E2,
- acircumflexacute: 0x1EA5,
- acircumflexdotbelow: 0x1EAD,
- acircumflexgrave: 0x1EA7,
- acircumflexhookabove: 0x1EA9,
- acircumflextilde: 0x1EAB,
- acute: 0x00B4,
- acutebelowcmb: 0x0317,
- acutecmb: 0x0301,
- acutecomb: 0x0301,
- acutedeva: 0x0954,
- acutelowmod: 0x02CF,
- acutetonecmb: 0x0341,
- acyrillic: 0x0430,
- adblgrave: 0x0201,
- addakgurmukhi: 0x0A71,
- adeva: 0x0905,
- adieresis: 0x00E4,
- adieresiscyrillic: 0x04D3,
- adieresismacron: 0x01DF,
- adotbelow: 0x1EA1,
- adotmacron: 0x01E1,
- ae: 0x00E6,
- aeacute: 0x01FD,
- aekorean: 0x3150,
- aemacron: 0x01E3,
- afii00208: 0x2015,
- afii08941: 0x20A4,
- afii10017: 0x0410,
- afii10018: 0x0411,
- afii10019: 0x0412,
- afii10020: 0x0413,
- afii10021: 0x0414,
- afii10022: 0x0415,
- afii10023: 0x0401,
- afii10024: 0x0416,
- afii10025: 0x0417,
- afii10026: 0x0418,
- afii10027: 0x0419,
- afii10028: 0x041A,
- afii10029: 0x041B,
- afii10030: 0x041C,
- afii10031: 0x041D,
- afii10032: 0x041E,
- afii10033: 0x041F,
- afii10034: 0x0420,
- afii10035: 0x0421,
- afii10036: 0x0422,
- afii10037: 0x0423,
- afii10038: 0x0424,
- afii10039: 0x0425,
- afii10040: 0x0426,
- afii10041: 0x0427,
- afii10042: 0x0428,
- afii10043: 0x0429,
- afii10044: 0x042A,
- afii10045: 0x042B,
- afii10046: 0x042C,
- afii10047: 0x042D,
- afii10048: 0x042E,
- afii10049: 0x042F,
- afii10050: 0x0490,
- afii10051: 0x0402,
- afii10052: 0x0403,
- afii10053: 0x0404,
- afii10054: 0x0405,
- afii10055: 0x0406,
- afii10056: 0x0407,
- afii10057: 0x0408,
- afii10058: 0x0409,
- afii10059: 0x040A,
- afii10060: 0x040B,
- afii10061: 0x040C,
- afii10062: 0x040E,
- afii10063: 0xF6C4,
- afii10064: 0xF6C5,
- afii10065: 0x0430,
- afii10066: 0x0431,
- afii10067: 0x0432,
- afii10068: 0x0433,
- afii10069: 0x0434,
- afii10070: 0x0435,
- afii10071: 0x0451,
- afii10072: 0x0436,
- afii10073: 0x0437,
- afii10074: 0x0438,
- afii10075: 0x0439,
- afii10076: 0x043A,
- afii10077: 0x043B,
- afii10078: 0x043C,
- afii10079: 0x043D,
- afii10080: 0x043E,
- afii10081: 0x043F,
- afii10082: 0x0440,
- afii10083: 0x0441,
- afii10084: 0x0442,
- afii10085: 0x0443,
- afii10086: 0x0444,
- afii10087: 0x0445,
- afii10088: 0x0446,
- afii10089: 0x0447,
- afii10090: 0x0448,
- afii10091: 0x0449,
- afii10092: 0x044A,
- afii10093: 0x044B,
- afii10094: 0x044C,
- afii10095: 0x044D,
- afii10096: 0x044E,
- afii10097: 0x044F,
- afii10098: 0x0491,
- afii10099: 0x0452,
- afii10100: 0x0453,
- afii10101: 0x0454,
- afii10102: 0x0455,
- afii10103: 0x0456,
- afii10104: 0x0457,
- afii10105: 0x0458,
- afii10106: 0x0459,
- afii10107: 0x045A,
- afii10108: 0x045B,
- afii10109: 0x045C,
- afii10110: 0x045E,
- afii10145: 0x040F,
- afii10146: 0x0462,
- afii10147: 0x0472,
- afii10148: 0x0474,
- afii10192: 0xF6C6,
- afii10193: 0x045F,
- afii10194: 0x0463,
- afii10195: 0x0473,
- afii10196: 0x0475,
- afii10831: 0xF6C7,
- afii10832: 0xF6C8,
- afii10846: 0x04D9,
- afii299: 0x200E,
- afii300: 0x200F,
- afii301: 0x200D,
- afii57381: 0x066A,
- afii57388: 0x060C,
- afii57392: 0x0660,
- afii57393: 0x0661,
- afii57394: 0x0662,
- afii57395: 0x0663,
- afii57396: 0x0664,
- afii57397: 0x0665,
- afii57398: 0x0666,
- afii57399: 0x0667,
- afii57400: 0x0668,
- afii57401: 0x0669,
- afii57403: 0x061B,
- afii57407: 0x061F,
- afii57409: 0x0621,
- afii57410: 0x0622,
- afii57411: 0x0623,
- afii57412: 0x0624,
- afii57413: 0x0625,
- afii57414: 0x0626,
- afii57415: 0x0627,
- afii57416: 0x0628,
- afii57417: 0x0629,
- afii57418: 0x062A,
- afii57419: 0x062B,
- afii57420: 0x062C,
- afii57421: 0x062D,
- afii57422: 0x062E,
- afii57423: 0x062F,
- afii57424: 0x0630,
- afii57425: 0x0631,
- afii57426: 0x0632,
- afii57427: 0x0633,
- afii57428: 0x0634,
- afii57429: 0x0635,
- afii57430: 0x0636,
- afii57431: 0x0637,
- afii57432: 0x0638,
- afii57433: 0x0639,
- afii57434: 0x063A,
- afii57440: 0x0640,
- afii57441: 0x0641,
- afii57442: 0x0642,
- afii57443: 0x0643,
- afii57444: 0x0644,
- afii57445: 0x0645,
- afii57446: 0x0646,
- afii57448: 0x0648,
- afii57449: 0x0649,
- afii57450: 0x064A,
- afii57451: 0x064B,
- afii57452: 0x064C,
- afii57453: 0x064D,
- afii57454: 0x064E,
- afii57455: 0x064F,
- afii57456: 0x0650,
- afii57457: 0x0651,
- afii57458: 0x0652,
- afii57470: 0x0647,
- afii57505: 0x06A4,
- afii57506: 0x067E,
- afii57507: 0x0686,
- afii57508: 0x0698,
- afii57509: 0x06AF,
- afii57511: 0x0679,
- afii57512: 0x0688,
- afii57513: 0x0691,
- afii57514: 0x06BA,
- afii57519: 0x06D2,
- afii57534: 0x06D5,
- afii57636: 0x20AA,
- afii57645: 0x05BE,
- afii57658: 0x05C3,
- afii57664: 0x05D0,
- afii57665: 0x05D1,
- afii57666: 0x05D2,
- afii57667: 0x05D3,
- afii57668: 0x05D4,
- afii57669: 0x05D5,
- afii57670: 0x05D6,
- afii57671: 0x05D7,
- afii57672: 0x05D8,
- afii57673: 0x05D9,
- afii57674: 0x05DA,
- afii57675: 0x05DB,
- afii57676: 0x05DC,
- afii57677: 0x05DD,
- afii57678: 0x05DE,
- afii57679: 0x05DF,
- afii57680: 0x05E0,
- afii57681: 0x05E1,
- afii57682: 0x05E2,
- afii57683: 0x05E3,
- afii57684: 0x05E4,
- afii57685: 0x05E5,
- afii57686: 0x05E6,
- afii57687: 0x05E7,
- afii57688: 0x05E8,
- afii57689: 0x05E9,
- afii57690: 0x05EA,
- afii57694: 0xFB2A,
- afii57695: 0xFB2B,
- afii57700: 0xFB4B,
- afii57705: 0xFB1F,
- afii57716: 0x05F0,
- afii57717: 0x05F1,
- afii57718: 0x05F2,
- afii57723: 0xFB35,
- afii57793: 0x05B4,
- afii57794: 0x05B5,
- afii57795: 0x05B6,
- afii57796: 0x05BB,
- afii57797: 0x05B8,
- afii57798: 0x05B7,
- afii57799: 0x05B0,
- afii57800: 0x05B2,
- afii57801: 0x05B1,
- afii57802: 0x05B3,
- afii57803: 0x05C2,
- afii57804: 0x05C1,
- afii57806: 0x05B9,
- afii57807: 0x05BC,
- afii57839: 0x05BD,
- afii57841: 0x05BF,
- afii57842: 0x05C0,
- afii57929: 0x02BC,
- afii61248: 0x2105,
- afii61289: 0x2113,
- afii61352: 0x2116,
- afii61573: 0x202C,
- afii61574: 0x202D,
- afii61575: 0x202E,
- afii61664: 0x200C,
- afii63167: 0x066D,
- afii64937: 0x02BD,
- agrave: 0x00E0,
- agujarati: 0x0A85,
- agurmukhi: 0x0A05,
- ahiragana: 0x3042,
- ahookabove: 0x1EA3,
- aibengali: 0x0990,
- aibopomofo: 0x311E,
- aideva: 0x0910,
- aiecyrillic: 0x04D5,
- aigujarati: 0x0A90,
- aigurmukhi: 0x0A10,
- aimatragurmukhi: 0x0A48,
- ainarabic: 0x0639,
- ainfinalarabic: 0xFECA,
- aininitialarabic: 0xFECB,
- ainmedialarabic: 0xFECC,
- ainvertedbreve: 0x0203,
- aivowelsignbengali: 0x09C8,
- aivowelsigndeva: 0x0948,
- aivowelsigngujarati: 0x0AC8,
- akatakana: 0x30A2,
- akatakanahalfwidth: 0xFF71,
- akorean: 0x314F,
- alef: 0x05D0,
- alefarabic: 0x0627,
- alefdageshhebrew: 0xFB30,
- aleffinalarabic: 0xFE8E,
- alefhamzaabovearabic: 0x0623,
- alefhamzaabovefinalarabic: 0xFE84,
- alefhamzabelowarabic: 0x0625,
- alefhamzabelowfinalarabic: 0xFE88,
- alefhebrew: 0x05D0,
- aleflamedhebrew: 0xFB4F,
- alefmaddaabovearabic: 0x0622,
- alefmaddaabovefinalarabic: 0xFE82,
- alefmaksuraarabic: 0x0649,
- alefmaksurafinalarabic: 0xFEF0,
- alefmaksurainitialarabic: 0xFEF3,
- alefmaksuramedialarabic: 0xFEF4,
- alefpatahhebrew: 0xFB2E,
- alefqamatshebrew: 0xFB2F,
- aleph: 0x2135,
- allequal: 0x224C,
- alpha: 0x03B1,
- alphatonos: 0x03AC,
- amacron: 0x0101,
- amonospace: 0xFF41,
- ampersand: 0x0026,
- ampersandmonospace: 0xFF06,
- ampersandsmall: 0xF726,
- amsquare: 0x33C2,
- anbopomofo: 0x3122,
- angbopomofo: 0x3124,
- angbracketleft: 0x3008, // This glyph is missing from Adobe's original list.
- angbracketright: 0x3009, // This glyph is missing from Adobe's original list.
- angkhankhuthai: 0x0E5A,
- angle: 0x2220,
- anglebracketleft: 0x3008,
- anglebracketleftvertical: 0xFE3F,
- anglebracketright: 0x3009,
- anglebracketrightvertical: 0xFE40,
- angleleft: 0x2329,
- angleright: 0x232A,
- angstrom: 0x212B,
- anoteleia: 0x0387,
- anudattadeva: 0x0952,
- anusvarabengali: 0x0982,
- anusvaradeva: 0x0902,
- anusvaragujarati: 0x0A82,
- aogonek: 0x0105,
- apaatosquare: 0x3300,
- aparen: 0x249C,
- apostrophearmenian: 0x055A,
- apostrophemod: 0x02BC,
- apple: 0xF8FF,
- approaches: 0x2250,
- approxequal: 0x2248,
- approxequalorimage: 0x2252,
- approximatelyequal: 0x2245,
- araeaekorean: 0x318E,
- araeakorean: 0x318D,
- arc: 0x2312,
- arighthalfring: 0x1E9A,
- aring: 0x00E5,
- aringacute: 0x01FB,
- aringbelow: 0x1E01,
- arrowboth: 0x2194,
- arrowdashdown: 0x21E3,
- arrowdashleft: 0x21E0,
- arrowdashright: 0x21E2,
- arrowdashup: 0x21E1,
- arrowdblboth: 0x21D4,
- arrowdbldown: 0x21D3,
- arrowdblleft: 0x21D0,
- arrowdblright: 0x21D2,
- arrowdblup: 0x21D1,
- arrowdown: 0x2193,
- arrowdownleft: 0x2199,
- arrowdownright: 0x2198,
- arrowdownwhite: 0x21E9,
- arrowheaddownmod: 0x02C5,
- arrowheadleftmod: 0x02C2,
- arrowheadrightmod: 0x02C3,
- arrowheadupmod: 0x02C4,
- arrowhorizex: 0xF8E7,
- arrowleft: 0x2190,
- arrowleftdbl: 0x21D0,
- arrowleftdblstroke: 0x21CD,
- arrowleftoverright: 0x21C6,
- arrowleftwhite: 0x21E6,
- arrowright: 0x2192,
- arrowrightdblstroke: 0x21CF,
- arrowrightheavy: 0x279E,
- arrowrightoverleft: 0x21C4,
- arrowrightwhite: 0x21E8,
- arrowtableft: 0x21E4,
- arrowtabright: 0x21E5,
- arrowup: 0x2191,
- arrowupdn: 0x2195,
- arrowupdnbse: 0x21A8,
- arrowupdownbase: 0x21A8,
- arrowupleft: 0x2196,
- arrowupleftofdown: 0x21C5,
- arrowupright: 0x2197,
- arrowupwhite: 0x21E7,
- arrowvertex: 0xF8E6,
- asciicircum: 0x005E,
- asciicircummonospace: 0xFF3E,
- asciitilde: 0x007E,
- asciitildemonospace: 0xFF5E,
- ascript: 0x0251,
- ascriptturned: 0x0252,
- asmallhiragana: 0x3041,
- asmallkatakana: 0x30A1,
- asmallkatakanahalfwidth: 0xFF67,
- asterisk: 0x002A,
- asteriskaltonearabic: 0x066D,
- asteriskarabic: 0x066D,
- asteriskmath: 0x2217,
- asteriskmonospace: 0xFF0A,
- asterisksmall: 0xFE61,
- asterism: 0x2042,
- asuperior: 0xF6E9,
- asymptoticallyequal: 0x2243,
- at: 0x0040,
- atilde: 0x00E3,
- atmonospace: 0xFF20,
- atsmall: 0xFE6B,
- aturned: 0x0250,
- aubengali: 0x0994,
- aubopomofo: 0x3120,
- audeva: 0x0914,
- augujarati: 0x0A94,
- augurmukhi: 0x0A14,
- aulengthmarkbengali: 0x09D7,
- aumatragurmukhi: 0x0A4C,
- auvowelsignbengali: 0x09CC,
- auvowelsigndeva: 0x094C,
- auvowelsigngujarati: 0x0ACC,
- avagrahadeva: 0x093D,
- aybarmenian: 0x0561,
- ayin: 0x05E2,
- ayinaltonehebrew: 0xFB20,
- ayinhebrew: 0x05E2,
- b: 0x0062,
- babengali: 0x09AC,
- backslash: 0x005C,
- backslashmonospace: 0xFF3C,
- badeva: 0x092C,
- bagujarati: 0x0AAC,
- bagurmukhi: 0x0A2C,
- bahiragana: 0x3070,
- bahtthai: 0x0E3F,
- bakatakana: 0x30D0,
- bar: 0x007C,
- barmonospace: 0xFF5C,
- bbopomofo: 0x3105,
- bcircle: 0x24D1,
- bdotaccent: 0x1E03,
- bdotbelow: 0x1E05,
- beamedsixteenthnotes: 0x266C,
- because: 0x2235,
- becyrillic: 0x0431,
- beharabic: 0x0628,
- behfinalarabic: 0xFE90,
- behinitialarabic: 0xFE91,
- behiragana: 0x3079,
- behmedialarabic: 0xFE92,
- behmeeminitialarabic: 0xFC9F,
- behmeemisolatedarabic: 0xFC08,
- behnoonfinalarabic: 0xFC6D,
- bekatakana: 0x30D9,
- benarmenian: 0x0562,
- bet: 0x05D1,
- beta: 0x03B2,
- betasymbolgreek: 0x03D0,
- betdagesh: 0xFB31,
- betdageshhebrew: 0xFB31,
- bethebrew: 0x05D1,
- betrafehebrew: 0xFB4C,
- bhabengali: 0x09AD,
- bhadeva: 0x092D,
- bhagujarati: 0x0AAD,
- bhagurmukhi: 0x0A2D,
- bhook: 0x0253,
- bihiragana: 0x3073,
- bikatakana: 0x30D3,
- bilabialclick: 0x0298,
- bindigurmukhi: 0x0A02,
- birusquare: 0x3331,
- blackcircle: 0x25CF,
- blackdiamond: 0x25C6,
- blackdownpointingtriangle: 0x25BC,
- blackleftpointingpointer: 0x25C4,
- blackleftpointingtriangle: 0x25C0,
- blacklenticularbracketleft: 0x3010,
- blacklenticularbracketleftvertical: 0xFE3B,
- blacklenticularbracketright: 0x3011,
- blacklenticularbracketrightvertical: 0xFE3C,
- blacklowerlefttriangle: 0x25E3,
- blacklowerrighttriangle: 0x25E2,
- blackrectangle: 0x25AC,
- blackrightpointingpointer: 0x25BA,
- blackrightpointingtriangle: 0x25B6,
- blacksmallsquare: 0x25AA,
- blacksmilingface: 0x263B,
- blacksquare: 0x25A0,
- blackstar: 0x2605,
- blackupperlefttriangle: 0x25E4,
- blackupperrighttriangle: 0x25E5,
- blackuppointingsmalltriangle: 0x25B4,
- blackuppointingtriangle: 0x25B2,
- blank: 0x2423,
- blinebelow: 0x1E07,
- block: 0x2588,
- bmonospace: 0xFF42,
- bobaimaithai: 0x0E1A,
- bohiragana: 0x307C,
- bokatakana: 0x30DC,
- bparen: 0x249D,
- bqsquare: 0x33C3,
- braceex: 0xF8F4,
- braceleft: 0x007B,
- braceleftbt: 0xF8F3,
- braceleftmid: 0xF8F2,
- braceleftmonospace: 0xFF5B,
- braceleftsmall: 0xFE5B,
- bracelefttp: 0xF8F1,
- braceleftvertical: 0xFE37,
- braceright: 0x007D,
- bracerightbt: 0xF8FE,
- bracerightmid: 0xF8FD,
- bracerightmonospace: 0xFF5D,
- bracerightsmall: 0xFE5C,
- bracerighttp: 0xF8FC,
- bracerightvertical: 0xFE38,
- bracketleft: 0x005B,
- bracketleftbt: 0xF8F0,
- bracketleftex: 0xF8EF,
- bracketleftmonospace: 0xFF3B,
- bracketlefttp: 0xF8EE,
- bracketright: 0x005D,
- bracketrightbt: 0xF8FB,
- bracketrightex: 0xF8FA,
- bracketrightmonospace: 0xFF3D,
- bracketrighttp: 0xF8F9,
- breve: 0x02D8,
- brevebelowcmb: 0x032E,
- brevecmb: 0x0306,
- breveinvertedbelowcmb: 0x032F,
- breveinvertedcmb: 0x0311,
- breveinverteddoublecmb: 0x0361,
- bridgebelowcmb: 0x032A,
- bridgeinvertedbelowcmb: 0x033A,
- brokenbar: 0x00A6,
- bstroke: 0x0180,
- bsuperior: 0xF6EA,
- btopbar: 0x0183,
- buhiragana: 0x3076,
- bukatakana: 0x30D6,
- bullet: 0x2022,
- bulletinverse: 0x25D8,
- bulletoperator: 0x2219,
- bullseye: 0x25CE,
- c: 0x0063,
- caarmenian: 0x056E,
- cabengali: 0x099A,
- cacute: 0x0107,
- cadeva: 0x091A,
- cagujarati: 0x0A9A,
- cagurmukhi: 0x0A1A,
- calsquare: 0x3388,
- candrabindubengali: 0x0981,
- candrabinducmb: 0x0310,
- candrabindudeva: 0x0901,
- candrabindugujarati: 0x0A81,
- capslock: 0x21EA,
- careof: 0x2105,
- caron: 0x02C7,
- caronbelowcmb: 0x032C,
- caroncmb: 0x030C,
- carriagereturn: 0x21B5,
- cbopomofo: 0x3118,
- ccaron: 0x010D,
- ccedilla: 0x00E7,
- ccedillaacute: 0x1E09,
- ccircle: 0x24D2,
- ccircumflex: 0x0109,
- ccurl: 0x0255,
- cdot: 0x010B,
- cdotaccent: 0x010B,
- cdsquare: 0x33C5,
- cedilla: 0x00B8,
- cedillacmb: 0x0327,
- cent: 0x00A2,
- centigrade: 0x2103,
- centinferior: 0xF6DF,
- centmonospace: 0xFFE0,
- centoldstyle: 0xF7A2,
- centsuperior: 0xF6E0,
- chaarmenian: 0x0579,
- chabengali: 0x099B,
- chadeva: 0x091B,
- chagujarati: 0x0A9B,
- chagurmukhi: 0x0A1B,
- chbopomofo: 0x3114,
- cheabkhasiancyrillic: 0x04BD,
- checkmark: 0x2713,
- checyrillic: 0x0447,
- chedescenderabkhasiancyrillic: 0x04BF,
- chedescendercyrillic: 0x04B7,
- chedieresiscyrillic: 0x04F5,
- cheharmenian: 0x0573,
- chekhakassiancyrillic: 0x04CC,
- cheverticalstrokecyrillic: 0x04B9,
- chi: 0x03C7,
- chieuchacirclekorean: 0x3277,
- chieuchaparenkorean: 0x3217,
- chieuchcirclekorean: 0x3269,
- chieuchkorean: 0x314A,
- chieuchparenkorean: 0x3209,
- chochangthai: 0x0E0A,
- chochanthai: 0x0E08,
- chochingthai: 0x0E09,
- chochoethai: 0x0E0C,
- chook: 0x0188,
- cieucacirclekorean: 0x3276,
- cieucaparenkorean: 0x3216,
- cieuccirclekorean: 0x3268,
- cieuckorean: 0x3148,
- cieucparenkorean: 0x3208,
- cieucuparenkorean: 0x321C,
- circle: 0x25CB,
- circlecopyrt: 0x00A9, // This glyph is missing from Adobe's original list.
- circlemultiply: 0x2297,
- circleot: 0x2299,
- circleplus: 0x2295,
- circlepostalmark: 0x3036,
- circlewithlefthalfblack: 0x25D0,
- circlewithrighthalfblack: 0x25D1,
- circumflex: 0x02C6,
- circumflexbelowcmb: 0x032D,
- circumflexcmb: 0x0302,
- clear: 0x2327,
- clickalveolar: 0x01C2,
- clickdental: 0x01C0,
- clicklateral: 0x01C1,
- clickretroflex: 0x01C3,
- club: 0x2663,
- clubsuitblack: 0x2663,
- clubsuitwhite: 0x2667,
- cmcubedsquare: 0x33A4,
- cmonospace: 0xFF43,
- cmsquaredsquare: 0x33A0,
- coarmenian: 0x0581,
- colon: 0x003A,
- colonmonetary: 0x20A1,
- colonmonospace: 0xFF1A,
- colonsign: 0x20A1,
- colonsmall: 0xFE55,
- colontriangularhalfmod: 0x02D1,
- colontriangularmod: 0x02D0,
- comma: 0x002C,
- commaabovecmb: 0x0313,
- commaaboverightcmb: 0x0315,
- commaaccent: 0xF6C3,
- commaarabic: 0x060C,
- commaarmenian: 0x055D,
- commainferior: 0xF6E1,
- commamonospace: 0xFF0C,
- commareversedabovecmb: 0x0314,
- commareversedmod: 0x02BD,
- commasmall: 0xFE50,
- commasuperior: 0xF6E2,
- commaturnedabovecmb: 0x0312,
- commaturnedmod: 0x02BB,
- compass: 0x263C,
- congruent: 0x2245,
- contourintegral: 0x222E,
- control: 0x2303,
- controlACK: 0x0006,
- controlBEL: 0x0007,
- controlBS: 0x0008,
- controlCAN: 0x0018,
- controlCR: 0x000D,
- controlDC1: 0x0011,
- controlDC2: 0x0012,
- controlDC3: 0x0013,
- controlDC4: 0x0014,
- controlDEL: 0x007F,
- controlDLE: 0x0010,
- controlEM: 0x0019,
- controlENQ: 0x0005,
- controlEOT: 0x0004,
- controlESC: 0x001B,
- controlETB: 0x0017,
- controlETX: 0x0003,
- controlFF: 0x000C,
- controlFS: 0x001C,
- controlGS: 0x001D,
- controlHT: 0x0009,
- controlLF: 0x000A,
- controlNAK: 0x0015,
- controlRS: 0x001E,
- controlSI: 0x000F,
- controlSO: 0x000E,
- controlSOT: 0x0002,
- controlSTX: 0x0001,
- controlSUB: 0x001A,
- controlSYN: 0x0016,
- controlUS: 0x001F,
- controlVT: 0x000B,
- copyright: 0x00A9,
- copyrightsans: 0xF8E9,
- copyrightserif: 0xF6D9,
- cornerbracketleft: 0x300C,
- cornerbracketlefthalfwidth: 0xFF62,
- cornerbracketleftvertical: 0xFE41,
- cornerbracketright: 0x300D,
- cornerbracketrighthalfwidth: 0xFF63,
- cornerbracketrightvertical: 0xFE42,
- corporationsquare: 0x337F,
- cosquare: 0x33C7,
- coverkgsquare: 0x33C6,
- cparen: 0x249E,
- cruzeiro: 0x20A2,
- cstretched: 0x0297,
- curlyand: 0x22CF,
- curlyor: 0x22CE,
- currency: 0x00A4,
- cyrBreve: 0xF6D1,
- cyrFlex: 0xF6D2,
- cyrbreve: 0xF6D4,
- cyrflex: 0xF6D5,
- d: 0x0064,
- daarmenian: 0x0564,
- dabengali: 0x09A6,
- dadarabic: 0x0636,
- dadeva: 0x0926,
- dadfinalarabic: 0xFEBE,
- dadinitialarabic: 0xFEBF,
- dadmedialarabic: 0xFEC0,
- dagesh: 0x05BC,
- dageshhebrew: 0x05BC,
- dagger: 0x2020,
- daggerdbl: 0x2021,
- dagujarati: 0x0AA6,
- dagurmukhi: 0x0A26,
- dahiragana: 0x3060,
- dakatakana: 0x30C0,
- dalarabic: 0x062F,
- dalet: 0x05D3,
- daletdagesh: 0xFB33,
- daletdageshhebrew: 0xFB33,
- dalethebrew: 0x05D3,
- dalfinalarabic: 0xFEAA,
- dammaarabic: 0x064F,
- dammalowarabic: 0x064F,
- dammatanaltonearabic: 0x064C,
- dammatanarabic: 0x064C,
- danda: 0x0964,
- dargahebrew: 0x05A7,
- dargalefthebrew: 0x05A7,
- dasiapneumatacyrilliccmb: 0x0485,
- dblGrave: 0xF6D3,
- dblanglebracketleft: 0x300A,
- dblanglebracketleftvertical: 0xFE3D,
- dblanglebracketright: 0x300B,
- dblanglebracketrightvertical: 0xFE3E,
- dblarchinvertedbelowcmb: 0x032B,
- dblarrowleft: 0x21D4,
- dblarrowright: 0x21D2,
- dbldanda: 0x0965,
- dblgrave: 0xF6D6,
- dblgravecmb: 0x030F,
- dblintegral: 0x222C,
- dbllowline: 0x2017,
- dbllowlinecmb: 0x0333,
- dbloverlinecmb: 0x033F,
- dblprimemod: 0x02BA,
- dblverticalbar: 0x2016,
- dblverticallineabovecmb: 0x030E,
- dbopomofo: 0x3109,
- dbsquare: 0x33C8,
- dcaron: 0x010F,
- dcedilla: 0x1E11,
- dcircle: 0x24D3,
- dcircumflexbelow: 0x1E13,
- dcroat: 0x0111,
- ddabengali: 0x09A1,
- ddadeva: 0x0921,
- ddagujarati: 0x0AA1,
- ddagurmukhi: 0x0A21,
- ddalarabic: 0x0688,
- ddalfinalarabic: 0xFB89,
- dddhadeva: 0x095C,
- ddhabengali: 0x09A2,
- ddhadeva: 0x0922,
- ddhagujarati: 0x0AA2,
- ddhagurmukhi: 0x0A22,
- ddotaccent: 0x1E0B,
- ddotbelow: 0x1E0D,
- decimalseparatorarabic: 0x066B,
- decimalseparatorpersian: 0x066B,
- decyrillic: 0x0434,
- degree: 0x00B0,
- dehihebrew: 0x05AD,
- dehiragana: 0x3067,
- deicoptic: 0x03EF,
- dekatakana: 0x30C7,
- deleteleft: 0x232B,
- deleteright: 0x2326,
- delta: 0x03B4,
- deltaturned: 0x018D,
- denominatorminusonenumeratorbengali: 0x09F8,
- dezh: 0x02A4,
- dhabengali: 0x09A7,
- dhadeva: 0x0927,
- dhagujarati: 0x0AA7,
- dhagurmukhi: 0x0A27,
- dhook: 0x0257,
- dialytikatonos: 0x0385,
- dialytikatonoscmb: 0x0344,
- diamond: 0x2666,
- diamondsuitwhite: 0x2662,
- dieresis: 0x00A8,
- dieresisacute: 0xF6D7,
- dieresisbelowcmb: 0x0324,
- dieresiscmb: 0x0308,
- dieresisgrave: 0xF6D8,
- dieresistonos: 0x0385,
- dihiragana: 0x3062,
- dikatakana: 0x30C2,
- dittomark: 0x3003,
- divide: 0x00F7,
- divides: 0x2223,
- divisionslash: 0x2215,
- djecyrillic: 0x0452,
- dkshade: 0x2593,
- dlinebelow: 0x1E0F,
- dlsquare: 0x3397,
- dmacron: 0x0111,
- dmonospace: 0xFF44,
- dnblock: 0x2584,
- dochadathai: 0x0E0E,
- dodekthai: 0x0E14,
- dohiragana: 0x3069,
- dokatakana: 0x30C9,
- dollar: 0x0024,
- dollarinferior: 0xF6E3,
- dollarmonospace: 0xFF04,
- dollaroldstyle: 0xF724,
- dollarsmall: 0xFE69,
- dollarsuperior: 0xF6E4,
- dong: 0x20AB,
- dorusquare: 0x3326,
- dotaccent: 0x02D9,
- dotaccentcmb: 0x0307,
- dotbelowcmb: 0x0323,
- dotbelowcomb: 0x0323,
- dotkatakana: 0x30FB,
- dotlessi: 0x0131,
- dotlessj: 0xF6BE,
- dotlessjstrokehook: 0x0284,
- dotmath: 0x22C5,
- dottedcircle: 0x25CC,
- doubleyodpatah: 0xFB1F,
- doubleyodpatahhebrew: 0xFB1F,
- downtackbelowcmb: 0x031E,
- downtackmod: 0x02D5,
- dparen: 0x249F,
- dsuperior: 0xF6EB,
- dtail: 0x0256,
- dtopbar: 0x018C,
- duhiragana: 0x3065,
- dukatakana: 0x30C5,
- dz: 0x01F3,
- dzaltone: 0x02A3,
- dzcaron: 0x01C6,
- dzcurl: 0x02A5,
- dzeabkhasiancyrillic: 0x04E1,
- dzecyrillic: 0x0455,
- dzhecyrillic: 0x045F,
- e: 0x0065,
- eacute: 0x00E9,
- earth: 0x2641,
- ebengali: 0x098F,
- ebopomofo: 0x311C,
- ebreve: 0x0115,
- ecandradeva: 0x090D,
- ecandragujarati: 0x0A8D,
- ecandravowelsigndeva: 0x0945,
- ecandravowelsigngujarati: 0x0AC5,
- ecaron: 0x011B,
- ecedillabreve: 0x1E1D,
- echarmenian: 0x0565,
- echyiwnarmenian: 0x0587,
- ecircle: 0x24D4,
- ecircumflex: 0x00EA,
- ecircumflexacute: 0x1EBF,
- ecircumflexbelow: 0x1E19,
- ecircumflexdotbelow: 0x1EC7,
- ecircumflexgrave: 0x1EC1,
- ecircumflexhookabove: 0x1EC3,
- ecircumflextilde: 0x1EC5,
- ecyrillic: 0x0454,
- edblgrave: 0x0205,
- edeva: 0x090F,
- edieresis: 0x00EB,
- edot: 0x0117,
- edotaccent: 0x0117,
- edotbelow: 0x1EB9,
- eegurmukhi: 0x0A0F,
- eematragurmukhi: 0x0A47,
- efcyrillic: 0x0444,
- egrave: 0x00E8,
- egujarati: 0x0A8F,
- eharmenian: 0x0567,
- ehbopomofo: 0x311D,
- ehiragana: 0x3048,
- ehookabove: 0x1EBB,
- eibopomofo: 0x311F,
- eight: 0x0038,
- eightarabic: 0x0668,
- eightbengali: 0x09EE,
- eightcircle: 0x2467,
- eightcircleinversesansserif: 0x2791,
- eightdeva: 0x096E,
- eighteencircle: 0x2471,
- eighteenparen: 0x2485,
- eighteenperiod: 0x2499,
- eightgujarati: 0x0AEE,
- eightgurmukhi: 0x0A6E,
- eighthackarabic: 0x0668,
- eighthangzhou: 0x3028,
- eighthnotebeamed: 0x266B,
- eightideographicparen: 0x3227,
- eightinferior: 0x2088,
- eightmonospace: 0xFF18,
- eightoldstyle: 0xF738,
- eightparen: 0x247B,
- eightperiod: 0x248F,
- eightpersian: 0x06F8,
- eightroman: 0x2177,
- eightsuperior: 0x2078,
- eightthai: 0x0E58,
- einvertedbreve: 0x0207,
- eiotifiedcyrillic: 0x0465,
- ekatakana: 0x30A8,
- ekatakanahalfwidth: 0xFF74,
- ekonkargurmukhi: 0x0A74,
- ekorean: 0x3154,
- elcyrillic: 0x043B,
- element: 0x2208,
- elevencircle: 0x246A,
- elevenparen: 0x247E,
- elevenperiod: 0x2492,
- elevenroman: 0x217A,
- ellipsis: 0x2026,
- ellipsisvertical: 0x22EE,
- emacron: 0x0113,
- emacronacute: 0x1E17,
- emacrongrave: 0x1E15,
- emcyrillic: 0x043C,
- emdash: 0x2014,
- emdashvertical: 0xFE31,
- emonospace: 0xFF45,
- emphasismarkarmenian: 0x055B,
- emptyset: 0x2205,
- enbopomofo: 0x3123,
- encyrillic: 0x043D,
- endash: 0x2013,
- endashvertical: 0xFE32,
- endescendercyrillic: 0x04A3,
- eng: 0x014B,
- engbopomofo: 0x3125,
- enghecyrillic: 0x04A5,
- enhookcyrillic: 0x04C8,
- enspace: 0x2002,
- eogonek: 0x0119,
- eokorean: 0x3153,
- eopen: 0x025B,
- eopenclosed: 0x029A,
- eopenreversed: 0x025C,
- eopenreversedclosed: 0x025E,
- eopenreversedhook: 0x025D,
- eparen: 0x24A0,
- epsilon: 0x03B5,
- epsilontonos: 0x03AD,
- equal: 0x003D,
- equalmonospace: 0xFF1D,
- equalsmall: 0xFE66,
- equalsuperior: 0x207C,
- equivalence: 0x2261,
- erbopomofo: 0x3126,
- ercyrillic: 0x0440,
- ereversed: 0x0258,
- ereversedcyrillic: 0x044D,
- escyrillic: 0x0441,
- esdescendercyrillic: 0x04AB,
- esh: 0x0283,
- eshcurl: 0x0286,
- eshortdeva: 0x090E,
- eshortvowelsigndeva: 0x0946,
- eshreversedloop: 0x01AA,
- eshsquatreversed: 0x0285,
- esmallhiragana: 0x3047,
- esmallkatakana: 0x30A7,
- esmallkatakanahalfwidth: 0xFF6A,
- estimated: 0x212E,
- esuperior: 0xF6EC,
- eta: 0x03B7,
- etarmenian: 0x0568,
- etatonos: 0x03AE,
- eth: 0x00F0,
- etilde: 0x1EBD,
- etildebelow: 0x1E1B,
- etnahtafoukhhebrew: 0x0591,
- etnahtafoukhlefthebrew: 0x0591,
- etnahtahebrew: 0x0591,
- etnahtalefthebrew: 0x0591,
- eturned: 0x01DD,
- eukorean: 0x3161,
- euro: 0x20AC,
- evowelsignbengali: 0x09C7,
- evowelsigndeva: 0x0947,
- evowelsigngujarati: 0x0AC7,
- exclam: 0x0021,
- exclamarmenian: 0x055C,
- exclamdbl: 0x203C,
- exclamdown: 0x00A1,
- exclamdownsmall: 0xF7A1,
- exclammonospace: 0xFF01,
- exclamsmall: 0xF721,
- existential: 0x2203,
- ezh: 0x0292,
- ezhcaron: 0x01EF,
- ezhcurl: 0x0293,
- ezhreversed: 0x01B9,
- ezhtail: 0x01BA,
- f: 0x0066,
- fadeva: 0x095E,
- fagurmukhi: 0x0A5E,
- fahrenheit: 0x2109,
- fathaarabic: 0x064E,
- fathalowarabic: 0x064E,
- fathatanarabic: 0x064B,
- fbopomofo: 0x3108,
- fcircle: 0x24D5,
- fdotaccent: 0x1E1F,
- feharabic: 0x0641,
- feharmenian: 0x0586,
- fehfinalarabic: 0xFED2,
- fehinitialarabic: 0xFED3,
- fehmedialarabic: 0xFED4,
- feicoptic: 0x03E5,
- female: 0x2640,
- ff: 0xFB00,
- ffi: 0xFB03,
- ffl: 0xFB04,
- fi: 0xFB01,
- fifteencircle: 0x246E,
- fifteenparen: 0x2482,
- fifteenperiod: 0x2496,
- figuredash: 0x2012,
- filledbox: 0x25A0,
- filledrect: 0x25AC,
- finalkaf: 0x05DA,
- finalkafdagesh: 0xFB3A,
- finalkafdageshhebrew: 0xFB3A,
- finalkafhebrew: 0x05DA,
- finalmem: 0x05DD,
- finalmemhebrew: 0x05DD,
- finalnun: 0x05DF,
- finalnunhebrew: 0x05DF,
- finalpe: 0x05E3,
- finalpehebrew: 0x05E3,
- finaltsadi: 0x05E5,
- finaltsadihebrew: 0x05E5,
- firsttonechinese: 0x02C9,
- fisheye: 0x25C9,
- fitacyrillic: 0x0473,
- five: 0x0035,
- fivearabic: 0x0665,
- fivebengali: 0x09EB,
- fivecircle: 0x2464,
- fivecircleinversesansserif: 0x278E,
- fivedeva: 0x096B,
- fiveeighths: 0x215D,
- fivegujarati: 0x0AEB,
- fivegurmukhi: 0x0A6B,
- fivehackarabic: 0x0665,
- fivehangzhou: 0x3025,
- fiveideographicparen: 0x3224,
- fiveinferior: 0x2085,
- fivemonospace: 0xFF15,
- fiveoldstyle: 0xF735,
- fiveparen: 0x2478,
- fiveperiod: 0x248C,
- fivepersian: 0x06F5,
- fiveroman: 0x2174,
- fivesuperior: 0x2075,
- fivethai: 0x0E55,
- fl: 0xFB02,
- florin: 0x0192,
- fmonospace: 0xFF46,
- fmsquare: 0x3399,
- fofanthai: 0x0E1F,
- fofathai: 0x0E1D,
- fongmanthai: 0x0E4F,
- forall: 0x2200,
- four: 0x0034,
- fourarabic: 0x0664,
- fourbengali: 0x09EA,
- fourcircle: 0x2463,
- fourcircleinversesansserif: 0x278D,
- fourdeva: 0x096A,
- fourgujarati: 0x0AEA,
- fourgurmukhi: 0x0A6A,
- fourhackarabic: 0x0664,
- fourhangzhou: 0x3024,
- fourideographicparen: 0x3223,
- fourinferior: 0x2084,
- fourmonospace: 0xFF14,
- fournumeratorbengali: 0x09F7,
- fouroldstyle: 0xF734,
- fourparen: 0x2477,
- fourperiod: 0x248B,
- fourpersian: 0x06F4,
- fourroman: 0x2173,
- foursuperior: 0x2074,
- fourteencircle: 0x246D,
- fourteenparen: 0x2481,
- fourteenperiod: 0x2495,
- fourthai: 0x0E54,
- fourthtonechinese: 0x02CB,
- fparen: 0x24A1,
- fraction: 0x2044,
- franc: 0x20A3,
- g: 0x0067,
- gabengali: 0x0997,
- gacute: 0x01F5,
- gadeva: 0x0917,
- gafarabic: 0x06AF,
- gaffinalarabic: 0xFB93,
- gafinitialarabic: 0xFB94,
- gafmedialarabic: 0xFB95,
- gagujarati: 0x0A97,
- gagurmukhi: 0x0A17,
- gahiragana: 0x304C,
- gakatakana: 0x30AC,
- gamma: 0x03B3,
- gammalatinsmall: 0x0263,
- gammasuperior: 0x02E0,
- gangiacoptic: 0x03EB,
- gbopomofo: 0x310D,
- gbreve: 0x011F,
- gcaron: 0x01E7,
- gcedilla: 0x0123,
- gcircle: 0x24D6,
- gcircumflex: 0x011D,
- gcommaaccent: 0x0123,
- gdot: 0x0121,
- gdotaccent: 0x0121,
- gecyrillic: 0x0433,
- gehiragana: 0x3052,
- gekatakana: 0x30B2,
- geometricallyequal: 0x2251,
- gereshaccenthebrew: 0x059C,
- gereshhebrew: 0x05F3,
- gereshmuqdamhebrew: 0x059D,
- germandbls: 0x00DF,
- gershayimaccenthebrew: 0x059E,
- gershayimhebrew: 0x05F4,
- getamark: 0x3013,
- ghabengali: 0x0998,
- ghadarmenian: 0x0572,
- ghadeva: 0x0918,
- ghagujarati: 0x0A98,
- ghagurmukhi: 0x0A18,
- ghainarabic: 0x063A,
- ghainfinalarabic: 0xFECE,
- ghaininitialarabic: 0xFECF,
- ghainmedialarabic: 0xFED0,
- ghemiddlehookcyrillic: 0x0495,
- ghestrokecyrillic: 0x0493,
- gheupturncyrillic: 0x0491,
- ghhadeva: 0x095A,
- ghhagurmukhi: 0x0A5A,
- ghook: 0x0260,
- ghzsquare: 0x3393,
- gihiragana: 0x304E,
- gikatakana: 0x30AE,
- gimarmenian: 0x0563,
- gimel: 0x05D2,
- gimeldagesh: 0xFB32,
- gimeldageshhebrew: 0xFB32,
- gimelhebrew: 0x05D2,
- gjecyrillic: 0x0453,
- glottalinvertedstroke: 0x01BE,
- glottalstop: 0x0294,
- glottalstopinverted: 0x0296,
- glottalstopmod: 0x02C0,
- glottalstopreversed: 0x0295,
- glottalstopreversedmod: 0x02C1,
- glottalstopreversedsuperior: 0x02E4,
- glottalstopstroke: 0x02A1,
- glottalstopstrokereversed: 0x02A2,
- gmacron: 0x1E21,
- gmonospace: 0xFF47,
- gohiragana: 0x3054,
- gokatakana: 0x30B4,
- gparen: 0x24A2,
- gpasquare: 0x33AC,
- gradient: 0x2207,
- grave: 0x0060,
- gravebelowcmb: 0x0316,
- gravecmb: 0x0300,
- gravecomb: 0x0300,
- gravedeva: 0x0953,
- gravelowmod: 0x02CE,
- gravemonospace: 0xFF40,
- gravetonecmb: 0x0340,
- greater: 0x003E,
- greaterequal: 0x2265,
- greaterequalorless: 0x22DB,
- greatermonospace: 0xFF1E,
- greaterorequivalent: 0x2273,
- greaterorless: 0x2277,
- greateroverequal: 0x2267,
- greatersmall: 0xFE65,
- gscript: 0x0261,
- gstroke: 0x01E5,
- guhiragana: 0x3050,
- guillemotleft: 0x00AB,
- guillemotright: 0x00BB,
- guilsinglleft: 0x2039,
- guilsinglright: 0x203A,
- gukatakana: 0x30B0,
- guramusquare: 0x3318,
- gysquare: 0x33C9,
- h: 0x0068,
- haabkhasiancyrillic: 0x04A9,
- haaltonearabic: 0x06C1,
- habengali: 0x09B9,
- hadescendercyrillic: 0x04B3,
- hadeva: 0x0939,
- hagujarati: 0x0AB9,
- hagurmukhi: 0x0A39,
- haharabic: 0x062D,
- hahfinalarabic: 0xFEA2,
- hahinitialarabic: 0xFEA3,
- hahiragana: 0x306F,
- hahmedialarabic: 0xFEA4,
- haitusquare: 0x332A,
- hakatakana: 0x30CF,
- hakatakanahalfwidth: 0xFF8A,
- halantgurmukhi: 0x0A4D,
- hamzaarabic: 0x0621,
- hamzalowarabic: 0x0621,
- hangulfiller: 0x3164,
- hardsigncyrillic: 0x044A,
- harpoonleftbarbup: 0x21BC,
- harpoonrightbarbup: 0x21C0,
- hasquare: 0x33CA,
- hatafpatah: 0x05B2,
- hatafpatah16: 0x05B2,
- hatafpatah23: 0x05B2,
- hatafpatah2f: 0x05B2,
- hatafpatahhebrew: 0x05B2,
- hatafpatahnarrowhebrew: 0x05B2,
- hatafpatahquarterhebrew: 0x05B2,
- hatafpatahwidehebrew: 0x05B2,
- hatafqamats: 0x05B3,
- hatafqamats1b: 0x05B3,
- hatafqamats28: 0x05B3,
- hatafqamats34: 0x05B3,
- hatafqamatshebrew: 0x05B3,
- hatafqamatsnarrowhebrew: 0x05B3,
- hatafqamatsquarterhebrew: 0x05B3,
- hatafqamatswidehebrew: 0x05B3,
- hatafsegol: 0x05B1,
- hatafsegol17: 0x05B1,
- hatafsegol24: 0x05B1,
- hatafsegol30: 0x05B1,
- hatafsegolhebrew: 0x05B1,
- hatafsegolnarrowhebrew: 0x05B1,
- hatafsegolquarterhebrew: 0x05B1,
- hatafsegolwidehebrew: 0x05B1,
- hbar: 0x0127,
- hbopomofo: 0x310F,
- hbrevebelow: 0x1E2B,
- hcedilla: 0x1E29,
- hcircle: 0x24D7,
- hcircumflex: 0x0125,
- hdieresis: 0x1E27,
- hdotaccent: 0x1E23,
- hdotbelow: 0x1E25,
- he: 0x05D4,
- heart: 0x2665,
- heartsuitblack: 0x2665,
- heartsuitwhite: 0x2661,
- hedagesh: 0xFB34,
- hedageshhebrew: 0xFB34,
- hehaltonearabic: 0x06C1,
- heharabic: 0x0647,
- hehebrew: 0x05D4,
- hehfinalaltonearabic: 0xFBA7,
- hehfinalalttwoarabic: 0xFEEA,
- hehfinalarabic: 0xFEEA,
- hehhamzaabovefinalarabic: 0xFBA5,
- hehhamzaaboveisolatedarabic: 0xFBA4,
- hehinitialaltonearabic: 0xFBA8,
- hehinitialarabic: 0xFEEB,
- hehiragana: 0x3078,
- hehmedialaltonearabic: 0xFBA9,
- hehmedialarabic: 0xFEEC,
- heiseierasquare: 0x337B,
- hekatakana: 0x30D8,
- hekatakanahalfwidth: 0xFF8D,
- hekutaarusquare: 0x3336,
- henghook: 0x0267,
- herutusquare: 0x3339,
- het: 0x05D7,
- hethebrew: 0x05D7,
- hhook: 0x0266,
- hhooksuperior: 0x02B1,
- hieuhacirclekorean: 0x327B,
- hieuhaparenkorean: 0x321B,
- hieuhcirclekorean: 0x326D,
- hieuhkorean: 0x314E,
- hieuhparenkorean: 0x320D,
- hihiragana: 0x3072,
- hikatakana: 0x30D2,
- hikatakanahalfwidth: 0xFF8B,
- hiriq: 0x05B4,
- hiriq14: 0x05B4,
- hiriq21: 0x05B4,
- hiriq2d: 0x05B4,
- hiriqhebrew: 0x05B4,
- hiriqnarrowhebrew: 0x05B4,
- hiriqquarterhebrew: 0x05B4,
- hiriqwidehebrew: 0x05B4,
- hlinebelow: 0x1E96,
- hmonospace: 0xFF48,
- hoarmenian: 0x0570,
- hohipthai: 0x0E2B,
- hohiragana: 0x307B,
- hokatakana: 0x30DB,
- hokatakanahalfwidth: 0xFF8E,
- holam: 0x05B9,
- holam19: 0x05B9,
- holam26: 0x05B9,
- holam32: 0x05B9,
- holamhebrew: 0x05B9,
- holamnarrowhebrew: 0x05B9,
- holamquarterhebrew: 0x05B9,
- holamwidehebrew: 0x05B9,
- honokhukthai: 0x0E2E,
- hookabovecomb: 0x0309,
- hookcmb: 0x0309,
- hookpalatalizedbelowcmb: 0x0321,
- hookretroflexbelowcmb: 0x0322,
- hoonsquare: 0x3342,
- horicoptic: 0x03E9,
- horizontalbar: 0x2015,
- horncmb: 0x031B,
- hotsprings: 0x2668,
- house: 0x2302,
- hparen: 0x24A3,
- hsuperior: 0x02B0,
- hturned: 0x0265,
- huhiragana: 0x3075,
- huiitosquare: 0x3333,
- hukatakana: 0x30D5,
- hukatakanahalfwidth: 0xFF8C,
- hungarumlaut: 0x02DD,
- hungarumlautcmb: 0x030B,
- hv: 0x0195,
- hyphen: 0x002D,
- hypheninferior: 0xF6E5,
- hyphenmonospace: 0xFF0D,
- hyphensmall: 0xFE63,
- hyphensuperior: 0xF6E6,
- hyphentwo: 0x2010,
- i: 0x0069,
- iacute: 0x00ED,
- iacyrillic: 0x044F,
- ibengali: 0x0987,
- ibopomofo: 0x3127,
- ibreve: 0x012D,
- icaron: 0x01D0,
- icircle: 0x24D8,
- icircumflex: 0x00EE,
- icyrillic: 0x0456,
- idblgrave: 0x0209,
- ideographearthcircle: 0x328F,
- ideographfirecircle: 0x328B,
- ideographicallianceparen: 0x323F,
- ideographiccallparen: 0x323A,
- ideographiccentrecircle: 0x32A5,
- ideographicclose: 0x3006,
- ideographiccomma: 0x3001,
- ideographiccommaleft: 0xFF64,
- ideographiccongratulationparen: 0x3237,
- ideographiccorrectcircle: 0x32A3,
- ideographicearthparen: 0x322F,
- ideographicenterpriseparen: 0x323D,
- ideographicexcellentcircle: 0x329D,
- ideographicfestivalparen: 0x3240,
- ideographicfinancialcircle: 0x3296,
- ideographicfinancialparen: 0x3236,
- ideographicfireparen: 0x322B,
- ideographichaveparen: 0x3232,
- ideographichighcircle: 0x32A4,
- ideographiciterationmark: 0x3005,
- ideographiclaborcircle: 0x3298,
- ideographiclaborparen: 0x3238,
- ideographicleftcircle: 0x32A7,
- ideographiclowcircle: 0x32A6,
- ideographicmedicinecircle: 0x32A9,
- ideographicmetalparen: 0x322E,
- ideographicmoonparen: 0x322A,
- ideographicnameparen: 0x3234,
- ideographicperiod: 0x3002,
- ideographicprintcircle: 0x329E,
- ideographicreachparen: 0x3243,
- ideographicrepresentparen: 0x3239,
- ideographicresourceparen: 0x323E,
- ideographicrightcircle: 0x32A8,
- ideographicsecretcircle: 0x3299,
- ideographicselfparen: 0x3242,
- ideographicsocietyparen: 0x3233,
- ideographicspace: 0x3000,
- ideographicspecialparen: 0x3235,
- ideographicstockparen: 0x3231,
- ideographicstudyparen: 0x323B,
- ideographicsunparen: 0x3230,
- ideographicsuperviseparen: 0x323C,
- ideographicwaterparen: 0x322C,
- ideographicwoodparen: 0x322D,
- ideographiczero: 0x3007,
- ideographmetalcircle: 0x328E,
- ideographmooncircle: 0x328A,
- ideographnamecircle: 0x3294,
- ideographsuncircle: 0x3290,
- ideographwatercircle: 0x328C,
- ideographwoodcircle: 0x328D,
- ideva: 0x0907,
- idieresis: 0x00EF,
- idieresisacute: 0x1E2F,
- idieresiscyrillic: 0x04E5,
- idotbelow: 0x1ECB,
- iebrevecyrillic: 0x04D7,
- iecyrillic: 0x0435,
- ieungacirclekorean: 0x3275,
- ieungaparenkorean: 0x3215,
- ieungcirclekorean: 0x3267,
- ieungkorean: 0x3147,
- ieungparenkorean: 0x3207,
- igrave: 0x00EC,
- igujarati: 0x0A87,
- igurmukhi: 0x0A07,
- ihiragana: 0x3044,
- ihookabove: 0x1EC9,
- iibengali: 0x0988,
- iicyrillic: 0x0438,
- iideva: 0x0908,
- iigujarati: 0x0A88,
- iigurmukhi: 0x0A08,
- iimatragurmukhi: 0x0A40,
- iinvertedbreve: 0x020B,
- iishortcyrillic: 0x0439,
- iivowelsignbengali: 0x09C0,
- iivowelsigndeva: 0x0940,
- iivowelsigngujarati: 0x0AC0,
- ij: 0x0133,
- ikatakana: 0x30A4,
- ikatakanahalfwidth: 0xFF72,
- ikorean: 0x3163,
- ilde: 0x02DC,
- iluyhebrew: 0x05AC,
- imacron: 0x012B,
- imacroncyrillic: 0x04E3,
- imageorapproximatelyequal: 0x2253,
- imatragurmukhi: 0x0A3F,
- imonospace: 0xFF49,
- increment: 0x2206,
- infinity: 0x221E,
- iniarmenian: 0x056B,
- integral: 0x222B,
- integralbottom: 0x2321,
- integralbt: 0x2321,
- integralex: 0xF8F5,
- integraltop: 0x2320,
- integraltp: 0x2320,
- intersection: 0x2229,
- intisquare: 0x3305,
- invbullet: 0x25D8,
- invcircle: 0x25D9,
- invsmileface: 0x263B,
- iocyrillic: 0x0451,
- iogonek: 0x012F,
- iota: 0x03B9,
- iotadieresis: 0x03CA,
- iotadieresistonos: 0x0390,
- iotalatin: 0x0269,
- iotatonos: 0x03AF,
- iparen: 0x24A4,
- irigurmukhi: 0x0A72,
- ismallhiragana: 0x3043,
- ismallkatakana: 0x30A3,
- ismallkatakanahalfwidth: 0xFF68,
- issharbengali: 0x09FA,
- istroke: 0x0268,
- isuperior: 0xF6ED,
- iterationhiragana: 0x309D,
- iterationkatakana: 0x30FD,
- itilde: 0x0129,
- itildebelow: 0x1E2D,
- iubopomofo: 0x3129,
- iucyrillic: 0x044E,
- ivowelsignbengali: 0x09BF,
- ivowelsigndeva: 0x093F,
- ivowelsigngujarati: 0x0ABF,
- izhitsacyrillic: 0x0475,
- izhitsadblgravecyrillic: 0x0477,
- j: 0x006A,
- jaarmenian: 0x0571,
- jabengali: 0x099C,
- jadeva: 0x091C,
- jagujarati: 0x0A9C,
- jagurmukhi: 0x0A1C,
- jbopomofo: 0x3110,
- jcaron: 0x01F0,
- jcircle: 0x24D9,
- jcircumflex: 0x0135,
- jcrossedtail: 0x029D,
- jdotlessstroke: 0x025F,
- jecyrillic: 0x0458,
- jeemarabic: 0x062C,
- jeemfinalarabic: 0xFE9E,
- jeeminitialarabic: 0xFE9F,
- jeemmedialarabic: 0xFEA0,
- jeharabic: 0x0698,
- jehfinalarabic: 0xFB8B,
- jhabengali: 0x099D,
- jhadeva: 0x091D,
- jhagujarati: 0x0A9D,
- jhagurmukhi: 0x0A1D,
- jheharmenian: 0x057B,
- jis: 0x3004,
- jmonospace: 0xFF4A,
- jparen: 0x24A5,
- jsuperior: 0x02B2,
- k: 0x006B,
- kabashkircyrillic: 0x04A1,
- kabengali: 0x0995,
- kacute: 0x1E31,
- kacyrillic: 0x043A,
- kadescendercyrillic: 0x049B,
- kadeva: 0x0915,
- kaf: 0x05DB,
- kafarabic: 0x0643,
- kafdagesh: 0xFB3B,
- kafdageshhebrew: 0xFB3B,
- kaffinalarabic: 0xFEDA,
- kafhebrew: 0x05DB,
- kafinitialarabic: 0xFEDB,
- kafmedialarabic: 0xFEDC,
- kafrafehebrew: 0xFB4D,
- kagujarati: 0x0A95,
- kagurmukhi: 0x0A15,
- kahiragana: 0x304B,
- kahookcyrillic: 0x04C4,
- kakatakana: 0x30AB,
- kakatakanahalfwidth: 0xFF76,
- kappa: 0x03BA,
- kappasymbolgreek: 0x03F0,
- kapyeounmieumkorean: 0x3171,
- kapyeounphieuphkorean: 0x3184,
- kapyeounpieupkorean: 0x3178,
- kapyeounssangpieupkorean: 0x3179,
- karoriisquare: 0x330D,
- kashidaautoarabic: 0x0640,
- kashidaautonosidebearingarabic: 0x0640,
- kasmallkatakana: 0x30F5,
- kasquare: 0x3384,
- kasraarabic: 0x0650,
- kasratanarabic: 0x064D,
- kastrokecyrillic: 0x049F,
- katahiraprolongmarkhalfwidth: 0xFF70,
- kaverticalstrokecyrillic: 0x049D,
- kbopomofo: 0x310E,
- kcalsquare: 0x3389,
- kcaron: 0x01E9,
- kcedilla: 0x0137,
- kcircle: 0x24DA,
- kcommaaccent: 0x0137,
- kdotbelow: 0x1E33,
- keharmenian: 0x0584,
- kehiragana: 0x3051,
- kekatakana: 0x30B1,
- kekatakanahalfwidth: 0xFF79,
- kenarmenian: 0x056F,
- kesmallkatakana: 0x30F6,
- kgreenlandic: 0x0138,
- khabengali: 0x0996,
- khacyrillic: 0x0445,
- khadeva: 0x0916,
- khagujarati: 0x0A96,
- khagurmukhi: 0x0A16,
- khaharabic: 0x062E,
- khahfinalarabic: 0xFEA6,
- khahinitialarabic: 0xFEA7,
- khahmedialarabic: 0xFEA8,
- kheicoptic: 0x03E7,
- khhadeva: 0x0959,
- khhagurmukhi: 0x0A59,
- khieukhacirclekorean: 0x3278,
- khieukhaparenkorean: 0x3218,
- khieukhcirclekorean: 0x326A,
- khieukhkorean: 0x314B,
- khieukhparenkorean: 0x320A,
- khokhaithai: 0x0E02,
- khokhonthai: 0x0E05,
- khokhuatthai: 0x0E03,
- khokhwaithai: 0x0E04,
- khomutthai: 0x0E5B,
- khook: 0x0199,
- khorakhangthai: 0x0E06,
- khzsquare: 0x3391,
- kihiragana: 0x304D,
- kikatakana: 0x30AD,
- kikatakanahalfwidth: 0xFF77,
- kiroguramusquare: 0x3315,
- kiromeetorusquare: 0x3316,
- kirosquare: 0x3314,
- kiyeokacirclekorean: 0x326E,
- kiyeokaparenkorean: 0x320E,
- kiyeokcirclekorean: 0x3260,
- kiyeokkorean: 0x3131,
- kiyeokparenkorean: 0x3200,
- kiyeoksioskorean: 0x3133,
- kjecyrillic: 0x045C,
- klinebelow: 0x1E35,
- klsquare: 0x3398,
- kmcubedsquare: 0x33A6,
- kmonospace: 0xFF4B,
- kmsquaredsquare: 0x33A2,
- kohiragana: 0x3053,
- kohmsquare: 0x33C0,
- kokaithai: 0x0E01,
- kokatakana: 0x30B3,
- kokatakanahalfwidth: 0xFF7A,
- kooposquare: 0x331E,
- koppacyrillic: 0x0481,
- koreanstandardsymbol: 0x327F,
- koroniscmb: 0x0343,
- kparen: 0x24A6,
- kpasquare: 0x33AA,
- ksicyrillic: 0x046F,
- ktsquare: 0x33CF,
- kturned: 0x029E,
- kuhiragana: 0x304F,
- kukatakana: 0x30AF,
- kukatakanahalfwidth: 0xFF78,
- kvsquare: 0x33B8,
- kwsquare: 0x33BE,
- l: 0x006C,
- labengali: 0x09B2,
- lacute: 0x013A,
- ladeva: 0x0932,
- lagujarati: 0x0AB2,
- lagurmukhi: 0x0A32,
- lakkhangyaothai: 0x0E45,
- lamaleffinalarabic: 0xFEFC,
- lamalefhamzaabovefinalarabic: 0xFEF8,
- lamalefhamzaaboveisolatedarabic: 0xFEF7,
- lamalefhamzabelowfinalarabic: 0xFEFA,
- lamalefhamzabelowisolatedarabic: 0xFEF9,
- lamalefisolatedarabic: 0xFEFB,
- lamalefmaddaabovefinalarabic: 0xFEF6,
- lamalefmaddaaboveisolatedarabic: 0xFEF5,
- lamarabic: 0x0644,
- lambda: 0x03BB,
- lambdastroke: 0x019B,
- lamed: 0x05DC,
- lameddagesh: 0xFB3C,
- lameddageshhebrew: 0xFB3C,
- lamedhebrew: 0x05DC,
- lamfinalarabic: 0xFEDE,
- lamhahinitialarabic: 0xFCCA,
- laminitialarabic: 0xFEDF,
- lamjeeminitialarabic: 0xFCC9,
- lamkhahinitialarabic: 0xFCCB,
- lamlamhehisolatedarabic: 0xFDF2,
- lammedialarabic: 0xFEE0,
- lammeemhahinitialarabic: 0xFD88,
- lammeeminitialarabic: 0xFCCC,
- largecircle: 0x25EF,
- lbar: 0x019A,
- lbelt: 0x026C,
- lbopomofo: 0x310C,
- lcaron: 0x013E,
- lcedilla: 0x013C,
- lcircle: 0x24DB,
- lcircumflexbelow: 0x1E3D,
- lcommaaccent: 0x013C,
- ldot: 0x0140,
- ldotaccent: 0x0140,
- ldotbelow: 0x1E37,
- ldotbelowmacron: 0x1E39,
- leftangleabovecmb: 0x031A,
- lefttackbelowcmb: 0x0318,
- less: 0x003C,
- lessequal: 0x2264,
- lessequalorgreater: 0x22DA,
- lessmonospace: 0xFF1C,
- lessorequivalent: 0x2272,
- lessorgreater: 0x2276,
- lessoverequal: 0x2266,
- lesssmall: 0xFE64,
- lezh: 0x026E,
- lfblock: 0x258C,
- lhookretroflex: 0x026D,
- lira: 0x20A4,
- liwnarmenian: 0x056C,
- lj: 0x01C9,
- ljecyrillic: 0x0459,
- ll: 0xF6C0,
- lladeva: 0x0933,
- llagujarati: 0x0AB3,
- llinebelow: 0x1E3B,
- llladeva: 0x0934,
- llvocalicbengali: 0x09E1,
- llvocalicdeva: 0x0961,
- llvocalicvowelsignbengali: 0x09E3,
- llvocalicvowelsigndeva: 0x0963,
- lmiddletilde: 0x026B,
- lmonospace: 0xFF4C,
- lmsquare: 0x33D0,
- lochulathai: 0x0E2C,
- logicaland: 0x2227,
- logicalnot: 0x00AC,
- logicalnotreversed: 0x2310,
- logicalor: 0x2228,
- lolingthai: 0x0E25,
- longs: 0x017F,
- lowlinecenterline: 0xFE4E,
- lowlinecmb: 0x0332,
- lowlinedashed: 0xFE4D,
- lozenge: 0x25CA,
- lparen: 0x24A7,
- lslash: 0x0142,
- lsquare: 0x2113,
- lsuperior: 0xF6EE,
- ltshade: 0x2591,
- luthai: 0x0E26,
- lvocalicbengali: 0x098C,
- lvocalicdeva: 0x090C,
- lvocalicvowelsignbengali: 0x09E2,
- lvocalicvowelsigndeva: 0x0962,
- lxsquare: 0x33D3,
- m: 0x006D,
- mabengali: 0x09AE,
- macron: 0x00AF,
- macronbelowcmb: 0x0331,
- macroncmb: 0x0304,
- macronlowmod: 0x02CD,
- macronmonospace: 0xFFE3,
- macute: 0x1E3F,
- madeva: 0x092E,
- magujarati: 0x0AAE,
- magurmukhi: 0x0A2E,
- mahapakhhebrew: 0x05A4,
- mahapakhlefthebrew: 0x05A4,
- mahiragana: 0x307E,
- maichattawalowleftthai: 0xF895,
- maichattawalowrightthai: 0xF894,
- maichattawathai: 0x0E4B,
- maichattawaupperleftthai: 0xF893,
- maieklowleftthai: 0xF88C,
- maieklowrightthai: 0xF88B,
- maiekthai: 0x0E48,
- maiekupperleftthai: 0xF88A,
- maihanakatleftthai: 0xF884,
- maihanakatthai: 0x0E31,
- maitaikhuleftthai: 0xF889,
- maitaikhuthai: 0x0E47,
- maitholowleftthai: 0xF88F,
- maitholowrightthai: 0xF88E,
- maithothai: 0x0E49,
- maithoupperleftthai: 0xF88D,
- maitrilowleftthai: 0xF892,
- maitrilowrightthai: 0xF891,
- maitrithai: 0x0E4A,
- maitriupperleftthai: 0xF890,
- maiyamokthai: 0x0E46,
- makatakana: 0x30DE,
- makatakanahalfwidth: 0xFF8F,
- male: 0x2642,
- mansyonsquare: 0x3347,
- maqafhebrew: 0x05BE,
- mars: 0x2642,
- masoracirclehebrew: 0x05AF,
- masquare: 0x3383,
- mbopomofo: 0x3107,
- mbsquare: 0x33D4,
- mcircle: 0x24DC,
- mcubedsquare: 0x33A5,
- mdotaccent: 0x1E41,
- mdotbelow: 0x1E43,
- meemarabic: 0x0645,
- meemfinalarabic: 0xFEE2,
- meeminitialarabic: 0xFEE3,
- meemmedialarabic: 0xFEE4,
- meemmeeminitialarabic: 0xFCD1,
- meemmeemisolatedarabic: 0xFC48,
- meetorusquare: 0x334D,
- mehiragana: 0x3081,
- meizierasquare: 0x337E,
- mekatakana: 0x30E1,
- mekatakanahalfwidth: 0xFF92,
- mem: 0x05DE,
- memdagesh: 0xFB3E,
- memdageshhebrew: 0xFB3E,
- memhebrew: 0x05DE,
- menarmenian: 0x0574,
- merkhahebrew: 0x05A5,
- merkhakefulahebrew: 0x05A6,
- merkhakefulalefthebrew: 0x05A6,
- merkhalefthebrew: 0x05A5,
- mhook: 0x0271,
- mhzsquare: 0x3392,
- middledotkatakanahalfwidth: 0xFF65,
- middot: 0x00B7,
- mieumacirclekorean: 0x3272,
- mieumaparenkorean: 0x3212,
- mieumcirclekorean: 0x3264,
- mieumkorean: 0x3141,
- mieumpansioskorean: 0x3170,
- mieumparenkorean: 0x3204,
- mieumpieupkorean: 0x316E,
- mieumsioskorean: 0x316F,
- mihiragana: 0x307F,
- mikatakana: 0x30DF,
- mikatakanahalfwidth: 0xFF90,
- minus: 0x2212,
- minusbelowcmb: 0x0320,
- minuscircle: 0x2296,
- minusmod: 0x02D7,
- minusplus: 0x2213,
- minute: 0x2032,
- miribaarusquare: 0x334A,
- mirisquare: 0x3349,
- mlonglegturned: 0x0270,
- mlsquare: 0x3396,
- mmcubedsquare: 0x33A3,
- mmonospace: 0xFF4D,
- mmsquaredsquare: 0x339F,
- mohiragana: 0x3082,
- mohmsquare: 0x33C1,
- mokatakana: 0x30E2,
- mokatakanahalfwidth: 0xFF93,
- molsquare: 0x33D6,
- momathai: 0x0E21,
- moverssquare: 0x33A7,
- moverssquaredsquare: 0x33A8,
- mparen: 0x24A8,
- mpasquare: 0x33AB,
- mssquare: 0x33B3,
- msuperior: 0xF6EF,
- mturned: 0x026F,
- mu: 0x00B5,
- mu1: 0x00B5,
- muasquare: 0x3382,
- muchgreater: 0x226B,
- muchless: 0x226A,
- mufsquare: 0x338C,
- mugreek: 0x03BC,
- mugsquare: 0x338D,
- muhiragana: 0x3080,
- mukatakana: 0x30E0,
- mukatakanahalfwidth: 0xFF91,
- mulsquare: 0x3395,
- multiply: 0x00D7,
- mumsquare: 0x339B,
- munahhebrew: 0x05A3,
- munahlefthebrew: 0x05A3,
- musicalnote: 0x266A,
- musicalnotedbl: 0x266B,
- musicflatsign: 0x266D,
- musicsharpsign: 0x266F,
- mussquare: 0x33B2,
- muvsquare: 0x33B6,
- muwsquare: 0x33BC,
- mvmegasquare: 0x33B9,
- mvsquare: 0x33B7,
- mwmegasquare: 0x33BF,
- mwsquare: 0x33BD,
- n: 0x006E,
- nabengali: 0x09A8,
- nabla: 0x2207,
- nacute: 0x0144,
- nadeva: 0x0928,
- nagujarati: 0x0AA8,
- nagurmukhi: 0x0A28,
- nahiragana: 0x306A,
- nakatakana: 0x30CA,
- nakatakanahalfwidth: 0xFF85,
- napostrophe: 0x0149,
- nasquare: 0x3381,
- nbopomofo: 0x310B,
- nbspace: 0x00A0,
- ncaron: 0x0148,
- ncedilla: 0x0146,
- ncircle: 0x24DD,
- ncircumflexbelow: 0x1E4B,
- ncommaaccent: 0x0146,
- ndotaccent: 0x1E45,
- ndotbelow: 0x1E47,
- nehiragana: 0x306D,
- nekatakana: 0x30CD,
- nekatakanahalfwidth: 0xFF88,
- newsheqelsign: 0x20AA,
- nfsquare: 0x338B,
- ngabengali: 0x0999,
- ngadeva: 0x0919,
- ngagujarati: 0x0A99,
- ngagurmukhi: 0x0A19,
- ngonguthai: 0x0E07,
- nhiragana: 0x3093,
- nhookleft: 0x0272,
- nhookretroflex: 0x0273,
- nieunacirclekorean: 0x326F,
- nieunaparenkorean: 0x320F,
- nieuncieuckorean: 0x3135,
- nieuncirclekorean: 0x3261,
- nieunhieuhkorean: 0x3136,
- nieunkorean: 0x3134,
- nieunpansioskorean: 0x3168,
- nieunparenkorean: 0x3201,
- nieunsioskorean: 0x3167,
- nieuntikeutkorean: 0x3166,
- nihiragana: 0x306B,
- nikatakana: 0x30CB,
- nikatakanahalfwidth: 0xFF86,
- nikhahitleftthai: 0xF899,
- nikhahitthai: 0x0E4D,
- nine: 0x0039,
- ninearabic: 0x0669,
- ninebengali: 0x09EF,
- ninecircle: 0x2468,
- ninecircleinversesansserif: 0x2792,
- ninedeva: 0x096F,
- ninegujarati: 0x0AEF,
- ninegurmukhi: 0x0A6F,
- ninehackarabic: 0x0669,
- ninehangzhou: 0x3029,
- nineideographicparen: 0x3228,
- nineinferior: 0x2089,
- ninemonospace: 0xFF19,
- nineoldstyle: 0xF739,
- nineparen: 0x247C,
- nineperiod: 0x2490,
- ninepersian: 0x06F9,
- nineroman: 0x2178,
- ninesuperior: 0x2079,
- nineteencircle: 0x2472,
- nineteenparen: 0x2486,
- nineteenperiod: 0x249A,
- ninethai: 0x0E59,
- nj: 0x01CC,
- njecyrillic: 0x045A,
- nkatakana: 0x30F3,
- nkatakanahalfwidth: 0xFF9D,
- nlegrightlong: 0x019E,
- nlinebelow: 0x1E49,
- nmonospace: 0xFF4E,
- nmsquare: 0x339A,
- nnabengali: 0x09A3,
- nnadeva: 0x0923,
- nnagujarati: 0x0AA3,
- nnagurmukhi: 0x0A23,
- nnnadeva: 0x0929,
- nohiragana: 0x306E,
- nokatakana: 0x30CE,
- nokatakanahalfwidth: 0xFF89,
- nonbreakingspace: 0x00A0,
- nonenthai: 0x0E13,
- nonuthai: 0x0E19,
- noonarabic: 0x0646,
- noonfinalarabic: 0xFEE6,
- noonghunnaarabic: 0x06BA,
- noonghunnafinalarabic: 0xFB9F,
- nooninitialarabic: 0xFEE7,
- noonjeeminitialarabic: 0xFCD2,
- noonjeemisolatedarabic: 0xFC4B,
- noonmedialarabic: 0xFEE8,
- noonmeeminitialarabic: 0xFCD5,
- noonmeemisolatedarabic: 0xFC4E,
- noonnoonfinalarabic: 0xFC8D,
- notcontains: 0x220C,
- notelement: 0x2209,
- notelementof: 0x2209,
- notequal: 0x2260,
- notgreater: 0x226F,
- notgreaternorequal: 0x2271,
- notgreaternorless: 0x2279,
- notidentical: 0x2262,
- notless: 0x226E,
- notlessnorequal: 0x2270,
- notparallel: 0x2226,
- notprecedes: 0x2280,
- notsubset: 0x2284,
- notsucceeds: 0x2281,
- notsuperset: 0x2285,
- nowarmenian: 0x0576,
- nparen: 0x24A9,
- nssquare: 0x33B1,
- nsuperior: 0x207F,
- ntilde: 0x00F1,
- nu: 0x03BD,
- nuhiragana: 0x306C,
- nukatakana: 0x30CC,
- nukatakanahalfwidth: 0xFF87,
- nuktabengali: 0x09BC,
- nuktadeva: 0x093C,
- nuktagujarati: 0x0ABC,
- nuktagurmukhi: 0x0A3C,
- numbersign: 0x0023,
- numbersignmonospace: 0xFF03,
- numbersignsmall: 0xFE5F,
- numeralsigngreek: 0x0374,
- numeralsignlowergreek: 0x0375,
- numero: 0x2116,
- nun: 0x05E0,
- nundagesh: 0xFB40,
- nundageshhebrew: 0xFB40,
- nunhebrew: 0x05E0,
- nvsquare: 0x33B5,
- nwsquare: 0x33BB,
- nyabengali: 0x099E,
- nyadeva: 0x091E,
- nyagujarati: 0x0A9E,
- nyagurmukhi: 0x0A1E,
- o: 0x006F,
- oacute: 0x00F3,
- oangthai: 0x0E2D,
- obarred: 0x0275,
- obarredcyrillic: 0x04E9,
- obarreddieresiscyrillic: 0x04EB,
- obengali: 0x0993,
- obopomofo: 0x311B,
- obreve: 0x014F,
- ocandradeva: 0x0911,
- ocandragujarati: 0x0A91,
- ocandravowelsigndeva: 0x0949,
- ocandravowelsigngujarati: 0x0AC9,
- ocaron: 0x01D2,
- ocircle: 0x24DE,
- ocircumflex: 0x00F4,
- ocircumflexacute: 0x1ED1,
- ocircumflexdotbelow: 0x1ED9,
- ocircumflexgrave: 0x1ED3,
- ocircumflexhookabove: 0x1ED5,
- ocircumflextilde: 0x1ED7,
- ocyrillic: 0x043E,
- odblacute: 0x0151,
- odblgrave: 0x020D,
- odeva: 0x0913,
- odieresis: 0x00F6,
- odieresiscyrillic: 0x04E7,
- odotbelow: 0x1ECD,
- oe: 0x0153,
- oekorean: 0x315A,
- ogonek: 0x02DB,
- ogonekcmb: 0x0328,
- ograve: 0x00F2,
- ogujarati: 0x0A93,
- oharmenian: 0x0585,
- ohiragana: 0x304A,
- ohookabove: 0x1ECF,
- ohorn: 0x01A1,
- ohornacute: 0x1EDB,
- ohorndotbelow: 0x1EE3,
- ohorngrave: 0x1EDD,
- ohornhookabove: 0x1EDF,
- ohorntilde: 0x1EE1,
- ohungarumlaut: 0x0151,
- oi: 0x01A3,
- oinvertedbreve: 0x020F,
- okatakana: 0x30AA,
- okatakanahalfwidth: 0xFF75,
- okorean: 0x3157,
- olehebrew: 0x05AB,
- omacron: 0x014D,
- omacronacute: 0x1E53,
- omacrongrave: 0x1E51,
- omdeva: 0x0950,
- omega: 0x03C9,
- omega1: 0x03D6,
- omegacyrillic: 0x0461,
- omegalatinclosed: 0x0277,
- omegaroundcyrillic: 0x047B,
- omegatitlocyrillic: 0x047D,
- omegatonos: 0x03CE,
- omgujarati: 0x0AD0,
- omicron: 0x03BF,
- omicrontonos: 0x03CC,
- omonospace: 0xFF4F,
- one: 0x0031,
- onearabic: 0x0661,
- onebengali: 0x09E7,
- onecircle: 0x2460,
- onecircleinversesansserif: 0x278A,
- onedeva: 0x0967,
- onedotenleader: 0x2024,
- oneeighth: 0x215B,
- onefitted: 0xF6DC,
- onegujarati: 0x0AE7,
- onegurmukhi: 0x0A67,
- onehackarabic: 0x0661,
- onehalf: 0x00BD,
- onehangzhou: 0x3021,
- oneideographicparen: 0x3220,
- oneinferior: 0x2081,
- onemonospace: 0xFF11,
- onenumeratorbengali: 0x09F4,
- oneoldstyle: 0xF731,
- oneparen: 0x2474,
- oneperiod: 0x2488,
- onepersian: 0x06F1,
- onequarter: 0x00BC,
- oneroman: 0x2170,
- onesuperior: 0x00B9,
- onethai: 0x0E51,
- onethird: 0x2153,
- oogonek: 0x01EB,
- oogonekmacron: 0x01ED,
- oogurmukhi: 0x0A13,
- oomatragurmukhi: 0x0A4B,
- oopen: 0x0254,
- oparen: 0x24AA,
- openbullet: 0x25E6,
- option: 0x2325,
- ordfeminine: 0x00AA,
- ordmasculine: 0x00BA,
- orthogonal: 0x221F,
- oshortdeva: 0x0912,
- oshortvowelsigndeva: 0x094A,
- oslash: 0x00F8,
- oslashacute: 0x01FF,
- osmallhiragana: 0x3049,
- osmallkatakana: 0x30A9,
- osmallkatakanahalfwidth: 0xFF6B,
- ostrokeacute: 0x01FF,
- osuperior: 0xF6F0,
- otcyrillic: 0x047F,
- otilde: 0x00F5,
- otildeacute: 0x1E4D,
- otildedieresis: 0x1E4F,
- oubopomofo: 0x3121,
- overline: 0x203E,
- overlinecenterline: 0xFE4A,
- overlinecmb: 0x0305,
- overlinedashed: 0xFE49,
- overlinedblwavy: 0xFE4C,
- overlinewavy: 0xFE4B,
- overscore: 0x00AF,
- ovowelsignbengali: 0x09CB,
- ovowelsigndeva: 0x094B,
- ovowelsigngujarati: 0x0ACB,
- p: 0x0070,
- paampssquare: 0x3380,
- paasentosquare: 0x332B,
- pabengali: 0x09AA,
- pacute: 0x1E55,
- padeva: 0x092A,
- pagedown: 0x21DF,
- pageup: 0x21DE,
- pagujarati: 0x0AAA,
- pagurmukhi: 0x0A2A,
- pahiragana: 0x3071,
- paiyannoithai: 0x0E2F,
- pakatakana: 0x30D1,
- palatalizationcyrilliccmb: 0x0484,
- palochkacyrillic: 0x04C0,
- pansioskorean: 0x317F,
- paragraph: 0x00B6,
- parallel: 0x2225,
- parenleft: 0x0028,
- parenleftaltonearabic: 0xFD3E,
- parenleftbt: 0xF8ED,
- parenleftex: 0xF8EC,
- parenleftinferior: 0x208D,
- parenleftmonospace: 0xFF08,
- parenleftsmall: 0xFE59,
- parenleftsuperior: 0x207D,
- parenlefttp: 0xF8EB,
- parenleftvertical: 0xFE35,
- parenright: 0x0029,
- parenrightaltonearabic: 0xFD3F,
- parenrightbt: 0xF8F8,
- parenrightex: 0xF8F7,
- parenrightinferior: 0x208E,
- parenrightmonospace: 0xFF09,
- parenrightsmall: 0xFE5A,
- parenrightsuperior: 0x207E,
- parenrighttp: 0xF8F6,
- parenrightvertical: 0xFE36,
- partialdiff: 0x2202,
- paseqhebrew: 0x05C0,
- pashtahebrew: 0x0599,
- pasquare: 0x33A9,
- patah: 0x05B7,
- patah11: 0x05B7,
- patah1d: 0x05B7,
- patah2a: 0x05B7,
- patahhebrew: 0x05B7,
- patahnarrowhebrew: 0x05B7,
- patahquarterhebrew: 0x05B7,
- patahwidehebrew: 0x05B7,
- pazerhebrew: 0x05A1,
- pbopomofo: 0x3106,
- pcircle: 0x24DF,
- pdotaccent: 0x1E57,
- pe: 0x05E4,
- pecyrillic: 0x043F,
- pedagesh: 0xFB44,
- pedageshhebrew: 0xFB44,
- peezisquare: 0x333B,
- pefinaldageshhebrew: 0xFB43,
- peharabic: 0x067E,
- peharmenian: 0x057A,
- pehebrew: 0x05E4,
- pehfinalarabic: 0xFB57,
- pehinitialarabic: 0xFB58,
- pehiragana: 0x307A,
- pehmedialarabic: 0xFB59,
- pekatakana: 0x30DA,
- pemiddlehookcyrillic: 0x04A7,
- perafehebrew: 0xFB4E,
- percent: 0x0025,
- percentarabic: 0x066A,
- percentmonospace: 0xFF05,
- percentsmall: 0xFE6A,
- period: 0x002E,
- periodarmenian: 0x0589,
- periodcentered: 0x00B7,
- periodhalfwidth: 0xFF61,
- periodinferior: 0xF6E7,
- periodmonospace: 0xFF0E,
- periodsmall: 0xFE52,
- periodsuperior: 0xF6E8,
- perispomenigreekcmb: 0x0342,
- perpendicular: 0x22A5,
- perthousand: 0x2030,
- peseta: 0x20A7,
- pfsquare: 0x338A,
- phabengali: 0x09AB,
- phadeva: 0x092B,
- phagujarati: 0x0AAB,
- phagurmukhi: 0x0A2B,
- phi: 0x03C6,
- phi1: 0x03D5,
- phieuphacirclekorean: 0x327A,
- phieuphaparenkorean: 0x321A,
- phieuphcirclekorean: 0x326C,
- phieuphkorean: 0x314D,
- phieuphparenkorean: 0x320C,
- philatin: 0x0278,
- phinthuthai: 0x0E3A,
- phisymbolgreek: 0x03D5,
- phook: 0x01A5,
- phophanthai: 0x0E1E,
- phophungthai: 0x0E1C,
- phosamphaothai: 0x0E20,
- pi: 0x03C0,
- pieupacirclekorean: 0x3273,
- pieupaparenkorean: 0x3213,
- pieupcieuckorean: 0x3176,
- pieupcirclekorean: 0x3265,
- pieupkiyeokkorean: 0x3172,
- pieupkorean: 0x3142,
- pieupparenkorean: 0x3205,
- pieupsioskiyeokkorean: 0x3174,
- pieupsioskorean: 0x3144,
- pieupsiostikeutkorean: 0x3175,
- pieupthieuthkorean: 0x3177,
- pieuptikeutkorean: 0x3173,
- pihiragana: 0x3074,
- pikatakana: 0x30D4,
- pisymbolgreek: 0x03D6,
- piwrarmenian: 0x0583,
- plus: 0x002B,
- plusbelowcmb: 0x031F,
- pluscircle: 0x2295,
- plusminus: 0x00B1,
- plusmod: 0x02D6,
- plusmonospace: 0xFF0B,
- plussmall: 0xFE62,
- plussuperior: 0x207A,
- pmonospace: 0xFF50,
- pmsquare: 0x33D8,
- pohiragana: 0x307D,
- pointingindexdownwhite: 0x261F,
- pointingindexleftwhite: 0x261C,
- pointingindexrightwhite: 0x261E,
- pointingindexupwhite: 0x261D,
- pokatakana: 0x30DD,
- poplathai: 0x0E1B,
- postalmark: 0x3012,
- postalmarkface: 0x3020,
- pparen: 0x24AB,
- precedes: 0x227A,
- prescription: 0x211E,
- primemod: 0x02B9,
- primereversed: 0x2035,
- product: 0x220F,
- projective: 0x2305,
- prolongedkana: 0x30FC,
- propellor: 0x2318,
- propersubset: 0x2282,
- propersuperset: 0x2283,
- proportion: 0x2237,
- proportional: 0x221D,
- psi: 0x03C8,
- psicyrillic: 0x0471,
- psilipneumatacyrilliccmb: 0x0486,
- pssquare: 0x33B0,
- puhiragana: 0x3077,
- pukatakana: 0x30D7,
- pvsquare: 0x33B4,
- pwsquare: 0x33BA,
- q: 0x0071,
- qadeva: 0x0958,
- qadmahebrew: 0x05A8,
- qafarabic: 0x0642,
- qaffinalarabic: 0xFED6,
- qafinitialarabic: 0xFED7,
- qafmedialarabic: 0xFED8,
- qamats: 0x05B8,
- qamats10: 0x05B8,
- qamats1a: 0x05B8,
- qamats1c: 0x05B8,
- qamats27: 0x05B8,
- qamats29: 0x05B8,
- qamats33: 0x05B8,
- qamatsde: 0x05B8,
- qamatshebrew: 0x05B8,
- qamatsnarrowhebrew: 0x05B8,
- qamatsqatanhebrew: 0x05B8,
- qamatsqatannarrowhebrew: 0x05B8,
- qamatsqatanquarterhebrew: 0x05B8,
- qamatsqatanwidehebrew: 0x05B8,
- qamatsquarterhebrew: 0x05B8,
- qamatswidehebrew: 0x05B8,
- qarneyparahebrew: 0x059F,
- qbopomofo: 0x3111,
- qcircle: 0x24E0,
- qhook: 0x02A0,
- qmonospace: 0xFF51,
- qof: 0x05E7,
- qofdagesh: 0xFB47,
- qofdageshhebrew: 0xFB47,
- qofhebrew: 0x05E7,
- qparen: 0x24AC,
- quarternote: 0x2669,
- qubuts: 0x05BB,
- qubuts18: 0x05BB,
- qubuts25: 0x05BB,
- qubuts31: 0x05BB,
- qubutshebrew: 0x05BB,
- qubutsnarrowhebrew: 0x05BB,
- qubutsquarterhebrew: 0x05BB,
- qubutswidehebrew: 0x05BB,
- question: 0x003F,
- questionarabic: 0x061F,
- questionarmenian: 0x055E,
- questiondown: 0x00BF,
- questiondownsmall: 0xF7BF,
- questiongreek: 0x037E,
- questionmonospace: 0xFF1F,
- questionsmall: 0xF73F,
- quotedbl: 0x0022,
- quotedblbase: 0x201E,
- quotedblleft: 0x201C,
- quotedblmonospace: 0xFF02,
- quotedblprime: 0x301E,
- quotedblprimereversed: 0x301D,
- quotedblright: 0x201D,
- quoteleft: 0x2018,
- quoteleftreversed: 0x201B,
- quotereversed: 0x201B,
- quoteright: 0x2019,
- quoterightn: 0x0149,
- quotesinglbase: 0x201A,
- quotesingle: 0x0027,
- quotesinglemonospace: 0xFF07,
- r: 0x0072,
- raarmenian: 0x057C,
- rabengali: 0x09B0,
- racute: 0x0155,
- radeva: 0x0930,
- radical: 0x221A,
- radicalex: 0xF8E5,
- radoverssquare: 0x33AE,
- radoverssquaredsquare: 0x33AF,
- radsquare: 0x33AD,
- rafe: 0x05BF,
- rafehebrew: 0x05BF,
- ragujarati: 0x0AB0,
- ragurmukhi: 0x0A30,
- rahiragana: 0x3089,
- rakatakana: 0x30E9,
- rakatakanahalfwidth: 0xFF97,
- ralowerdiagonalbengali: 0x09F1,
- ramiddlediagonalbengali: 0x09F0,
- ramshorn: 0x0264,
- ratio: 0x2236,
- rbopomofo: 0x3116,
- rcaron: 0x0159,
- rcedilla: 0x0157,
- rcircle: 0x24E1,
- rcommaaccent: 0x0157,
- rdblgrave: 0x0211,
- rdotaccent: 0x1E59,
- rdotbelow: 0x1E5B,
- rdotbelowmacron: 0x1E5D,
- referencemark: 0x203B,
- reflexsubset: 0x2286,
- reflexsuperset: 0x2287,
- registered: 0x00AE,
- registersans: 0xF8E8,
- registerserif: 0xF6DA,
- reharabic: 0x0631,
- reharmenian: 0x0580,
- rehfinalarabic: 0xFEAE,
- rehiragana: 0x308C,
- rekatakana: 0x30EC,
- rekatakanahalfwidth: 0xFF9A,
- resh: 0x05E8,
- reshdageshhebrew: 0xFB48,
- reshhebrew: 0x05E8,
- reversedtilde: 0x223D,
- reviahebrew: 0x0597,
- reviamugrashhebrew: 0x0597,
- revlogicalnot: 0x2310,
- rfishhook: 0x027E,
- rfishhookreversed: 0x027F,
- rhabengali: 0x09DD,
- rhadeva: 0x095D,
- rho: 0x03C1,
- rhook: 0x027D,
- rhookturned: 0x027B,
- rhookturnedsuperior: 0x02B5,
- rhosymbolgreek: 0x03F1,
- rhotichookmod: 0x02DE,
- rieulacirclekorean: 0x3271,
- rieulaparenkorean: 0x3211,
- rieulcirclekorean: 0x3263,
- rieulhieuhkorean: 0x3140,
- rieulkiyeokkorean: 0x313A,
- rieulkiyeoksioskorean: 0x3169,
- rieulkorean: 0x3139,
- rieulmieumkorean: 0x313B,
- rieulpansioskorean: 0x316C,
- rieulparenkorean: 0x3203,
- rieulphieuphkorean: 0x313F,
- rieulpieupkorean: 0x313C,
- rieulpieupsioskorean: 0x316B,
- rieulsioskorean: 0x313D,
- rieulthieuthkorean: 0x313E,
- rieultikeutkorean: 0x316A,
- rieulyeorinhieuhkorean: 0x316D,
- rightangle: 0x221F,
- righttackbelowcmb: 0x0319,
- righttriangle: 0x22BF,
- rihiragana: 0x308A,
- rikatakana: 0x30EA,
- rikatakanahalfwidth: 0xFF98,
- ring: 0x02DA,
- ringbelowcmb: 0x0325,
- ringcmb: 0x030A,
- ringhalfleft: 0x02BF,
- ringhalfleftarmenian: 0x0559,
- ringhalfleftbelowcmb: 0x031C,
- ringhalfleftcentered: 0x02D3,
- ringhalfright: 0x02BE,
- ringhalfrightbelowcmb: 0x0339,
- ringhalfrightcentered: 0x02D2,
- rinvertedbreve: 0x0213,
- rittorusquare: 0x3351,
- rlinebelow: 0x1E5F,
- rlongleg: 0x027C,
- rlonglegturned: 0x027A,
- rmonospace: 0xFF52,
- rohiragana: 0x308D,
- rokatakana: 0x30ED,
- rokatakanahalfwidth: 0xFF9B,
- roruathai: 0x0E23,
- rparen: 0x24AD,
- rrabengali: 0x09DC,
- rradeva: 0x0931,
- rragurmukhi: 0x0A5C,
- rreharabic: 0x0691,
- rrehfinalarabic: 0xFB8D,
- rrvocalicbengali: 0x09E0,
- rrvocalicdeva: 0x0960,
- rrvocalicgujarati: 0x0AE0,
- rrvocalicvowelsignbengali: 0x09C4,
- rrvocalicvowelsigndeva: 0x0944,
- rrvocalicvowelsigngujarati: 0x0AC4,
- rsuperior: 0xF6F1,
- rtblock: 0x2590,
- rturned: 0x0279,
- rturnedsuperior: 0x02B4,
- ruhiragana: 0x308B,
- rukatakana: 0x30EB,
- rukatakanahalfwidth: 0xFF99,
- rupeemarkbengali: 0x09F2,
- rupeesignbengali: 0x09F3,
- rupiah: 0xF6DD,
- ruthai: 0x0E24,
- rvocalicbengali: 0x098B,
- rvocalicdeva: 0x090B,
- rvocalicgujarati: 0x0A8B,
- rvocalicvowelsignbengali: 0x09C3,
- rvocalicvowelsigndeva: 0x0943,
- rvocalicvowelsigngujarati: 0x0AC3,
- s: 0x0073,
- sabengali: 0x09B8,
- sacute: 0x015B,
- sacutedotaccent: 0x1E65,
- sadarabic: 0x0635,
- sadeva: 0x0938,
- sadfinalarabic: 0xFEBA,
- sadinitialarabic: 0xFEBB,
- sadmedialarabic: 0xFEBC,
- sagujarati: 0x0AB8,
- sagurmukhi: 0x0A38,
- sahiragana: 0x3055,
- sakatakana: 0x30B5,
- sakatakanahalfwidth: 0xFF7B,
- sallallahoualayhewasallamarabic: 0xFDFA,
- samekh: 0x05E1,
- samekhdagesh: 0xFB41,
- samekhdageshhebrew: 0xFB41,
- samekhhebrew: 0x05E1,
- saraaathai: 0x0E32,
- saraaethai: 0x0E41,
- saraaimaimalaithai: 0x0E44,
- saraaimaimuanthai: 0x0E43,
- saraamthai: 0x0E33,
- saraathai: 0x0E30,
- saraethai: 0x0E40,
- saraiileftthai: 0xF886,
- saraiithai: 0x0E35,
- saraileftthai: 0xF885,
- saraithai: 0x0E34,
- saraothai: 0x0E42,
- saraueeleftthai: 0xF888,
- saraueethai: 0x0E37,
- saraueleftthai: 0xF887,
- sarauethai: 0x0E36,
- sarauthai: 0x0E38,
- sarauuthai: 0x0E39,
- sbopomofo: 0x3119,
- scaron: 0x0161,
- scarondotaccent: 0x1E67,
- scedilla: 0x015F,
- schwa: 0x0259,
- schwacyrillic: 0x04D9,
- schwadieresiscyrillic: 0x04DB,
- schwahook: 0x025A,
- scircle: 0x24E2,
- scircumflex: 0x015D,
- scommaaccent: 0x0219,
- sdotaccent: 0x1E61,
- sdotbelow: 0x1E63,
- sdotbelowdotaccent: 0x1E69,
- seagullbelowcmb: 0x033C,
- second: 0x2033,
- secondtonechinese: 0x02CA,
- section: 0x00A7,
- seenarabic: 0x0633,
- seenfinalarabic: 0xFEB2,
- seeninitialarabic: 0xFEB3,
- seenmedialarabic: 0xFEB4,
- segol: 0x05B6,
- segol13: 0x05B6,
- segol1f: 0x05B6,
- segol2c: 0x05B6,
- segolhebrew: 0x05B6,
- segolnarrowhebrew: 0x05B6,
- segolquarterhebrew: 0x05B6,
- segoltahebrew: 0x0592,
- segolwidehebrew: 0x05B6,
- seharmenian: 0x057D,
- sehiragana: 0x305B,
- sekatakana: 0x30BB,
- sekatakanahalfwidth: 0xFF7E,
- semicolon: 0x003B,
- semicolonarabic: 0x061B,
- semicolonmonospace: 0xFF1B,
- semicolonsmall: 0xFE54,
- semivoicedmarkkana: 0x309C,
- semivoicedmarkkanahalfwidth: 0xFF9F,
- sentisquare: 0x3322,
- sentosquare: 0x3323,
- seven: 0x0037,
- sevenarabic: 0x0667,
- sevenbengali: 0x09ED,
- sevencircle: 0x2466,
- sevencircleinversesansserif: 0x2790,
- sevendeva: 0x096D,
- seveneighths: 0x215E,
- sevengujarati: 0x0AED,
- sevengurmukhi: 0x0A6D,
- sevenhackarabic: 0x0667,
- sevenhangzhou: 0x3027,
- sevenideographicparen: 0x3226,
- seveninferior: 0x2087,
- sevenmonospace: 0xFF17,
- sevenoldstyle: 0xF737,
- sevenparen: 0x247A,
- sevenperiod: 0x248E,
- sevenpersian: 0x06F7,
- sevenroman: 0x2176,
- sevensuperior: 0x2077,
- seventeencircle: 0x2470,
- seventeenparen: 0x2484,
- seventeenperiod: 0x2498,
- seventhai: 0x0E57,
- sfthyphen: 0x00AD,
- shaarmenian: 0x0577,
- shabengali: 0x09B6,
- shacyrillic: 0x0448,
- shaddaarabic: 0x0651,
- shaddadammaarabic: 0xFC61,
- shaddadammatanarabic: 0xFC5E,
- shaddafathaarabic: 0xFC60,
- shaddakasraarabic: 0xFC62,
- shaddakasratanarabic: 0xFC5F,
- shade: 0x2592,
- shadedark: 0x2593,
- shadelight: 0x2591,
- shademedium: 0x2592,
- shadeva: 0x0936,
- shagujarati: 0x0AB6,
- shagurmukhi: 0x0A36,
- shalshelethebrew: 0x0593,
- shbopomofo: 0x3115,
- shchacyrillic: 0x0449,
- sheenarabic: 0x0634,
- sheenfinalarabic: 0xFEB6,
- sheeninitialarabic: 0xFEB7,
- sheenmedialarabic: 0xFEB8,
- sheicoptic: 0x03E3,
- sheqel: 0x20AA,
- sheqelhebrew: 0x20AA,
- sheva: 0x05B0,
- sheva115: 0x05B0,
- sheva15: 0x05B0,
- sheva22: 0x05B0,
- sheva2e: 0x05B0,
- shevahebrew: 0x05B0,
- shevanarrowhebrew: 0x05B0,
- shevaquarterhebrew: 0x05B0,
- shevawidehebrew: 0x05B0,
- shhacyrillic: 0x04BB,
- shimacoptic: 0x03ED,
- shin: 0x05E9,
- shindagesh: 0xFB49,
- shindageshhebrew: 0xFB49,
- shindageshshindot: 0xFB2C,
- shindageshshindothebrew: 0xFB2C,
- shindageshsindot: 0xFB2D,
- shindageshsindothebrew: 0xFB2D,
- shindothebrew: 0x05C1,
- shinhebrew: 0x05E9,
- shinshindot: 0xFB2A,
- shinshindothebrew: 0xFB2A,
- shinsindot: 0xFB2B,
- shinsindothebrew: 0xFB2B,
- shook: 0x0282,
- sigma: 0x03C3,
- sigma1: 0x03C2,
- sigmafinal: 0x03C2,
- sigmalunatesymbolgreek: 0x03F2,
- sihiragana: 0x3057,
- sikatakana: 0x30B7,
- sikatakanahalfwidth: 0xFF7C,
- siluqhebrew: 0x05BD,
- siluqlefthebrew: 0x05BD,
- similar: 0x223C,
- sindothebrew: 0x05C2,
- siosacirclekorean: 0x3274,
- siosaparenkorean: 0x3214,
- sioscieuckorean: 0x317E,
- sioscirclekorean: 0x3266,
- sioskiyeokkorean: 0x317A,
- sioskorean: 0x3145,
- siosnieunkorean: 0x317B,
- siosparenkorean: 0x3206,
- siospieupkorean: 0x317D,
- siostikeutkorean: 0x317C,
- six: 0x0036,
- sixarabic: 0x0666,
- sixbengali: 0x09EC,
- sixcircle: 0x2465,
- sixcircleinversesansserif: 0x278F,
- sixdeva: 0x096C,
- sixgujarati: 0x0AEC,
- sixgurmukhi: 0x0A6C,
- sixhackarabic: 0x0666,
- sixhangzhou: 0x3026,
- sixideographicparen: 0x3225,
- sixinferior: 0x2086,
- sixmonospace: 0xFF16,
- sixoldstyle: 0xF736,
- sixparen: 0x2479,
- sixperiod: 0x248D,
- sixpersian: 0x06F6,
- sixroman: 0x2175,
- sixsuperior: 0x2076,
- sixteencircle: 0x246F,
- sixteencurrencydenominatorbengali: 0x09F9,
- sixteenparen: 0x2483,
- sixteenperiod: 0x2497,
- sixthai: 0x0E56,
- slash: 0x002F,
- slashmonospace: 0xFF0F,
- slong: 0x017F,
- slongdotaccent: 0x1E9B,
- smileface: 0x263A,
- smonospace: 0xFF53,
- sofpasuqhebrew: 0x05C3,
- softhyphen: 0x00AD,
- softsigncyrillic: 0x044C,
- sohiragana: 0x305D,
- sokatakana: 0x30BD,
- sokatakanahalfwidth: 0xFF7F,
- soliduslongoverlaycmb: 0x0338,
- solidusshortoverlaycmb: 0x0337,
- sorusithai: 0x0E29,
- sosalathai: 0x0E28,
- sosothai: 0x0E0B,
- sosuathai: 0x0E2A,
- space: 0x0020,
- spacehackarabic: 0x0020,
- spade: 0x2660,
- spadesuitblack: 0x2660,
- spadesuitwhite: 0x2664,
- sparen: 0x24AE,
- squarebelowcmb: 0x033B,
- squarecc: 0x33C4,
- squarecm: 0x339D,
- squarediagonalcrosshatchfill: 0x25A9,
- squarehorizontalfill: 0x25A4,
- squarekg: 0x338F,
- squarekm: 0x339E,
- squarekmcapital: 0x33CE,
- squareln: 0x33D1,
- squarelog: 0x33D2,
- squaremg: 0x338E,
- squaremil: 0x33D5,
- squaremm: 0x339C,
- squaremsquared: 0x33A1,
- squareorthogonalcrosshatchfill: 0x25A6,
- squareupperlefttolowerrightfill: 0x25A7,
- squareupperrighttolowerleftfill: 0x25A8,
- squareverticalfill: 0x25A5,
- squarewhitewithsmallblack: 0x25A3,
- srsquare: 0x33DB,
- ssabengali: 0x09B7,
- ssadeva: 0x0937,
- ssagujarati: 0x0AB7,
- ssangcieuckorean: 0x3149,
- ssanghieuhkorean: 0x3185,
- ssangieungkorean: 0x3180,
- ssangkiyeokkorean: 0x3132,
- ssangnieunkorean: 0x3165,
- ssangpieupkorean: 0x3143,
- ssangsioskorean: 0x3146,
- ssangtikeutkorean: 0x3138,
- ssuperior: 0xF6F2,
- sterling: 0x00A3,
- sterlingmonospace: 0xFFE1,
- strokelongoverlaycmb: 0x0336,
- strokeshortoverlaycmb: 0x0335,
- subset: 0x2282,
- subsetnotequal: 0x228A,
- subsetorequal: 0x2286,
- succeeds: 0x227B,
- suchthat: 0x220B,
- suhiragana: 0x3059,
- sukatakana: 0x30B9,
- sukatakanahalfwidth: 0xFF7D,
- sukunarabic: 0x0652,
- summation: 0x2211,
- sun: 0x263C,
- superset: 0x2283,
- supersetnotequal: 0x228B,
- supersetorequal: 0x2287,
- svsquare: 0x33DC,
- syouwaerasquare: 0x337C,
- t: 0x0074,
- tabengali: 0x09A4,
- tackdown: 0x22A4,
- tackleft: 0x22A3,
- tadeva: 0x0924,
- tagujarati: 0x0AA4,
- tagurmukhi: 0x0A24,
- taharabic: 0x0637,
- tahfinalarabic: 0xFEC2,
- tahinitialarabic: 0xFEC3,
- tahiragana: 0x305F,
- tahmedialarabic: 0xFEC4,
- taisyouerasquare: 0x337D,
- takatakana: 0x30BF,
- takatakanahalfwidth: 0xFF80,
- tatweelarabic: 0x0640,
- tau: 0x03C4,
- tav: 0x05EA,
- tavdages: 0xFB4A,
- tavdagesh: 0xFB4A,
- tavdageshhebrew: 0xFB4A,
- tavhebrew: 0x05EA,
- tbar: 0x0167,
- tbopomofo: 0x310A,
- tcaron: 0x0165,
- tccurl: 0x02A8,
- tcedilla: 0x0163,
- tcheharabic: 0x0686,
- tchehfinalarabic: 0xFB7B,
- tchehinitialarabic: 0xFB7C,
- tchehmedialarabic: 0xFB7D,
- tcircle: 0x24E3,
- tcircumflexbelow: 0x1E71,
- tcommaaccent: 0x0163,
- tdieresis: 0x1E97,
- tdotaccent: 0x1E6B,
- tdotbelow: 0x1E6D,
- tecyrillic: 0x0442,
- tedescendercyrillic: 0x04AD,
- teharabic: 0x062A,
- tehfinalarabic: 0xFE96,
- tehhahinitialarabic: 0xFCA2,
- tehhahisolatedarabic: 0xFC0C,
- tehinitialarabic: 0xFE97,
- tehiragana: 0x3066,
- tehjeeminitialarabic: 0xFCA1,
- tehjeemisolatedarabic: 0xFC0B,
- tehmarbutaarabic: 0x0629,
- tehmarbutafinalarabic: 0xFE94,
- tehmedialarabic: 0xFE98,
- tehmeeminitialarabic: 0xFCA4,
- tehmeemisolatedarabic: 0xFC0E,
- tehnoonfinalarabic: 0xFC73,
- tekatakana: 0x30C6,
- tekatakanahalfwidth: 0xFF83,
- telephone: 0x2121,
- telephoneblack: 0x260E,
- telishagedolahebrew: 0x05A0,
- telishaqetanahebrew: 0x05A9,
- tencircle: 0x2469,
- tenideographicparen: 0x3229,
- tenparen: 0x247D,
- tenperiod: 0x2491,
- tenroman: 0x2179,
- tesh: 0x02A7,
- tet: 0x05D8,
- tetdagesh: 0xFB38,
- tetdageshhebrew: 0xFB38,
- tethebrew: 0x05D8,
- tetsecyrillic: 0x04B5,
- tevirhebrew: 0x059B,
- tevirlefthebrew: 0x059B,
- thabengali: 0x09A5,
- thadeva: 0x0925,
- thagujarati: 0x0AA5,
- thagurmukhi: 0x0A25,
- thalarabic: 0x0630,
- thalfinalarabic: 0xFEAC,
- thanthakhatlowleftthai: 0xF898,
- thanthakhatlowrightthai: 0xF897,
- thanthakhatthai: 0x0E4C,
- thanthakhatupperleftthai: 0xF896,
- theharabic: 0x062B,
- thehfinalarabic: 0xFE9A,
- thehinitialarabic: 0xFE9B,
- thehmedialarabic: 0xFE9C,
- thereexists: 0x2203,
- therefore: 0x2234,
- theta: 0x03B8,
- theta1: 0x03D1,
- thetasymbolgreek: 0x03D1,
- thieuthacirclekorean: 0x3279,
- thieuthaparenkorean: 0x3219,
- thieuthcirclekorean: 0x326B,
- thieuthkorean: 0x314C,
- thieuthparenkorean: 0x320B,
- thirteencircle: 0x246C,
- thirteenparen: 0x2480,
- thirteenperiod: 0x2494,
- thonangmonthothai: 0x0E11,
- thook: 0x01AD,
- thophuthaothai: 0x0E12,
- thorn: 0x00FE,
- thothahanthai: 0x0E17,
- thothanthai: 0x0E10,
- thothongthai: 0x0E18,
- thothungthai: 0x0E16,
- thousandcyrillic: 0x0482,
- thousandsseparatorarabic: 0x066C,
- thousandsseparatorpersian: 0x066C,
- three: 0x0033,
- threearabic: 0x0663,
- threebengali: 0x09E9,
- threecircle: 0x2462,
- threecircleinversesansserif: 0x278C,
- threedeva: 0x0969,
- threeeighths: 0x215C,
- threegujarati: 0x0AE9,
- threegurmukhi: 0x0A69,
- threehackarabic: 0x0663,
- threehangzhou: 0x3023,
- threeideographicparen: 0x3222,
- threeinferior: 0x2083,
- threemonospace: 0xFF13,
- threenumeratorbengali: 0x09F6,
- threeoldstyle: 0xF733,
- threeparen: 0x2476,
- threeperiod: 0x248A,
- threepersian: 0x06F3,
- threequarters: 0x00BE,
- threequartersemdash: 0xF6DE,
- threeroman: 0x2172,
- threesuperior: 0x00B3,
- threethai: 0x0E53,
- thzsquare: 0x3394,
- tihiragana: 0x3061,
- tikatakana: 0x30C1,
- tikatakanahalfwidth: 0xFF81,
- tikeutacirclekorean: 0x3270,
- tikeutaparenkorean: 0x3210,
- tikeutcirclekorean: 0x3262,
- tikeutkorean: 0x3137,
- tikeutparenkorean: 0x3202,
- tilde: 0x02DC,
- tildebelowcmb: 0x0330,
- tildecmb: 0x0303,
- tildecomb: 0x0303,
- tildedoublecmb: 0x0360,
- tildeoperator: 0x223C,
- tildeoverlaycmb: 0x0334,
- tildeverticalcmb: 0x033E,
- timescircle: 0x2297,
- tipehahebrew: 0x0596,
- tipehalefthebrew: 0x0596,
- tippigurmukhi: 0x0A70,
- titlocyrilliccmb: 0x0483,
- tiwnarmenian: 0x057F,
- tlinebelow: 0x1E6F,
- tmonospace: 0xFF54,
- toarmenian: 0x0569,
- tohiragana: 0x3068,
- tokatakana: 0x30C8,
- tokatakanahalfwidth: 0xFF84,
- tonebarextrahighmod: 0x02E5,
- tonebarextralowmod: 0x02E9,
- tonebarhighmod: 0x02E6,
- tonebarlowmod: 0x02E8,
- tonebarmidmod: 0x02E7,
- tonefive: 0x01BD,
- tonesix: 0x0185,
- tonetwo: 0x01A8,
- tonos: 0x0384,
- tonsquare: 0x3327,
- topatakthai: 0x0E0F,
- tortoiseshellbracketleft: 0x3014,
- tortoiseshellbracketleftsmall: 0xFE5D,
- tortoiseshellbracketleftvertical: 0xFE39,
- tortoiseshellbracketright: 0x3015,
- tortoiseshellbracketrightsmall: 0xFE5E,
- tortoiseshellbracketrightvertical: 0xFE3A,
- totaothai: 0x0E15,
- tpalatalhook: 0x01AB,
- tparen: 0x24AF,
- trademark: 0x2122,
- trademarksans: 0xF8EA,
- trademarkserif: 0xF6DB,
- tretroflexhook: 0x0288,
- triagdn: 0x25BC,
- triaglf: 0x25C4,
- triagrt: 0x25BA,
- triagup: 0x25B2,
- ts: 0x02A6,
- tsadi: 0x05E6,
- tsadidagesh: 0xFB46,
- tsadidageshhebrew: 0xFB46,
- tsadihebrew: 0x05E6,
- tsecyrillic: 0x0446,
- tsere: 0x05B5,
- tsere12: 0x05B5,
- tsere1e: 0x05B5,
- tsere2b: 0x05B5,
- tserehebrew: 0x05B5,
- tserenarrowhebrew: 0x05B5,
- tserequarterhebrew: 0x05B5,
- tserewidehebrew: 0x05B5,
- tshecyrillic: 0x045B,
- tsuperior: 0xF6F3,
- ttabengali: 0x099F,
- ttadeva: 0x091F,
- ttagujarati: 0x0A9F,
- ttagurmukhi: 0x0A1F,
- tteharabic: 0x0679,
- ttehfinalarabic: 0xFB67,
- ttehinitialarabic: 0xFB68,
- ttehmedialarabic: 0xFB69,
- tthabengali: 0x09A0,
- tthadeva: 0x0920,
- tthagujarati: 0x0AA0,
- tthagurmukhi: 0x0A20,
- tturned: 0x0287,
- tuhiragana: 0x3064,
- tukatakana: 0x30C4,
- tukatakanahalfwidth: 0xFF82,
- tusmallhiragana: 0x3063,
- tusmallkatakana: 0x30C3,
- tusmallkatakanahalfwidth: 0xFF6F,
- twelvecircle: 0x246B,
- twelveparen: 0x247F,
- twelveperiod: 0x2493,
- twelveroman: 0x217B,
- twentycircle: 0x2473,
- twentyhangzhou: 0x5344,
- twentyparen: 0x2487,
- twentyperiod: 0x249B,
- two: 0x0032,
- twoarabic: 0x0662,
- twobengali: 0x09E8,
- twocircle: 0x2461,
- twocircleinversesansserif: 0x278B,
- twodeva: 0x0968,
- twodotenleader: 0x2025,
- twodotleader: 0x2025,
- twodotleadervertical: 0xFE30,
- twogujarati: 0x0AE8,
- twogurmukhi: 0x0A68,
- twohackarabic: 0x0662,
- twohangzhou: 0x3022,
- twoideographicparen: 0x3221,
- twoinferior: 0x2082,
- twomonospace: 0xFF12,
- twonumeratorbengali: 0x09F5,
- twooldstyle: 0xF732,
- twoparen: 0x2475,
- twoperiod: 0x2489,
- twopersian: 0x06F2,
- tworoman: 0x2171,
- twostroke: 0x01BB,
- twosuperior: 0x00B2,
- twothai: 0x0E52,
- twothirds: 0x2154,
- u: 0x0075,
- uacute: 0x00FA,
- ubar: 0x0289,
- ubengali: 0x0989,
- ubopomofo: 0x3128,
- ubreve: 0x016D,
- ucaron: 0x01D4,
- ucircle: 0x24E4,
- ucircumflex: 0x00FB,
- ucircumflexbelow: 0x1E77,
- ucyrillic: 0x0443,
- udattadeva: 0x0951,
- udblacute: 0x0171,
- udblgrave: 0x0215,
- udeva: 0x0909,
- udieresis: 0x00FC,
- udieresisacute: 0x01D8,
- udieresisbelow: 0x1E73,
- udieresiscaron: 0x01DA,
- udieresiscyrillic: 0x04F1,
- udieresisgrave: 0x01DC,
- udieresismacron: 0x01D6,
- udotbelow: 0x1EE5,
- ugrave: 0x00F9,
- ugujarati: 0x0A89,
- ugurmukhi: 0x0A09,
- uhiragana: 0x3046,
- uhookabove: 0x1EE7,
- uhorn: 0x01B0,
- uhornacute: 0x1EE9,
- uhorndotbelow: 0x1EF1,
- uhorngrave: 0x1EEB,
- uhornhookabove: 0x1EED,
- uhorntilde: 0x1EEF,
- uhungarumlaut: 0x0171,
- uhungarumlautcyrillic: 0x04F3,
- uinvertedbreve: 0x0217,
- ukatakana: 0x30A6,
- ukatakanahalfwidth: 0xFF73,
- ukcyrillic: 0x0479,
- ukorean: 0x315C,
- umacron: 0x016B,
- umacroncyrillic: 0x04EF,
- umacrondieresis: 0x1E7B,
- umatragurmukhi: 0x0A41,
- umonospace: 0xFF55,
- underscore: 0x005F,
- underscoredbl: 0x2017,
- underscoremonospace: 0xFF3F,
- underscorevertical: 0xFE33,
- underscorewavy: 0xFE4F,
- union: 0x222A,
- universal: 0x2200,
- uogonek: 0x0173,
- uparen: 0x24B0,
- upblock: 0x2580,
- upperdothebrew: 0x05C4,
- upsilon: 0x03C5,
- upsilondieresis: 0x03CB,
- upsilondieresistonos: 0x03B0,
- upsilonlatin: 0x028A,
- upsilontonos: 0x03CD,
- uptackbelowcmb: 0x031D,
- uptackmod: 0x02D4,
- uragurmukhi: 0x0A73,
- uring: 0x016F,
- ushortcyrillic: 0x045E,
- usmallhiragana: 0x3045,
- usmallkatakana: 0x30A5,
- usmallkatakanahalfwidth: 0xFF69,
- ustraightcyrillic: 0x04AF,
- ustraightstrokecyrillic: 0x04B1,
- utilde: 0x0169,
- utildeacute: 0x1E79,
- utildebelow: 0x1E75,
- uubengali: 0x098A,
- uudeva: 0x090A,
- uugujarati: 0x0A8A,
- uugurmukhi: 0x0A0A,
- uumatragurmukhi: 0x0A42,
- uuvowelsignbengali: 0x09C2,
- uuvowelsigndeva: 0x0942,
- uuvowelsigngujarati: 0x0AC2,
- uvowelsignbengali: 0x09C1,
- uvowelsigndeva: 0x0941,
- uvowelsigngujarati: 0x0AC1,
- v: 0x0076,
- vadeva: 0x0935,
- vagujarati: 0x0AB5,
- vagurmukhi: 0x0A35,
- vakatakana: 0x30F7,
- vav: 0x05D5,
- vavdagesh: 0xFB35,
- vavdagesh65: 0xFB35,
- vavdageshhebrew: 0xFB35,
- vavhebrew: 0x05D5,
- vavholam: 0xFB4B,
- vavholamhebrew: 0xFB4B,
- vavvavhebrew: 0x05F0,
- vavyodhebrew: 0x05F1,
- vcircle: 0x24E5,
- vdotbelow: 0x1E7F,
- vecyrillic: 0x0432,
- veharabic: 0x06A4,
- vehfinalarabic: 0xFB6B,
- vehinitialarabic: 0xFB6C,
- vehmedialarabic: 0xFB6D,
- vekatakana: 0x30F9,
- venus: 0x2640,
- verticalbar: 0x007C,
- verticallineabovecmb: 0x030D,
- verticallinebelowcmb: 0x0329,
- verticallinelowmod: 0x02CC,
- verticallinemod: 0x02C8,
- vewarmenian: 0x057E,
- vhook: 0x028B,
- vikatakana: 0x30F8,
- viramabengali: 0x09CD,
- viramadeva: 0x094D,
- viramagujarati: 0x0ACD,
- visargabengali: 0x0983,
- visargadeva: 0x0903,
- visargagujarati: 0x0A83,
- vmonospace: 0xFF56,
- voarmenian: 0x0578,
- voicediterationhiragana: 0x309E,
- voicediterationkatakana: 0x30FE,
- voicedmarkkana: 0x309B,
- voicedmarkkanahalfwidth: 0xFF9E,
- vokatakana: 0x30FA,
- vparen: 0x24B1,
- vtilde: 0x1E7D,
- vturned: 0x028C,
- vuhiragana: 0x3094,
- vukatakana: 0x30F4,
- w: 0x0077,
- wacute: 0x1E83,
- waekorean: 0x3159,
- wahiragana: 0x308F,
- wakatakana: 0x30EF,
- wakatakanahalfwidth: 0xFF9C,
- wakorean: 0x3158,
- wasmallhiragana: 0x308E,
- wasmallkatakana: 0x30EE,
- wattosquare: 0x3357,
- wavedash: 0x301C,
- wavyunderscorevertical: 0xFE34,
- wawarabic: 0x0648,
- wawfinalarabic: 0xFEEE,
- wawhamzaabovearabic: 0x0624,
- wawhamzaabovefinalarabic: 0xFE86,
- wbsquare: 0x33DD,
- wcircle: 0x24E6,
- wcircumflex: 0x0175,
- wdieresis: 0x1E85,
- wdotaccent: 0x1E87,
- wdotbelow: 0x1E89,
- wehiragana: 0x3091,
- weierstrass: 0x2118,
- wekatakana: 0x30F1,
- wekorean: 0x315E,
- weokorean: 0x315D,
- wgrave: 0x1E81,
- whitebullet: 0x25E6,
- whitecircle: 0x25CB,
- whitecircleinverse: 0x25D9,
- whitecornerbracketleft: 0x300E,
- whitecornerbracketleftvertical: 0xFE43,
- whitecornerbracketright: 0x300F,
- whitecornerbracketrightvertical: 0xFE44,
- whitediamond: 0x25C7,
- whitediamondcontainingblacksmalldiamond: 0x25C8,
- whitedownpointingsmalltriangle: 0x25BF,
- whitedownpointingtriangle: 0x25BD,
- whiteleftpointingsmalltriangle: 0x25C3,
- whiteleftpointingtriangle: 0x25C1,
- whitelenticularbracketleft: 0x3016,
- whitelenticularbracketright: 0x3017,
- whiterightpointingsmalltriangle: 0x25B9,
- whiterightpointingtriangle: 0x25B7,
- whitesmallsquare: 0x25AB,
- whitesmilingface: 0x263A,
- whitesquare: 0x25A1,
- whitestar: 0x2606,
- whitetelephone: 0x260F,
- whitetortoiseshellbracketleft: 0x3018,
- whitetortoiseshellbracketright: 0x3019,
- whiteuppointingsmalltriangle: 0x25B5,
- whiteuppointingtriangle: 0x25B3,
- wihiragana: 0x3090,
- wikatakana: 0x30F0,
- wikorean: 0x315F,
- wmonospace: 0xFF57,
- wohiragana: 0x3092,
- wokatakana: 0x30F2,
- wokatakanahalfwidth: 0xFF66,
- won: 0x20A9,
- wonmonospace: 0xFFE6,
- wowaenthai: 0x0E27,
- wparen: 0x24B2,
- wring: 0x1E98,
- wsuperior: 0x02B7,
- wturned: 0x028D,
- wynn: 0x01BF,
- x: 0x0078,
- xabovecmb: 0x033D,
- xbopomofo: 0x3112,
- xcircle: 0x24E7,
- xdieresis: 0x1E8D,
- xdotaccent: 0x1E8B,
- xeharmenian: 0x056D,
- xi: 0x03BE,
- xmonospace: 0xFF58,
- xparen: 0x24B3,
- xsuperior: 0x02E3,
- y: 0x0079,
- yaadosquare: 0x334E,
- yabengali: 0x09AF,
- yacute: 0x00FD,
- yadeva: 0x092F,
- yaekorean: 0x3152,
- yagujarati: 0x0AAF,
- yagurmukhi: 0x0A2F,
- yahiragana: 0x3084,
- yakatakana: 0x30E4,
- yakatakanahalfwidth: 0xFF94,
- yakorean: 0x3151,
- yamakkanthai: 0x0E4E,
- yasmallhiragana: 0x3083,
- yasmallkatakana: 0x30E3,
- yasmallkatakanahalfwidth: 0xFF6C,
- yatcyrillic: 0x0463,
- ycircle: 0x24E8,
- ycircumflex: 0x0177,
- ydieresis: 0x00FF,
- ydotaccent: 0x1E8F,
- ydotbelow: 0x1EF5,
- yeharabic: 0x064A,
- yehbarreearabic: 0x06D2,
- yehbarreefinalarabic: 0xFBAF,
- yehfinalarabic: 0xFEF2,
- yehhamzaabovearabic: 0x0626,
- yehhamzaabovefinalarabic: 0xFE8A,
- yehhamzaaboveinitialarabic: 0xFE8B,
- yehhamzaabovemedialarabic: 0xFE8C,
- yehinitialarabic: 0xFEF3,
- yehmedialarabic: 0xFEF4,
- yehmeeminitialarabic: 0xFCDD,
- yehmeemisolatedarabic: 0xFC58,
- yehnoonfinalarabic: 0xFC94,
- yehthreedotsbelowarabic: 0x06D1,
- yekorean: 0x3156,
- yen: 0x00A5,
- yenmonospace: 0xFFE5,
- yeokorean: 0x3155,
- yeorinhieuhkorean: 0x3186,
- yerahbenyomohebrew: 0x05AA,
- yerahbenyomolefthebrew: 0x05AA,
- yericyrillic: 0x044B,
- yerudieresiscyrillic: 0x04F9,
- yesieungkorean: 0x3181,
- yesieungpansioskorean: 0x3183,
- yesieungsioskorean: 0x3182,
- yetivhebrew: 0x059A,
- ygrave: 0x1EF3,
- yhook: 0x01B4,
- yhookabove: 0x1EF7,
- yiarmenian: 0x0575,
- yicyrillic: 0x0457,
- yikorean: 0x3162,
- yinyang: 0x262F,
- yiwnarmenian: 0x0582,
- ymonospace: 0xFF59,
- yod: 0x05D9,
- yoddagesh: 0xFB39,
- yoddageshhebrew: 0xFB39,
- yodhebrew: 0x05D9,
- yodyodhebrew: 0x05F2,
- yodyodpatahhebrew: 0xFB1F,
- yohiragana: 0x3088,
- yoikorean: 0x3189,
- yokatakana: 0x30E8,
- yokatakanahalfwidth: 0xFF96,
- yokorean: 0x315B,
- yosmallhiragana: 0x3087,
- yosmallkatakana: 0x30E7,
- yosmallkatakanahalfwidth: 0xFF6E,
- yotgreek: 0x03F3,
- yoyaekorean: 0x3188,
- yoyakorean: 0x3187,
- yoyakthai: 0x0E22,
- yoyingthai: 0x0E0D,
- yparen: 0x24B4,
- ypogegrammeni: 0x037A,
- ypogegrammenigreekcmb: 0x0345,
- yr: 0x01A6,
- yring: 0x1E99,
- ysuperior: 0x02B8,
- ytilde: 0x1EF9,
- yturned: 0x028E,
- yuhiragana: 0x3086,
- yuikorean: 0x318C,
- yukatakana: 0x30E6,
- yukatakanahalfwidth: 0xFF95,
- yukorean: 0x3160,
- yusbigcyrillic: 0x046B,
- yusbigiotifiedcyrillic: 0x046D,
- yuslittlecyrillic: 0x0467,
- yuslittleiotifiedcyrillic: 0x0469,
- yusmallhiragana: 0x3085,
- yusmallkatakana: 0x30E5,
- yusmallkatakanahalfwidth: 0xFF6D,
- yuyekorean: 0x318B,
- yuyeokorean: 0x318A,
- yyabengali: 0x09DF,
- yyadeva: 0x095F,
- z: 0x007A,
- zaarmenian: 0x0566,
- zacute: 0x017A,
- zadeva: 0x095B,
- zagurmukhi: 0x0A5B,
- zaharabic: 0x0638,
- zahfinalarabic: 0xFEC6,
- zahinitialarabic: 0xFEC7,
- zahiragana: 0x3056,
- zahmedialarabic: 0xFEC8,
- zainarabic: 0x0632,
- zainfinalarabic: 0xFEB0,
- zakatakana: 0x30B6,
- zaqefgadolhebrew: 0x0595,
- zaqefqatanhebrew: 0x0594,
- zarqahebrew: 0x0598,
- zayin: 0x05D6,
- zayindagesh: 0xFB36,
- zayindageshhebrew: 0xFB36,
- zayinhebrew: 0x05D6,
- zbopomofo: 0x3117,
- zcaron: 0x017E,
- zcircle: 0x24E9,
- zcircumflex: 0x1E91,
- zcurl: 0x0291,
- zdot: 0x017C,
- zdotaccent: 0x017C,
- zdotbelow: 0x1E93,
- zecyrillic: 0x0437,
- zedescendercyrillic: 0x0499,
- zedieresiscyrillic: 0x04DF,
- zehiragana: 0x305C,
- zekatakana: 0x30BC,
- zero: 0x0030,
- zeroarabic: 0x0660,
- zerobengali: 0x09E6,
- zerodeva: 0x0966,
- zerogujarati: 0x0AE6,
- zerogurmukhi: 0x0A66,
- zerohackarabic: 0x0660,
- zeroinferior: 0x2080,
- zeromonospace: 0xFF10,
- zerooldstyle: 0xF730,
- zeropersian: 0x06F0,
- zerosuperior: 0x2070,
- zerothai: 0x0E50,
- zerowidthjoiner: 0xFEFF,
- zerowidthnonjoiner: 0x200C,
- zerowidthspace: 0x200B,
- zeta: 0x03B6,
- zhbopomofo: 0x3113,
- zhearmenian: 0x056A,
- zhebrevecyrillic: 0x04C2,
- zhecyrillic: 0x0436,
- zhedescendercyrillic: 0x0497,
- zhedieresiscyrillic: 0x04DD,
- zihiragana: 0x3058,
- zikatakana: 0x30B8,
- zinorhebrew: 0x05AE,
- zlinebelow: 0x1E95,
- zmonospace: 0xFF5A,
- zohiragana: 0x305E,
- zokatakana: 0x30BE,
- zparen: 0x24B5,
- zretroflexhook: 0x0290,
- zstroke: 0x01B6,
- zuhiragana: 0x305A,
- zukatakana: 0x30BA,
- '.notdef': 0x0000
-};
-
-
-
-var PDFImage = (function PDFImageClosure() {
- /**
- * Decode the image in the main thread if it supported. Resovles the promise
- * when the image data is ready.
- */
- function handleImageData(handler, xref, res, image, promise) {
- if (image instanceof JpegStream && image.isNativelyDecodable(xref, res)) {
- // For natively supported jpegs send them to the main thread for decoding.
- var dict = image.dict;
- var colorSpace = dict.get('ColorSpace', 'CS');
- colorSpace = ColorSpace.parse(colorSpace, xref, res);
- var numComps = colorSpace.numComps;
- handler.send('JpegDecode', [image.getIR(), numComps], function(message) {
- var data = message.data;
- var stream = new Stream(data, 0, data.length, image.dict);
- promise.resolve(stream);
- });
- } else {
- promise.resolve(image);
- }
- }
- /**
- * Decode and clamp a value. The formula is different from the spec because we
- * don't decode to float range [0,1], we decode it in the [0,max] range.
- */
- function decodeAndClamp(value, addend, coefficient, max) {
- value = addend + value * coefficient;
- // Clamp the value to the range
- return value < 0 ? 0 : value > max ? max : value;
- }
- function PDFImage(xref, res, image, inline, smask, mask) {
- this.image = image;
- if (image.getParams) {
- // JPX/JPEG2000 streams directly contain bits per component
- // and color space mode information.
- TODO('get params from actual stream');
- // var bits = ...
- // var colorspace = ...
- }
- // TODO cache rendered images?
-
- var dict = image.dict;
- this.width = dict.get('Width', 'W');
- this.height = dict.get('Height', 'H');
-
- if (this.width < 1 || this.height < 1)
- error('Invalid image width: ' + this.width + ' or height: ' +
- this.height);
-
- this.interpolate = dict.get('Interpolate', 'I') || false;
- this.imageMask = dict.get('ImageMask', 'IM') || false;
-
- var bitsPerComponent = image.bitsPerComponent;
- if (!bitsPerComponent) {
- bitsPerComponent = dict.get('BitsPerComponent', 'BPC');
- if (!bitsPerComponent) {
- if (this.imageMask)
- bitsPerComponent = 1;
- else
- error('Bits per component missing in image: ' + this.imageMask);
- }
- }
- this.bpc = bitsPerComponent;
-
- if (!this.imageMask) {
- var colorSpace = dict.get('ColorSpace', 'CS');
- if (!colorSpace) {
- TODO('JPX images (which don"t require color spaces');
- colorSpace = new Name('DeviceRGB');
- }
- this.colorSpace = ColorSpace.parse(colorSpace, xref, res);
- this.numComps = this.colorSpace.numComps;
- }
-
- this.decode = dict.get('Decode', 'D');
- this.needsDecode = false;
- if (this.decode && this.colorSpace &&
- !this.colorSpace.isDefaultDecode(this.decode)) {
- this.needsDecode = true;
- // Do some preprocessing to avoid more math.
- var max = (1 << bitsPerComponent) - 1;
- this.decodeCoefficients = [];
- this.decodeAddends = [];
- for (var i = 0, j = 0; i < this.decode.length; i += 2, ++j) {
- var dmin = this.decode[i];
- var dmax = this.decode[i + 1];
- this.decodeCoefficients[j] = dmax - dmin;
- this.decodeAddends[j] = max * dmin;
- }
- }
-
- if (smask) {
- this.smask = new PDFImage(xref, res, smask, false);
- } else if (mask) {
- if (isStream(mask)) {
- this.mask = new PDFImage(xref, res, mask, false);
- } else {
- // Color key mask (just an array).
- this.mask = mask;
- }
- }
- }
- /**
- * Handles processing of image data and calls the callback with an argument
- * of a PDFImage when the image is ready to be used.
- */
- PDFImage.buildImage = function PDFImage_buildImage(callback, handler, xref,
- res, image, inline) {
- var imageDataPromise = new Promise();
- var smaskPromise = new Promise();
- var maskPromise = new Promise();
- // The image data and smask data may not be ready yet, wait till both are
- // resolved.
- Promise.all([imageDataPromise, smaskPromise, maskPromise]).then(
- function(results) {
- var imageData = results[0], smaskData = results[1], maskData = results[2];
- var image = new PDFImage(xref, res, imageData, inline, smaskData,
- maskData);
- callback(image);
- });
-
- handleImageData(handler, xref, res, image, imageDataPromise);
-
- var smask = image.dict.get('SMask');
- var mask = image.dict.get('Mask');
-
- if (smask) {
- handleImageData(handler, xref, res, smask, smaskPromise);
- maskPromise.resolve(null);
- } else {
- smaskPromise.resolve(null);
- if (mask) {
- if (isStream(mask)) {
- handleImageData(handler, xref, res, mask, maskPromise);
- } else if (isArray(mask)) {
- maskPromise.resolve(mask);
- } else {
- warn('Unsupported mask format.');
- maskPromise.resolve(null);
- }
- } else {
- maskPromise.resolve(null);
- }
- }
- };
-
- /**
- * Resize an image using the nearest neighbor algorithm. Currently only
- * supports one and three component images.
- * @param {TypedArray} pixels The original image with one component.
- * @param {Number} bpc Number of bits per component.
- * @param {Number} components Number of color components, 1 or 3 is supported.
- * @param {Number} w1 Original width.
- * @param {Number} h1 Original height.
- * @param {Number} w2 New width.
- * @param {Number} h2 New height.
- * @return {TypedArray} Resized image data.
- */
- PDFImage.resize = function PDFImage_resize(pixels, bpc, components,
- w1, h1, w2, h2) {
- var length = w2 * h2 * components;
- var temp = bpc <= 8 ? new Uint8Array(length) :
- bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length);
- var xRatio = w1 / w2;
- var yRatio = h1 / h2;
- var px, py, newIndex, oldIndex;
- for (var i = 0; i < h2; i++) {
- for (var j = 0; j < w2; j++) {
- px = Math.floor(j * xRatio);
- py = Math.floor(i * yRatio);
- newIndex = (i * w2) + j;
- oldIndex = ((py * w1) + px);
- if (components === 1) {
- temp[newIndex] = pixels[oldIndex];
- } else if (components === 3) {
- newIndex *= 3;
- oldIndex *= 3;
- temp[newIndex] = pixels[oldIndex];
- temp[newIndex + 1] = pixels[oldIndex + 1];
- temp[newIndex + 2] = pixels[oldIndex + 2];
- }
- }
- }
- return temp;
- };
-
- PDFImage.prototype = {
- get drawWidth() {
- if (!this.smask)
- return this.width;
- return Math.max(this.width, this.smask.width);
- },
- get drawHeight() {
- if (!this.smask)
- return this.height;
- return Math.max(this.height, this.smask.height);
- },
- getComponents: function PDFImage_getComponents(buffer) {
- var bpc = this.bpc;
- var needsDecode = this.needsDecode;
- var decodeMap = this.decode;
-
- // This image doesn't require any extra work.
- if (bpc == 8 && !needsDecode)
- return buffer;
-
- var bufferLength = buffer.length;
- var width = this.width;
- var height = this.height;
- var numComps = this.numComps;
-
- var length = width * height * numComps;
- var bufferPos = 0;
- var output = bpc <= 8 ? new Uint8Array(length) :
- bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length);
- var rowComps = width * numComps;
- var decodeAddends, decodeCoefficients;
- if (needsDecode) {
- decodeAddends = this.decodeAddends;
- decodeCoefficients = this.decodeCoefficients;
- }
- var max = (1 << bpc) - 1;
-
- if (bpc == 8) {
- // Optimization for reading 8 bpc images that have a decode.
- for (var i = 0, ii = length; i < ii; ++i) {
- var compIndex = i % numComps;
- var value = buffer[i];
- value = decodeAndClamp(value, decodeAddends[compIndex],
- decodeCoefficients[compIndex], max);
- output[i] = value;
- }
- } else if (bpc == 1) {
- // Optimization for reading 1 bpc images.
- var valueZero = 0, valueOne = 1;
- if (decodeMap) {
- valueZero = decodeMap[0] ? 1 : 0;
- valueOne = decodeMap[1] ? 1 : 0;
- }
- var mask = 0;
- var buf = 0;
-
- for (var i = 0, ii = length; i < ii; ++i) {
- if (i % rowComps == 0) {
- mask = 0;
- buf = 0;
- } else {
- mask >>= 1;
- }
-
- if (mask <= 0) {
- buf = buffer[bufferPos++];
- mask = 128;
- }
-
- output[i] = !(buf & mask) ? valueZero : valueOne;
- }
- } else {
- // The general case that handles all other bpc values.
- var bits = 0, buf = 0;
- for (var i = 0, ii = length; i < ii; ++i) {
- if (i % rowComps == 0) {
- buf = 0;
- bits = 0;
- }
-
- while (bits < bpc) {
- buf = (buf << 8) | buffer[bufferPos++];
- bits += 8;
- }
-
- var remainingBits = bits - bpc;
- var value = buf >> remainingBits;
- if (needsDecode) {
- var compIndex = i % numComps;
- value = decodeAndClamp(value, decodeAddends[compIndex],
- decodeCoefficients[compIndex], max);
- }
- output[i] = value;
- buf = buf & ((1 << remainingBits) - 1);
- bits = remainingBits;
- }
- }
- return output;
- },
- getOpacity: function PDFImage_getOpacity(width, height, image) {
- var smask = this.smask;
- var mask = this.mask;
- var originalWidth = this.width;
- var originalHeight = this.height;
- var buf;
-
- if (smask) {
- var sw = smask.width;
- var sh = smask.height;
- buf = new Uint8Array(sw * sh);
- smask.fillGrayBuffer(buf);
- if (sw != width || sh != height)
- buf = PDFImage.resize(buf, smask.bpc, 1, sw, sh, width, height);
- } else if (mask) {
- if (mask instanceof PDFImage) {
- var sw = mask.width;
- var sh = mask.height;
- buf = new Uint8Array(sw * sh);
- mask.numComps = 1;
- mask.fillGrayBuffer(buf);
-
- // Need to invert values in buffer
- for (var i = 0, ii = sw * sh; i < ii; ++i)
- buf[i] = 255 - buf[i];
-
- if (sw != width || sh != height)
- buf = PDFImage.resize(buf, mask.bpc, 1, sw, sh, width, height);
- } else if (isArray(mask)) {
- // Color key mask: if any of the compontents are outside the range
- // then they should be painted.
- buf = new Uint8Array(width * height);
- var numComps = this.numComps;
- for (var i = 0, ii = width * height; i < ii; ++i) {
- var opacity = 0;
- var imageOffset = i * numComps;
- for (var j = 0; j < numComps; ++j) {
- var color = image[imageOffset + j];
- var maskOffset = j * 2;
- if (color < mask[maskOffset] || color > mask[maskOffset + 1]) {
- opacity = 255;
- break;
- }
- }
- buf[i] = opacity;
- }
- } else {
- error('Unknown mask format.');
- }
- } else {
- buf = new Uint8Array(width * height);
- for (var i = 0, ii = width * height; i < ii; ++i)
- buf[i] = 255;
- }
- return buf;
- },
- applyStencilMask: function PDFImage_applyStencilMask(buffer,
- inverseDecode) {
- var width = this.width, height = this.height;
- var bitStrideLength = (width + 7) >> 3;
- var imgArray = this.getImageBytes(bitStrideLength * height);
- var imgArrayPos = 0;
- var i, j, mask, buf;
- // removing making non-masked pixels transparent
- var bufferPos = 3; // alpha component offset
- for (i = 0; i < height; i++) {
- mask = 0;
- for (j = 0; j < width; j++) {
- if (!mask) {
- buf = imgArray[imgArrayPos++];
- mask = 128;
- }
- if (!(buf & mask) == inverseDecode) {
- buffer[bufferPos] = 0;
- }
- bufferPos += 4;
- mask >>= 1;
- }
- }
- },
- fillRgbaBuffer: function PDFImage_fillRgbaBuffer(buffer, width, height) {
- var numComps = this.numComps;
- var originalWidth = this.width;
- var originalHeight = this.height;
- var bpc = this.bpc;
-
- // rows start at byte boundary;
- var rowBytes = (originalWidth * numComps * bpc + 7) >> 3;
- var imgArray = this.getImageBytes(originalHeight * rowBytes);
-
- // imgArray can be incomplete (e.g. after CCITT fax encoding)
- var actualHeight = 0 | (imgArray.length / rowBytes *
- height / originalHeight);
-
- var comps = this.colorSpace.getRgbBuffer(
- this.getComponents(imgArray), bpc);
- if (originalWidth != width || originalHeight != height)
- comps = PDFImage.resize(comps, this.bpc, 3, originalWidth,
- originalHeight, width, height);
- var compsPos = 0;
- var opacity = this.getOpacity(width, height, imgArray);
- var opacityPos = 0;
- var length = width * actualHeight * 4;
-
- for (var i = 0; i < length; i += 4) {
- buffer[i] = comps[compsPos++];
- buffer[i + 1] = comps[compsPos++];
- buffer[i + 2] = comps[compsPos++];
- buffer[i + 3] = opacity[opacityPos++];
- }
- },
- fillGrayBuffer: function PDFImage_fillGrayBuffer(buffer) {
- var numComps = this.numComps;
- if (numComps != 1)
- error('Reading gray scale from a color image: ' + numComps);
-
- var width = this.width;
- var height = this.height;
- var bpc = this.bpc;
-
- // rows start at byte boundary;
- var rowBytes = (width * numComps * bpc + 7) >> 3;
- var imgArray = this.getImageBytes(height * rowBytes);
-
- var comps = this.getComponents(imgArray);
- var length = width * height;
- // we aren't using a colorspace so we need to scale the value
- var scale = 255 / ((1 << bpc) - 1);
- for (var i = 0; i < length; ++i)
- buffer[i] = (scale * comps[i]) | 0;
- },
- getImageBytes: function PDFImage_getImageBytes(length) {
- this.image.reset();
- return this.image.getBytes(length);
- }
- };
- return PDFImage;
-})();
-
-function loadJpegStream(id, imageData, objs) {
- var img = new Image();
- img.onload = (function loadJpegStream_onloadClosure() {
- objs.resolve(id, img);
- });
- img.src = 'data:image/jpeg;base64,' + window.btoa(imageData);
-}
-
-
-
-// The Metrics object contains glyph widths (in glyph space units).
-// As per PDF spec, for most fonts (Type 3 being an exception) a glyph
-// space unit corresponds to 1/1000th of text space unit.
-var Metrics = {
- 'Courier': 600,
- 'Courier-Bold': 600,
- 'Courier-BoldOblique': 600,
- 'Courier-Oblique': 600,
- 'Helvetica' : {
- 'space': 278,
- 'exclam': 278,
- 'quotedbl': 355,
- 'numbersign': 556,
- 'dollar': 556,
- 'percent': 889,
- 'ampersand': 667,
- 'quoteright': 222,
- 'parenleft': 333,
- 'parenright': 333,
- 'asterisk': 389,
- 'plus': 584,
- 'comma': 278,
- 'hyphen': 333,
- 'period': 278,
- 'slash': 278,
- 'zero': 556,
- 'one': 556,
- 'two': 556,
- 'three': 556,
- 'four': 556,
- 'five': 556,
- 'six': 556,
- 'seven': 556,
- 'eight': 556,
- 'nine': 556,
- 'colon': 278,
- 'semicolon': 278,
- 'less': 584,
- 'equal': 584,
- 'greater': 584,
- 'question': 556,
- 'at': 1015,
- 'A': 667,
- 'B': 667,
- 'C': 722,
- 'D': 722,
- 'E': 667,
- 'F': 611,
- 'G': 778,
- 'H': 722,
- 'I': 278,
- 'J': 500,
- 'K': 667,
- 'L': 556,
- 'M': 833,
- 'N': 722,
- 'O': 778,
- 'P': 667,
- 'Q': 778,
- 'R': 722,
- 'S': 667,
- 'T': 611,
- 'U': 722,
- 'V': 667,
- 'W': 944,
- 'X': 667,
- 'Y': 667,
- 'Z': 611,
- 'bracketleft': 278,
- 'backslash': 278,
- 'bracketright': 278,
- 'asciicircum': 469,
- 'underscore': 556,
- 'quoteleft': 222,
- 'a': 556,
- 'b': 556,
- 'c': 500,
- 'd': 556,
- 'e': 556,
- 'f': 278,
- 'g': 556,
- 'h': 556,
- 'i': 222,
- 'j': 222,
- 'k': 500,
- 'l': 222,
- 'm': 833,
- 'n': 556,
- 'o': 556,
- 'p': 556,
- 'q': 556,
- 'r': 333,
- 's': 500,
- 't': 278,
- 'u': 556,
- 'v': 500,
- 'w': 722,
- 'x': 500,
- 'y': 500,
- 'z': 500,
- 'braceleft': 334,
- 'bar': 260,
- 'braceright': 334,
- 'asciitilde': 584,
- 'exclamdown': 333,
- 'cent': 556,
- 'sterling': 556,
- 'fraction': 167,
- 'yen': 556,
- 'florin': 556,
- 'section': 556,
- 'currency': 556,
- 'quotesingle': 191,
- 'quotedblleft': 333,
- 'guillemotleft': 556,
- 'guilsinglleft': 333,
- 'guilsinglright': 333,
- 'fi': 500,
- 'fl': 500,
- 'endash': 556,
- 'dagger': 556,
- 'daggerdbl': 556,
- 'periodcentered': 278,
- 'paragraph': 537,
- 'bullet': 350,
- 'quotesinglbase': 222,
- 'quotedblbase': 333,
- 'quotedblright': 333,
- 'guillemotright': 556,
- 'ellipsis': 1000,
- 'perthousand': 1000,
- 'questiondown': 611,
- 'grave': 333,
- 'acute': 333,
- 'circumflex': 333,
- 'tilde': 333,
- 'macron': 333,
- 'breve': 333,
- 'dotaccent': 333,
- 'dieresis': 333,
- 'ring': 333,
- 'cedilla': 333,
- 'hungarumlaut': 333,
- 'ogonek': 333,
- 'caron': 333,
- 'emdash': 1000,
- 'AE': 1000,
- 'ordfeminine': 370,
- 'Lslash': 556,
- 'Oslash': 778,
- 'OE': 1000,
- 'ordmasculine': 365,
- 'ae': 889,
- 'dotlessi': 278,
- 'lslash': 222,
- 'oslash': 611,
- 'oe': 944,
- 'germandbls': 611,
- 'Idieresis': 278,
- 'eacute': 556,
- 'abreve': 556,
- 'uhungarumlaut': 556,
- 'ecaron': 556,
- 'Ydieresis': 667,
- 'divide': 584,
- 'Yacute': 667,
- 'Acircumflex': 667,
- 'aacute': 556,
- 'Ucircumflex': 722,
- 'yacute': 500,
- 'scommaaccent': 500,
- 'ecircumflex': 556,
- 'Uring': 722,
- 'Udieresis': 722,
- 'aogonek': 556,
- 'Uacute': 722,
- 'uogonek': 556,
- 'Edieresis': 667,
- 'Dcroat': 722,
- 'commaaccent': 250,
- 'copyright': 737,
- 'Emacron': 667,
- 'ccaron': 500,
- 'aring': 556,
- 'Ncommaaccent': 722,
- 'lacute': 222,
- 'agrave': 556,
- 'Tcommaaccent': 611,
- 'Cacute': 722,
- 'atilde': 556,
- 'Edotaccent': 667,
- 'scaron': 500,
- 'scedilla': 500,
- 'iacute': 278,
- 'lozenge': 471,
- 'Rcaron': 722,
- 'Gcommaaccent': 778,
- 'ucircumflex': 556,
- 'acircumflex': 556,
- 'Amacron': 667,
- 'rcaron': 333,
- 'ccedilla': 500,
- 'Zdotaccent': 611,
- 'Thorn': 667,
- 'Omacron': 778,
- 'Racute': 722,
- 'Sacute': 667,
- 'dcaron': 643,
- 'Umacron': 722,
- 'uring': 556,
- 'threesuperior': 333,
- 'Ograve': 778,
- 'Agrave': 667,
- 'Abreve': 667,
- 'multiply': 584,
- 'uacute': 556,
- 'Tcaron': 611,
- 'partialdiff': 476,
- 'ydieresis': 500,
- 'Nacute': 722,
- 'icircumflex': 278,
- 'Ecircumflex': 667,
- 'adieresis': 556,
- 'edieresis': 556,
- 'cacute': 500,
- 'nacute': 556,
- 'umacron': 556,
- 'Ncaron': 722,
- 'Iacute': 278,
- 'plusminus': 584,
- 'brokenbar': 260,
- 'registered': 737,
- 'Gbreve': 778,
- 'Idotaccent': 278,
- 'summation': 600,
- 'Egrave': 667,
- 'racute': 333,
- 'omacron': 556,
- 'Zacute': 611,
- 'Zcaron': 611,
- 'greaterequal': 549,
- 'Eth': 722,
- 'Ccedilla': 722,
- 'lcommaaccent': 222,
- 'tcaron': 317,
- 'eogonek': 556,
- 'Uogonek': 722,
- 'Aacute': 667,
- 'Adieresis': 667,
- 'egrave': 556,
- 'zacute': 500,
- 'iogonek': 222,
- 'Oacute': 778,
- 'oacute': 556,
- 'amacron': 556,
- 'sacute': 500,
- 'idieresis': 278,
- 'Ocircumflex': 778,
- 'Ugrave': 722,
- 'Delta': 612,
- 'thorn': 556,
- 'twosuperior': 333,
- 'Odieresis': 778,
- 'mu': 556,
- 'igrave': 278,
- 'ohungarumlaut': 556,
- 'Eogonek': 667,
- 'dcroat': 556,
- 'threequarters': 834,
- 'Scedilla': 667,
- 'lcaron': 299,
- 'Kcommaaccent': 667,
- 'Lacute': 556,
- 'trademark': 1000,
- 'edotaccent': 556,
- 'Igrave': 278,
- 'Imacron': 278,
- 'Lcaron': 556,
- 'onehalf': 834,
- 'lessequal': 549,
- 'ocircumflex': 556,
- 'ntilde': 556,
- 'Uhungarumlaut': 722,
- 'Eacute': 667,
- 'emacron': 556,
- 'gbreve': 556,
- 'onequarter': 834,
- 'Scaron': 667,
- 'Scommaaccent': 667,
- 'Ohungarumlaut': 778,
- 'degree': 400,
- 'ograve': 556,
- 'Ccaron': 722,
- 'ugrave': 556,
- 'radical': 453,
- 'Dcaron': 722,
- 'rcommaaccent': 333,
- 'Ntilde': 722,
- 'otilde': 556,
- 'Rcommaaccent': 722,
- 'Lcommaaccent': 556,
- 'Atilde': 667,
- 'Aogonek': 667,
- 'Aring': 667,
- 'Otilde': 778,
- 'zdotaccent': 500,
- 'Ecaron': 667,
- 'Iogonek': 278,
- 'kcommaaccent': 500,
- 'minus': 584,
- 'Icircumflex': 278,
- 'ncaron': 556,
- 'tcommaaccent': 278,
- 'logicalnot': 584,
- 'odieresis': 556,
- 'udieresis': 556,
- 'notequal': 549,
- 'gcommaaccent': 556,
- 'eth': 556,
- 'zcaron': 500,
- 'ncommaaccent': 556,
- 'onesuperior': 333,
- 'imacron': 278,
- 'Euro': 556
- },
- 'Helvetica-Bold': {
- 'space': 278,
- 'exclam': 333,
- 'quotedbl': 474,
- 'numbersign': 556,
- 'dollar': 556,
- 'percent': 889,
- 'ampersand': 722,
- 'quoteright': 278,
- 'parenleft': 333,
- 'parenright': 333,
- 'asterisk': 389,
- 'plus': 584,
- 'comma': 278,
- 'hyphen': 333,
- 'period': 278,
- 'slash': 278,
- 'zero': 556,
- 'one': 556,
- 'two': 556,
- 'three': 556,
- 'four': 556,
- 'five': 556,
- 'six': 556,
- 'seven': 556,
- 'eight': 556,
- 'nine': 556,
- 'colon': 333,
- 'semicolon': 333,
- 'less': 584,
- 'equal': 584,
- 'greater': 584,
- 'question': 611,
- 'at': 975,
- 'A': 722,
- 'B': 722,
- 'C': 722,
- 'D': 722,
- 'E': 667,
- 'F': 611,
- 'G': 778,
- 'H': 722,
- 'I': 278,
- 'J': 556,
- 'K': 722,
- 'L': 611,
- 'M': 833,
- 'N': 722,
- 'O': 778,
- 'P': 667,
- 'Q': 778,
- 'R': 722,
- 'S': 667,
- 'T': 611,
- 'U': 722,
- 'V': 667,
- 'W': 944,
- 'X': 667,
- 'Y': 667,
- 'Z': 611,
- 'bracketleft': 333,
- 'backslash': 278,
- 'bracketright': 333,
- 'asciicircum': 584,
- 'underscore': 556,
- 'quoteleft': 278,
- 'a': 556,
- 'b': 611,
- 'c': 556,
- 'd': 611,
- 'e': 556,
- 'f': 333,
- 'g': 611,
- 'h': 611,
- 'i': 278,
- 'j': 278,
- 'k': 556,
- 'l': 278,
- 'm': 889,
- 'n': 611,
- 'o': 611,
- 'p': 611,
- 'q': 611,
- 'r': 389,
- 's': 556,
- 't': 333,
- 'u': 611,
- 'v': 556,
- 'w': 778,
- 'x': 556,
- 'y': 556,
- 'z': 500,
- 'braceleft': 389,
- 'bar': 280,
- 'braceright': 389,
- 'asciitilde': 584,
- 'exclamdown': 333,
- 'cent': 556,
- 'sterling': 556,
- 'fraction': 167,
- 'yen': 556,
- 'florin': 556,
- 'section': 556,
- 'currency': 556,
- 'quotesingle': 238,
- 'quotedblleft': 500,
- 'guillemotleft': 556,
- 'guilsinglleft': 333,
- 'guilsinglright': 333,
- 'fi': 611,
- 'fl': 611,
- 'endash': 556,
- 'dagger': 556,
- 'daggerdbl': 556,
- 'periodcentered': 278,
- 'paragraph': 556,
- 'bullet': 350,
- 'quotesinglbase': 278,
- 'quotedblbase': 500,
- 'quotedblright': 500,
- 'guillemotright': 556,
- 'ellipsis': 1000,
- 'perthousand': 1000,
- 'questiondown': 611,
- 'grave': 333,
- 'acute': 333,
- 'circumflex': 333,
- 'tilde': 333,
- 'macron': 333,
- 'breve': 333,
- 'dotaccent': 333,
- 'dieresis': 333,
- 'ring': 333,
- 'cedilla': 333,
- 'hungarumlaut': 333,
- 'ogonek': 333,
- 'caron': 333,
- 'emdash': 1000,
- 'AE': 1000,
- 'ordfeminine': 370,
- 'Lslash': 611,
- 'Oslash': 778,
- 'OE': 1000,
- 'ordmasculine': 365,
- 'ae': 889,
- 'dotlessi': 278,
- 'lslash': 278,
- 'oslash': 611,
- 'oe': 944,
- 'germandbls': 611,
- 'Idieresis': 278,
- 'eacute': 556,
- 'abreve': 556,
- 'uhungarumlaut': 611,
- 'ecaron': 556,
- 'Ydieresis': 667,
- 'divide': 584,
- 'Yacute': 667,
- 'Acircumflex': 722,
- 'aacute': 556,
- 'Ucircumflex': 722,
- 'yacute': 556,
- 'scommaaccent': 556,
- 'ecircumflex': 556,
- 'Uring': 722,
- 'Udieresis': 722,
- 'aogonek': 556,
- 'Uacute': 722,
- 'uogonek': 611,
- 'Edieresis': 667,
- 'Dcroat': 722,
- 'commaaccent': 250,
- 'copyright': 737,
- 'Emacron': 667,
- 'ccaron': 556,
- 'aring': 556,
- 'Ncommaaccent': 722,
- 'lacute': 278,
- 'agrave': 556,
- 'Tcommaaccent': 611,
- 'Cacute': 722,
- 'atilde': 556,
- 'Edotaccent': 667,
- 'scaron': 556,
- 'scedilla': 556,
- 'iacute': 278,
- 'lozenge': 494,
- 'Rcaron': 722,
- 'Gcommaaccent': 778,
- 'ucircumflex': 611,
- 'acircumflex': 556,
- 'Amacron': 722,
- 'rcaron': 389,
- 'ccedilla': 556,
- 'Zdotaccent': 611,
- 'Thorn': 667,
- 'Omacron': 778,
- 'Racute': 722,
- 'Sacute': 667,
- 'dcaron': 743,
- 'Umacron': 722,
- 'uring': 611,
- 'threesuperior': 333,
- 'Ograve': 778,
- 'Agrave': 722,
- 'Abreve': 722,
- 'multiply': 584,
- 'uacute': 611,
- 'Tcaron': 611,
- 'partialdiff': 494,
- 'ydieresis': 556,
- 'Nacute': 722,
- 'icircumflex': 278,
- 'Ecircumflex': 667,
- 'adieresis': 556,
- 'edieresis': 556,
- 'cacute': 556,
- 'nacute': 611,
- 'umacron': 611,
- 'Ncaron': 722,
- 'Iacute': 278,
- 'plusminus': 584,
- 'brokenbar': 280,
- 'registered': 737,
- 'Gbreve': 778,
- 'Idotaccent': 278,
- 'summation': 600,
- 'Egrave': 667,
- 'racute': 389,
- 'omacron': 611,
- 'Zacute': 611,
- 'Zcaron': 611,
- 'greaterequal': 549,
- 'Eth': 722,
- 'Ccedilla': 722,
- 'lcommaaccent': 278,
- 'tcaron': 389,
- 'eogonek': 556,
- 'Uogonek': 722,
- 'Aacute': 722,
- 'Adieresis': 722,
- 'egrave': 556,
- 'zacute': 500,
- 'iogonek': 278,
- 'Oacute': 778,
- 'oacute': 611,
- 'amacron': 556,
- 'sacute': 556,
- 'idieresis': 278,
- 'Ocircumflex': 778,
- 'Ugrave': 722,
- 'Delta': 612,
- 'thorn': 611,
- 'twosuperior': 333,
- 'Odieresis': 778,
- 'mu': 611,
- 'igrave': 278,
- 'ohungarumlaut': 611,
- 'Eogonek': 667,
- 'dcroat': 611,
- 'threequarters': 834,
- 'Scedilla': 667,
- 'lcaron': 400,
- 'Kcommaaccent': 722,
- 'Lacute': 611,
- 'trademark': 1000,
- 'edotaccent': 556,
- 'Igrave': 278,
- 'Imacron': 278,
- 'Lcaron': 611,
- 'onehalf': 834,
- 'lessequal': 549,
- 'ocircumflex': 611,
- 'ntilde': 611,
- 'Uhungarumlaut': 722,
- 'Eacute': 667,
- 'emacron': 556,
- 'gbreve': 611,
- 'onequarter': 834,
- 'Scaron': 667,
- 'Scommaaccent': 667,
- 'Ohungarumlaut': 778,
- 'degree': 400,
- 'ograve': 611,
- 'Ccaron': 722,
- 'ugrave': 611,
- 'radical': 549,
- 'Dcaron': 722,
- 'rcommaaccent': 389,
- 'Ntilde': 722,
- 'otilde': 611,
- 'Rcommaaccent': 722,
- 'Lcommaaccent': 611,
- 'Atilde': 722,
- 'Aogonek': 722,
- 'Aring': 722,
- 'Otilde': 778,
- 'zdotaccent': 500,
- 'Ecaron': 667,
- 'Iogonek': 278,
- 'kcommaaccent': 556,
- 'minus': 584,
- 'Icircumflex': 278,
- 'ncaron': 611,
- 'tcommaaccent': 333,
- 'logicalnot': 584,
- 'odieresis': 611,
- 'udieresis': 611,
- 'notequal': 549,
- 'gcommaaccent': 611,
- 'eth': 611,
- 'zcaron': 500,
- 'ncommaaccent': 611,
- 'onesuperior': 333,
- 'imacron': 278,
- 'Euro': 556
- },
- 'Helvetica-BoldOblique': {
- 'space': 278,
- 'exclam': 333,
- 'quotedbl': 474,
- 'numbersign': 556,
- 'dollar': 556,
- 'percent': 889,
- 'ampersand': 722,
- 'quoteright': 278,
- 'parenleft': 333,
- 'parenright': 333,
- 'asterisk': 389,
- 'plus': 584,
- 'comma': 278,
- 'hyphen': 333,
- 'period': 278,
- 'slash': 278,
- 'zero': 556,
- 'one': 556,
- 'two': 556,
- 'three': 556,
- 'four': 556,
- 'five': 556,
- 'six': 556,
- 'seven': 556,
- 'eight': 556,
- 'nine': 556,
- 'colon': 333,
- 'semicolon': 333,
- 'less': 584,
- 'equal': 584,
- 'greater': 584,
- 'question': 611,
- 'at': 975,
- 'A': 722,
- 'B': 722,
- 'C': 722,
- 'D': 722,
- 'E': 667,
- 'F': 611,
- 'G': 778,
- 'H': 722,
- 'I': 278,
- 'J': 556,
- 'K': 722,
- 'L': 611,
- 'M': 833,
- 'N': 722,
- 'O': 778,
- 'P': 667,
- 'Q': 778,
- 'R': 722,
- 'S': 667,
- 'T': 611,
- 'U': 722,
- 'V': 667,
- 'W': 944,
- 'X': 667,
- 'Y': 667,
- 'Z': 611,
- 'bracketleft': 333,
- 'backslash': 278,
- 'bracketright': 333,
- 'asciicircum': 584,
- 'underscore': 556,
- 'quoteleft': 278,
- 'a': 556,
- 'b': 611,
- 'c': 556,
- 'd': 611,
- 'e': 556,
- 'f': 333,
- 'g': 611,
- 'h': 611,
- 'i': 278,
- 'j': 278,
- 'k': 556,
- 'l': 278,
- 'm': 889,
- 'n': 611,
- 'o': 611,
- 'p': 611,
- 'q': 611,
- 'r': 389,
- 's': 556,
- 't': 333,
- 'u': 611,
- 'v': 556,
- 'w': 778,
- 'x': 556,
- 'y': 556,
- 'z': 500,
- 'braceleft': 389,
- 'bar': 280,
- 'braceright': 389,
- 'asciitilde': 584,
- 'exclamdown': 333,
- 'cent': 556,
- 'sterling': 556,
- 'fraction': 167,
- 'yen': 556,
- 'florin': 556,
- 'section': 556,
- 'currency': 556,
- 'quotesingle': 238,
- 'quotedblleft': 500,
- 'guillemotleft': 556,
- 'guilsinglleft': 333,
- 'guilsinglright': 333,
- 'fi': 611,
- 'fl': 611,
- 'endash': 556,
- 'dagger': 556,
- 'daggerdbl': 556,
- 'periodcentered': 278,
- 'paragraph': 556,
- 'bullet': 350,
- 'quotesinglbase': 278,
- 'quotedblbase': 500,
- 'quotedblright': 500,
- 'guillemotright': 556,
- 'ellipsis': 1000,
- 'perthousand': 1000,
- 'questiondown': 611,
- 'grave': 333,
- 'acute': 333,
- 'circumflex': 333,
- 'tilde': 333,
- 'macron': 333,
- 'breve': 333,
- 'dotaccent': 333,
- 'dieresis': 333,
- 'ring': 333,
- 'cedilla': 333,
- 'hungarumlaut': 333,
- 'ogonek': 333,
- 'caron': 333,
- 'emdash': 1000,
- 'AE': 1000,
- 'ordfeminine': 370,
- 'Lslash': 611,
- 'Oslash': 778,
- 'OE': 1000,
- 'ordmasculine': 365,
- 'ae': 889,
- 'dotlessi': 278,
- 'lslash': 278,
- 'oslash': 611,
- 'oe': 944,
- 'germandbls': 611,
- 'Idieresis': 278,
- 'eacute': 556,
- 'abreve': 556,
- 'uhungarumlaut': 611,
- 'ecaron': 556,
- 'Ydieresis': 667,
- 'divide': 584,
- 'Yacute': 667,
- 'Acircumflex': 722,
- 'aacute': 556,
- 'Ucircumflex': 722,
- 'yacute': 556,
- 'scommaaccent': 556,
- 'ecircumflex': 556,
- 'Uring': 722,
- 'Udieresis': 722,
- 'aogonek': 556,
- 'Uacute': 722,
- 'uogonek': 611,
- 'Edieresis': 667,
- 'Dcroat': 722,
- 'commaaccent': 250,
- 'copyright': 737,
- 'Emacron': 667,
- 'ccaron': 556,
- 'aring': 556,
- 'Ncommaaccent': 722,
- 'lacute': 278,
- 'agrave': 556,
- 'Tcommaaccent': 611,
- 'Cacute': 722,
- 'atilde': 556,
- 'Edotaccent': 667,
- 'scaron': 556,
- 'scedilla': 556,
- 'iacute': 278,
- 'lozenge': 494,
- 'Rcaron': 722,
- 'Gcommaaccent': 778,
- 'ucircumflex': 611,
- 'acircumflex': 556,
- 'Amacron': 722,
- 'rcaron': 389,
- 'ccedilla': 556,
- 'Zdotaccent': 611,
- 'Thorn': 667,
- 'Omacron': 778,
- 'Racute': 722,
- 'Sacute': 667,
- 'dcaron': 743,
- 'Umacron': 722,
- 'uring': 611,
- 'threesuperior': 333,
- 'Ograve': 778,
- 'Agrave': 722,
- 'Abreve': 722,
- 'multiply': 584,
- 'uacute': 611,
- 'Tcaron': 611,
- 'partialdiff': 494,
- 'ydieresis': 556,
- 'Nacute': 722,
- 'icircumflex': 278,
- 'Ecircumflex': 667,
- 'adieresis': 556,
- 'edieresis': 556,
- 'cacute': 556,
- 'nacute': 611,
- 'umacron': 611,
- 'Ncaron': 722,
- 'Iacute': 278,
- 'plusminus': 584,
- 'brokenbar': 280,
- 'registered': 737,
- 'Gbreve': 778,
- 'Idotaccent': 278,
- 'summation': 600,
- 'Egrave': 667,
- 'racute': 389,
- 'omacron': 611,
- 'Zacute': 611,
- 'Zcaron': 611,
- 'greaterequal': 549,
- 'Eth': 722,
- 'Ccedilla': 722,
- 'lcommaaccent': 278,
- 'tcaron': 389,
- 'eogonek': 556,
- 'Uogonek': 722,
- 'Aacute': 722,
- 'Adieresis': 722,
- 'egrave': 556,
- 'zacute': 500,
- 'iogonek': 278,
- 'Oacute': 778,
- 'oacute': 611,
- 'amacron': 556,
- 'sacute': 556,
- 'idieresis': 278,
- 'Ocircumflex': 778,
- 'Ugrave': 722,
- 'Delta': 612,
- 'thorn': 611,
- 'twosuperior': 333,
- 'Odieresis': 778,
- 'mu': 611,
- 'igrave': 278,
- 'ohungarumlaut': 611,
- 'Eogonek': 667,
- 'dcroat': 611,
- 'threequarters': 834,
- 'Scedilla': 667,
- 'lcaron': 400,
- 'Kcommaaccent': 722,
- 'Lacute': 611,
- 'trademark': 1000,
- 'edotaccent': 556,
- 'Igrave': 278,
- 'Imacron': 278,
- 'Lcaron': 611,
- 'onehalf': 834,
- 'lessequal': 549,
- 'ocircumflex': 611,
- 'ntilde': 611,
- 'Uhungarumlaut': 722,
- 'Eacute': 667,
- 'emacron': 556,
- 'gbreve': 611,
- 'onequarter': 834,
- 'Scaron': 667,
- 'Scommaaccent': 667,
- 'Ohungarumlaut': 778,
- 'degree': 400,
- 'ograve': 611,
- 'Ccaron': 722,
- 'ugrave': 611,
- 'radical': 549,
- 'Dcaron': 722,
- 'rcommaaccent': 389,
- 'Ntilde': 722,
- 'otilde': 611,
- 'Rcommaaccent': 722,
- 'Lcommaaccent': 611,
- 'Atilde': 722,
- 'Aogonek': 722,
- 'Aring': 722,
- 'Otilde': 778,
- 'zdotaccent': 500,
- 'Ecaron': 667,
- 'Iogonek': 278,
- 'kcommaaccent': 556,
- 'minus': 584,
- 'Icircumflex': 278,
- 'ncaron': 611,
- 'tcommaaccent': 333,
- 'logicalnot': 584,
- 'odieresis': 611,
- 'udieresis': 611,
- 'notequal': 549,
- 'gcommaaccent': 611,
- 'eth': 611,
- 'zcaron': 500,
- 'ncommaaccent': 611,
- 'onesuperior': 333,
- 'imacron': 278,
- 'Euro': 556
- },
- 'Helvetica-Oblique' : {
- 'space': 278,
- 'exclam': 278,
- 'quotedbl': 355,
- 'numbersign': 556,
- 'dollar': 556,
- 'percent': 889,
- 'ampersand': 667,
- 'quoteright': 222,
- 'parenleft': 333,
- 'parenright': 333,
- 'asterisk': 389,
- 'plus': 584,
- 'comma': 278,
- 'hyphen': 333,
- 'period': 278,
- 'slash': 278,
- 'zero': 556,
- 'one': 556,
- 'two': 556,
- 'three': 556,
- 'four': 556,
- 'five': 556,
- 'six': 556,
- 'seven': 556,
- 'eight': 556,
- 'nine': 556,
- 'colon': 278,
- 'semicolon': 278,
- 'less': 584,
- 'equal': 584,
- 'greater': 584,
- 'question': 556,
- 'at': 1015,
- 'A': 667,
- 'B': 667,
- 'C': 722,
- 'D': 722,
- 'E': 667,
- 'F': 611,
- 'G': 778,
- 'H': 722,
- 'I': 278,
- 'J': 500,
- 'K': 667,
- 'L': 556,
- 'M': 833,
- 'N': 722,
- 'O': 778,
- 'P': 667,
- 'Q': 778,
- 'R': 722,
- 'S': 667,
- 'T': 611,
- 'U': 722,
- 'V': 667,
- 'W': 944,
- 'X': 667,
- 'Y': 667,
- 'Z': 611,
- 'bracketleft': 278,
- 'backslash': 278,
- 'bracketright': 278,
- 'asciicircum': 469,
- 'underscore': 556,
- 'quoteleft': 222,
- 'a': 556,
- 'b': 556,
- 'c': 500,
- 'd': 556,
- 'e': 556,
- 'f': 278,
- 'g': 556,
- 'h': 556,
- 'i': 222,
- 'j': 222,
- 'k': 500,
- 'l': 222,
- 'm': 833,
- 'n': 556,
- 'o': 556,
- 'p': 556,
- 'q': 556,
- 'r': 333,
- 's': 500,
- 't': 278,
- 'u': 556,
- 'v': 500,
- 'w': 722,
- 'x': 500,
- 'y': 500,
- 'z': 500,
- 'braceleft': 334,
- 'bar': 260,
- 'braceright': 334,
- 'asciitilde': 584,
- 'exclamdown': 333,
- 'cent': 556,
- 'sterling': 556,
- 'fraction': 167,
- 'yen': 556,
- 'florin': 556,
- 'section': 556,
- 'currency': 556,
- 'quotesingle': 191,
- 'quotedblleft': 333,
- 'guillemotleft': 556,
- 'guilsinglleft': 333,
- 'guilsinglright': 333,
- 'fi': 500,
- 'fl': 500,
- 'endash': 556,
- 'dagger': 556,
- 'daggerdbl': 556,
- 'periodcentered': 278,
- 'paragraph': 537,
- 'bullet': 350,
- 'quotesinglbase': 222,
- 'quotedblbase': 333,
- 'quotedblright': 333,
- 'guillemotright': 556,
- 'ellipsis': 1000,
- 'perthousand': 1000,
- 'questiondown': 611,
- 'grave': 333,
- 'acute': 333,
- 'circumflex': 333,
- 'tilde': 333,
- 'macron': 333,
- 'breve': 333,
- 'dotaccent': 333,
- 'dieresis': 333,
- 'ring': 333,
- 'cedilla': 333,
- 'hungarumlaut': 333,
- 'ogonek': 333,
- 'caron': 333,
- 'emdash': 1000,
- 'AE': 1000,
- 'ordfeminine': 370,
- 'Lslash': 556,
- 'Oslash': 778,
- 'OE': 1000,
- 'ordmasculine': 365,
- 'ae': 889,
- 'dotlessi': 278,
- 'lslash': 222,
- 'oslash': 611,
- 'oe': 944,
- 'germandbls': 611,
- 'Idieresis': 278,
- 'eacute': 556,
- 'abreve': 556,
- 'uhungarumlaut': 556,
- 'ecaron': 556,
- 'Ydieresis': 667,
- 'divide': 584,
- 'Yacute': 667,
- 'Acircumflex': 667,
- 'aacute': 556,
- 'Ucircumflex': 722,
- 'yacute': 500,
- 'scommaaccent': 500,
- 'ecircumflex': 556,
- 'Uring': 722,
- 'Udieresis': 722,
- 'aogonek': 556,
- 'Uacute': 722,
- 'uogonek': 556,
- 'Edieresis': 667,
- 'Dcroat': 722,
- 'commaaccent': 250,
- 'copyright': 737,
- 'Emacron': 667,
- 'ccaron': 500,
- 'aring': 556,
- 'Ncommaaccent': 722,
- 'lacute': 222,
- 'agrave': 556,
- 'Tcommaaccent': 611,
- 'Cacute': 722,
- 'atilde': 556,
- 'Edotaccent': 667,
- 'scaron': 500,
- 'scedilla': 500,
- 'iacute': 278,
- 'lozenge': 471,
- 'Rcaron': 722,
- 'Gcommaaccent': 778,
- 'ucircumflex': 556,
- 'acircumflex': 556,
- 'Amacron': 667,
- 'rcaron': 333,
- 'ccedilla': 500,
- 'Zdotaccent': 611,
- 'Thorn': 667,
- 'Omacron': 778,
- 'Racute': 722,
- 'Sacute': 667,
- 'dcaron': 643,
- 'Umacron': 722,
- 'uring': 556,
- 'threesuperior': 333,
- 'Ograve': 778,
- 'Agrave': 667,
- 'Abreve': 667,
- 'multiply': 584,
- 'uacute': 556,
- 'Tcaron': 611,
- 'partialdiff': 476,
- 'ydieresis': 500,
- 'Nacute': 722,
- 'icircumflex': 278,
- 'Ecircumflex': 667,
- 'adieresis': 556,
- 'edieresis': 556,
- 'cacute': 500,
- 'nacute': 556,
- 'umacron': 556,
- 'Ncaron': 722,
- 'Iacute': 278,
- 'plusminus': 584,
- 'brokenbar': 260,
- 'registered': 737,
- 'Gbreve': 778,
- 'Idotaccent': 278,
- 'summation': 600,
- 'Egrave': 667,
- 'racute': 333,
- 'omacron': 556,
- 'Zacute': 611,
- 'Zcaron': 611,
- 'greaterequal': 549,
- 'Eth': 722,
- 'Ccedilla': 722,
- 'lcommaaccent': 222,
- 'tcaron': 317,
- 'eogonek': 556,
- 'Uogonek': 722,
- 'Aacute': 667,
- 'Adieresis': 667,
- 'egrave': 556,
- 'zacute': 500,
- 'iogonek': 222,
- 'Oacute': 778,
- 'oacute': 556,
- 'amacron': 556,
- 'sacute': 500,
- 'idieresis': 278,
- 'Ocircumflex': 778,
- 'Ugrave': 722,
- 'Delta': 612,
- 'thorn': 556,
- 'twosuperior': 333,
- 'Odieresis': 778,
- 'mu': 556,
- 'igrave': 278,
- 'ohungarumlaut': 556,
- 'Eogonek': 667,
- 'dcroat': 556,
- 'threequarters': 834,
- 'Scedilla': 667,
- 'lcaron': 299,
- 'Kcommaaccent': 667,
- 'Lacute': 556,
- 'trademark': 1000,
- 'edotaccent': 556,
- 'Igrave': 278,
- 'Imacron': 278,
- 'Lcaron': 556,
- 'onehalf': 834,
- 'lessequal': 549,
- 'ocircumflex': 556,
- 'ntilde': 556,
- 'Uhungarumlaut': 722,
- 'Eacute': 667,
- 'emacron': 556,
- 'gbreve': 556,
- 'onequarter': 834,
- 'Scaron': 667,
- 'Scommaaccent': 667,
- 'Ohungarumlaut': 778,
- 'degree': 400,
- 'ograve': 556,
- 'Ccaron': 722,
- 'ugrave': 556,
- 'radical': 453,
- 'Dcaron': 722,
- 'rcommaaccent': 333,
- 'Ntilde': 722,
- 'otilde': 556,
- 'Rcommaaccent': 722,
- 'Lcommaaccent': 556,
- 'Atilde': 667,
- 'Aogonek': 667,
- 'Aring': 667,
- 'Otilde': 778,
- 'zdotaccent': 500,
- 'Ecaron': 667,
- 'Iogonek': 278,
- 'kcommaaccent': 500,
- 'minus': 584,
- 'Icircumflex': 278,
- 'ncaron': 556,
- 'tcommaaccent': 278,
- 'logicalnot': 584,
- 'odieresis': 556,
- 'udieresis': 556,
- 'notequal': 549,
- 'gcommaaccent': 556,
- 'eth': 556,
- 'zcaron': 500,
- 'ncommaaccent': 556,
- 'onesuperior': 333,
- 'imacron': 278,
- 'Euro': 556
- },
- 'Symbol': {
- 'space': 250,
- 'exclam': 333,
- 'universal': 713,
- 'numbersign': 500,
- 'existential': 549,
- 'percent': 833,
- 'ampersand': 778,
- 'suchthat': 439,
- 'parenleft': 333,
- 'parenright': 333,
- 'asteriskmath': 500,
- 'plus': 549,
- 'comma': 250,
- 'minus': 549,
- 'period': 250,
- 'slash': 278,
- 'zero': 500,
- 'one': 500,
- 'two': 500,
- 'three': 500,
- 'four': 500,
- 'five': 500,
- 'six': 500,
- 'seven': 500,
- 'eight': 500,
- 'nine': 500,
- 'colon': 278,
- 'semicolon': 278,
- 'less': 549,
- 'equal': 549,
- 'greater': 549,
- 'question': 444,
- 'congruent': 549,
- 'Alpha': 722,
- 'Beta': 667,
- 'Chi': 722,
- 'Delta': 612,
- 'Epsilon': 611,
- 'Phi': 763,
- 'Gamma': 603,
- 'Eta': 722,
- 'Iota': 333,
- 'theta1': 631,
- 'Kappa': 722,
- 'Lambda': 686,
- 'Mu': 889,
- 'Nu': 722,
- 'Omicron': 722,
- 'Pi': 768,
- 'Theta': 741,
- 'Rho': 556,
- 'Sigma': 592,
- 'Tau': 611,
- 'Upsilon': 690,
- 'sigma1': 439,
- 'Omega': 768,
- 'Xi': 645,
- 'Psi': 795,
- 'Zeta': 611,
- 'bracketleft': 333,
- 'therefore': 863,
- 'bracketright': 333,
- 'perpendicular': 658,
- 'underscore': 500,
- 'radicalex': 500,
- 'alpha': 631,
- 'beta': 549,
- 'chi': 549,
- 'delta': 494,
- 'epsilon': 439,
- 'phi': 521,
- 'gamma': 411,
- 'eta': 603,
- 'iota': 329,
- 'phi1': 603,
- 'kappa': 549,
- 'lambda': 549,
- 'mu': 576,
- 'nu': 521,
- 'omicron': 549,
- 'pi': 549,
- 'theta': 521,
- 'rho': 549,
- 'sigma': 603,
- 'tau': 439,
- 'upsilon': 576,
- 'omega1': 713,
- 'omega': 686,
- 'xi': 493,
- 'psi': 686,
- 'zeta': 494,
- 'braceleft': 480,
- 'bar': 200,
- 'braceright': 480,
- 'similar': 549,
- 'Euro': 750,
- 'Upsilon1': 620,
- 'minute': 247,
- 'lessequal': 549,
- 'fraction': 167,
- 'infinity': 713,
- 'florin': 500,
- 'club': 753,
- 'diamond': 753,
- 'heart': 753,
- 'spade': 753,
- 'arrowboth': 1042,
- 'arrowleft': 987,
- 'arrowup': 603,
- 'arrowright': 987,
- 'arrowdown': 603,
- 'degree': 400,
- 'plusminus': 549,
- 'second': 411,
- 'greaterequal': 549,
- 'multiply': 549,
- 'proportional': 713,
- 'partialdiff': 494,
- 'bullet': 460,
- 'divide': 549,
- 'notequal': 549,
- 'equivalence': 549,
- 'approxequal': 549,
- 'ellipsis': 1000,
- 'arrowvertex': 603,
- 'arrowhorizex': 1000,
- 'carriagereturn': 658,
- 'aleph': 823,
- 'Ifraktur': 686,
- 'Rfraktur': 795,
- 'weierstrass': 987,
- 'circlemultiply': 768,
- 'circleplus': 768,
- 'emptyset': 823,
- 'intersection': 768,
- 'union': 768,
- 'propersuperset': 713,
- 'reflexsuperset': 713,
- 'notsubset': 713,
- 'propersubset': 713,
- 'reflexsubset': 713,
- 'element': 713,
- 'notelement': 713,
- 'angle': 768,
- 'gradient': 713,
- 'registerserif': 790,
- 'copyrightserif': 790,
- 'trademarkserif': 890,
- 'product': 823,
- 'radical': 549,
- 'dotmath': 250,
- 'logicalnot': 713,
- 'logicaland': 603,
- 'logicalor': 603,
- 'arrowdblboth': 1042,
- 'arrowdblleft': 987,
- 'arrowdblup': 603,
- 'arrowdblright': 987,
- 'arrowdbldown': 603,
- 'lozenge': 494,
- 'angleleft': 329,
- 'registersans': 790,
- 'copyrightsans': 790,
- 'trademarksans': 786,
- 'summation': 713,
- 'parenlefttp': 384,
- 'parenleftex': 384,
- 'parenleftbt': 384,
- 'bracketlefttp': 384,
- 'bracketleftex': 384,
- 'bracketleftbt': 384,
- 'bracelefttp': 494,
- 'braceleftmid': 494,
- 'braceleftbt': 494,
- 'braceex': 494,
- 'angleright': 329,
- 'integral': 274,
- 'integraltp': 686,
- 'integralex': 686,
- 'integralbt': 686,
- 'parenrighttp': 384,
- 'parenrightex': 384,
- 'parenrightbt': 384,
- 'bracketrighttp': 384,
- 'bracketrightex': 384,
- 'bracketrightbt': 384,
- 'bracerighttp': 494,
- 'bracerightmid': 494,
- 'bracerightbt': 494,
- 'apple': 790
- },
- 'Times-Roman': {
- 'space': 250,
- 'exclam': 333,
- 'quotedbl': 408,
- 'numbersign': 500,
- 'dollar': 500,
- 'percent': 833,
- 'ampersand': 778,
- 'quoteright': 333,
- 'parenleft': 333,
- 'parenright': 333,
- 'asterisk': 500,
- 'plus': 564,
- 'comma': 250,
- 'hyphen': 333,
- 'period': 250,
- 'slash': 278,
- 'zero': 500,
- 'one': 500,
- 'two': 500,
- 'three': 500,
- 'four': 500,
- 'five': 500,
- 'six': 500,
- 'seven': 500,
- 'eight': 500,
- 'nine': 500,
- 'colon': 278,
- 'semicolon': 278,
- 'less': 564,
- 'equal': 564,
- 'greater': 564,
- 'question': 444,
- 'at': 921,
- 'A': 722,
- 'B': 667,
- 'C': 667,
- 'D': 722,
- 'E': 611,
- 'F': 556,
- 'G': 722,
- 'H': 722,
- 'I': 333,
- 'J': 389,
- 'K': 722,
- 'L': 611,
- 'M': 889,
- 'N': 722,
- 'O': 722,
- 'P': 556,
- 'Q': 722,
- 'R': 667,
- 'S': 556,
- 'T': 611,
- 'U': 722,
- 'V': 722,
- 'W': 944,
- 'X': 722,
- 'Y': 722,
- 'Z': 611,
- 'bracketleft': 333,
- 'backslash': 278,
- 'bracketright': 333,
- 'asciicircum': 469,
- 'underscore': 500,
- 'quoteleft': 333,
- 'a': 444,
- 'b': 500,
- 'c': 444,
- 'd': 500,
- 'e': 444,
- 'f': 333,
- 'g': 500,
- 'h': 500,
- 'i': 278,
- 'j': 278,
- 'k': 500,
- 'l': 278,
- 'm': 778,
- 'n': 500,
- 'o': 500,
- 'p': 500,
- 'q': 500,
- 'r': 333,
- 's': 389,
- 't': 278,
- 'u': 500,
- 'v': 500,
- 'w': 722,
- 'x': 500,
- 'y': 500,
- 'z': 444,
- 'braceleft': 480,
- 'bar': 200,
- 'braceright': 480,
- 'asciitilde': 541,
- 'exclamdown': 333,
- 'cent': 500,
- 'sterling': 500,
- 'fraction': 167,
- 'yen': 500,
- 'florin': 500,
- 'section': 500,
- 'currency': 500,
- 'quotesingle': 180,
- 'quotedblleft': 444,
- 'guillemotleft': 500,
- 'guilsinglleft': 333,
- 'guilsinglright': 333,
- 'fi': 556,
- 'fl': 556,
- 'endash': 500,
- 'dagger': 500,
- 'daggerdbl': 500,
- 'periodcentered': 250,
- 'paragraph': 453,
- 'bullet': 350,
- 'quotesinglbase': 333,
- 'quotedblbase': 444,
- 'quotedblright': 444,
- 'guillemotright': 500,
- 'ellipsis': 1000,
- 'perthousand': 1000,
- 'questiondown': 444,
- 'grave': 333,
- 'acute': 333,
- 'circumflex': 333,
- 'tilde': 333,
- 'macron': 333,
- 'breve': 333,
- 'dotaccent': 333,
- 'dieresis': 333,
- 'ring': 333,
- 'cedilla': 333,
- 'hungarumlaut': 333,
- 'ogonek': 333,
- 'caron': 333,
- 'emdash': 1000,
- 'AE': 889,
- 'ordfeminine': 276,
- 'Lslash': 611,
- 'Oslash': 722,
- 'OE': 889,
- 'ordmasculine': 310,
- 'ae': 667,
- 'dotlessi': 278,
- 'lslash': 278,
- 'oslash': 500,
- 'oe': 722,
- 'germandbls': 500,
- 'Idieresis': 333,
- 'eacute': 444,
- 'abreve': 444,
- 'uhungarumlaut': 500,
- 'ecaron': 444,
- 'Ydieresis': 722,
- 'divide': 564,
- 'Yacute': 722,
- 'Acircumflex': 722,
- 'aacute': 444,
- 'Ucircumflex': 722,
- 'yacute': 500,
- 'scommaaccent': 389,
- 'ecircumflex': 444,
- 'Uring': 722,
- 'Udieresis': 722,
- 'aogonek': 444,
- 'Uacute': 722,
- 'uogonek': 500,
- 'Edieresis': 611,
- 'Dcroat': 722,
- 'commaaccent': 250,
- 'copyright': 760,
- 'Emacron': 611,
- 'ccaron': 444,
- 'aring': 444,
- 'Ncommaaccent': 722,
- 'lacute': 278,
- 'agrave': 444,
- 'Tcommaaccent': 611,
- 'Cacute': 667,
- 'atilde': 444,
- 'Edotaccent': 611,
- 'scaron': 389,
- 'scedilla': 389,
- 'iacute': 278,
- 'lozenge': 471,
- 'Rcaron': 667,
- 'Gcommaaccent': 722,
- 'ucircumflex': 500,
- 'acircumflex': 444,
- 'Amacron': 722,
- 'rcaron': 333,
- 'ccedilla': 444,
- 'Zdotaccent': 611,
- 'Thorn': 556,
- 'Omacron': 722,
- 'Racute': 667,
- 'Sacute': 556,
- 'dcaron': 588,
- 'Umacron': 722,
- 'uring': 500,
- 'threesuperior': 300,
- 'Ograve': 722,
- 'Agrave': 722,
- 'Abreve': 722,
- 'multiply': 564,
- 'uacute': 500,
- 'Tcaron': 611,
- 'partialdiff': 476,
- 'ydieresis': 500,
- 'Nacute': 722,
- 'icircumflex': 278,
- 'Ecircumflex': 611,
- 'adieresis': 444,
- 'edieresis': 444,
- 'cacute': 444,
- 'nacute': 500,
- 'umacron': 500,
- 'Ncaron': 722,
- 'Iacute': 333,
- 'plusminus': 564,
- 'brokenbar': 200,
- 'registered': 760,
- 'Gbreve': 722,
- 'Idotaccent': 333,
- 'summation': 600,
- 'Egrave': 611,
- 'racute': 333,
- 'omacron': 500,
- 'Zacute': 611,
- 'Zcaron': 611,
- 'greaterequal': 549,
- 'Eth': 722,
- 'Ccedilla': 667,
- 'lcommaaccent': 278,
- 'tcaron': 326,
- 'eogonek': 444,
- 'Uogonek': 722,
- 'Aacute': 722,
- 'Adieresis': 722,
- 'egrave': 444,
- 'zacute': 444,
- 'iogonek': 278,
- 'Oacute': 722,
- 'oacute': 500,
- 'amacron': 444,
- 'sacute': 389,
- 'idieresis': 278,
- 'Ocircumflex': 722,
- 'Ugrave': 722,
- 'Delta': 612,
- 'thorn': 500,
- 'twosuperior': 300,
- 'Odieresis': 722,
- 'mu': 500,
- 'igrave': 278,
- 'ohungarumlaut': 500,
- 'Eogonek': 611,
- 'dcroat': 500,
- 'threequarters': 750,
- 'Scedilla': 556,
- 'lcaron': 344,
- 'Kcommaaccent': 722,
- 'Lacute': 611,
- 'trademark': 980,
- 'edotaccent': 444,
- 'Igrave': 333,
- 'Imacron': 333,
- 'Lcaron': 611,
- 'onehalf': 750,
- 'lessequal': 549,
- 'ocircumflex': 500,
- 'ntilde': 500,
- 'Uhungarumlaut': 722,
- 'Eacute': 611,
- 'emacron': 444,
- 'gbreve': 500,
- 'onequarter': 750,
- 'Scaron': 556,
- 'Scommaaccent': 556,
- 'Ohungarumlaut': 722,
- 'degree': 400,
- 'ograve': 500,
- 'Ccaron': 667,
- 'ugrave': 500,
- 'radical': 453,
- 'Dcaron': 722,
- 'rcommaaccent': 333,
- 'Ntilde': 722,
- 'otilde': 500,
- 'Rcommaaccent': 667,
- 'Lcommaaccent': 611,
- 'Atilde': 722,
- 'Aogonek': 722,
- 'Aring': 722,
- 'Otilde': 722,
- 'zdotaccent': 444,
- 'Ecaron': 611,
- 'Iogonek': 333,
- 'kcommaaccent': 500,
- 'minus': 564,
- 'Icircumflex': 333,
- 'ncaron': 500,
- 'tcommaaccent': 278,
- 'logicalnot': 564,
- 'odieresis': 500,
- 'udieresis': 500,
- 'notequal': 549,
- 'gcommaaccent': 500,
- 'eth': 500,
- 'zcaron': 444,
- 'ncommaaccent': 500,
- 'onesuperior': 300,
- 'imacron': 278,
- 'Euro': 500
- },
- 'Times-Bold': {
- 'space': 250,
- 'exclam': 333,
- 'quotedbl': 555,
- 'numbersign': 500,
- 'dollar': 500,
- 'percent': 1000,
- 'ampersand': 833,
- 'quoteright': 333,
- 'parenleft': 333,
- 'parenright': 333,
- 'asterisk': 500,
- 'plus': 570,
- 'comma': 250,
- 'hyphen': 333,
- 'period': 250,
- 'slash': 278,
- 'zero': 500,
- 'one': 500,
- 'two': 500,
- 'three': 500,
- 'four': 500,
- 'five': 500,
- 'six': 500,
- 'seven': 500,
- 'eight': 500,
- 'nine': 500,
- 'colon': 333,
- 'semicolon': 333,
- 'less': 570,
- 'equal': 570,
- 'greater': 570,
- 'question': 500,
- 'at': 930,
- 'A': 722,
- 'B': 667,
- 'C': 722,
- 'D': 722,
- 'E': 667,
- 'F': 611,
- 'G': 778,
- 'H': 778,
- 'I': 389,
- 'J': 500,
- 'K': 778,
- 'L': 667,
- 'M': 944,
- 'N': 722,
- 'O': 778,
- 'P': 611,
- 'Q': 778,
- 'R': 722,
- 'S': 556,
- 'T': 667,
- 'U': 722,
- 'V': 722,
- 'W': 1000,
- 'X': 722,
- 'Y': 722,
- 'Z': 667,
- 'bracketleft': 333,
- 'backslash': 278,
- 'bracketright': 333,
- 'asciicircum': 581,
- 'underscore': 500,
- 'quoteleft': 333,
- 'a': 500,
- 'b': 556,
- 'c': 444,
- 'd': 556,
- 'e': 444,
- 'f': 333,
- 'g': 500,
- 'h': 556,
- 'i': 278,
- 'j': 333,
- 'k': 556,
- 'l': 278,
- 'm': 833,
- 'n': 556,
- 'o': 500,
- 'p': 556,
- 'q': 556,
- 'r': 444,
- 's': 389,
- 't': 333,
- 'u': 556,
- 'v': 500,
- 'w': 722,
- 'x': 500,
- 'y': 500,
- 'z': 444,
- 'braceleft': 394,
- 'bar': 220,
- 'braceright': 394,
- 'asciitilde': 520,
- 'exclamdown': 333,
- 'cent': 500,
- 'sterling': 500,
- 'fraction': 167,
- 'yen': 500,
- 'florin': 500,
- 'section': 500,
- 'currency': 500,
- 'quotesingle': 278,
- 'quotedblleft': 500,
- 'guillemotleft': 500,
- 'guilsinglleft': 333,
- 'guilsinglright': 333,
- 'fi': 556,
- 'fl': 556,
- 'endash': 500,
- 'dagger': 500,
- 'daggerdbl': 500,
- 'periodcentered': 250,
- 'paragraph': 540,
- 'bullet': 350,
- 'quotesinglbase': 333,
- 'quotedblbase': 500,
- 'quotedblright': 500,
- 'guillemotright': 500,
- 'ellipsis': 1000,
- 'perthousand': 1000,
- 'questiondown': 500,
- 'grave': 333,
- 'acute': 333,
- 'circumflex': 333,
- 'tilde': 333,
- 'macron': 333,
- 'breve': 333,
- 'dotaccent': 333,
- 'dieresis': 333,
- 'ring': 333,
- 'cedilla': 333,
- 'hungarumlaut': 333,
- 'ogonek': 333,
- 'caron': 333,
- 'emdash': 1000,
- 'AE': 1000,
- 'ordfeminine': 300,
- 'Lslash': 667,
- 'Oslash': 778,
- 'OE': 1000,
- 'ordmasculine': 330,
- 'ae': 722,
- 'dotlessi': 278,
- 'lslash': 278,
- 'oslash': 500,
- 'oe': 722,
- 'germandbls': 556,
- 'Idieresis': 389,
- 'eacute': 444,
- 'abreve': 500,
- 'uhungarumlaut': 556,
- 'ecaron': 444,
- 'Ydieresis': 722,
- 'divide': 570,
- 'Yacute': 722,
- 'Acircumflex': 722,
- 'aacute': 500,
- 'Ucircumflex': 722,
- 'yacute': 500,
- 'scommaaccent': 389,
- 'ecircumflex': 444,
- 'Uring': 722,
- 'Udieresis': 722,
- 'aogonek': 500,
- 'Uacute': 722,
- 'uogonek': 556,
- 'Edieresis': 667,
- 'Dcroat': 722,
- 'commaaccent': 250,
- 'copyright': 747,
- 'Emacron': 667,
- 'ccaron': 444,
- 'aring': 500,
- 'Ncommaaccent': 722,
- 'lacute': 278,
- 'agrave': 500,
- 'Tcommaaccent': 667,
- 'Cacute': 722,
- 'atilde': 500,
- 'Edotaccent': 667,
- 'scaron': 389,
- 'scedilla': 389,
- 'iacute': 278,
- 'lozenge': 494,
- 'Rcaron': 722,
- 'Gcommaaccent': 778,
- 'ucircumflex': 556,
- 'acircumflex': 500,
- 'Amacron': 722,
- 'rcaron': 444,
- 'ccedilla': 444,
- 'Zdotaccent': 667,
- 'Thorn': 611,
- 'Omacron': 778,
- 'Racute': 722,
- 'Sacute': 556,
- 'dcaron': 672,
- 'Umacron': 722,
- 'uring': 556,
- 'threesuperior': 300,
- 'Ograve': 778,
- 'Agrave': 722,
- 'Abreve': 722,
- 'multiply': 570,
- 'uacute': 556,
- 'Tcaron': 667,
- 'partialdiff': 494,
- 'ydieresis': 500,
- 'Nacute': 722,
- 'icircumflex': 278,
- 'Ecircumflex': 667,
- 'adieresis': 500,
- 'edieresis': 444,
- 'cacute': 444,
- 'nacute': 556,
- 'umacron': 556,
- 'Ncaron': 722,
- 'Iacute': 389,
- 'plusminus': 570,
- 'brokenbar': 220,
- 'registered': 747,
- 'Gbreve': 778,
- 'Idotaccent': 389,
- 'summation': 600,
- 'Egrave': 667,
- 'racute': 444,
- 'omacron': 500,
- 'Zacute': 667,
- 'Zcaron': 667,
- 'greaterequal': 549,
- 'Eth': 722,
- 'Ccedilla': 722,
- 'lcommaaccent': 278,
- 'tcaron': 416,
- 'eogonek': 444,
- 'Uogonek': 722,
- 'Aacute': 722,
- 'Adieresis': 722,
- 'egrave': 444,
- 'zacute': 444,
- 'iogonek': 278,
- 'Oacute': 778,
- 'oacute': 500,
- 'amacron': 500,
- 'sacute': 389,
- 'idieresis': 278,
- 'Ocircumflex': 778,
- 'Ugrave': 722,
- 'Delta': 612,
- 'thorn': 556,
- 'twosuperior': 300,
- 'Odieresis': 778,
- 'mu': 556,
- 'igrave': 278,
- 'ohungarumlaut': 500,
- 'Eogonek': 667,
- 'dcroat': 556,
- 'threequarters': 750,
- 'Scedilla': 556,
- 'lcaron': 394,
- 'Kcommaaccent': 778,
- 'Lacute': 667,
- 'trademark': 1000,
- 'edotaccent': 444,
- 'Igrave': 389,
- 'Imacron': 389,
- 'Lcaron': 667,
- 'onehalf': 750,
- 'lessequal': 549,
- 'ocircumflex': 500,
- 'ntilde': 556,
- 'Uhungarumlaut': 722,
- 'Eacute': 667,
- 'emacron': 444,
- 'gbreve': 500,
- 'onequarter': 750,
- 'Scaron': 556,
- 'Scommaaccent': 556,
- 'Ohungarumlaut': 778,
- 'degree': 400,
- 'ograve': 500,
- 'Ccaron': 722,
- 'ugrave': 556,
- 'radical': 549,
- 'Dcaron': 722,
- 'rcommaaccent': 444,
- 'Ntilde': 722,
- 'otilde': 500,
- 'Rcommaaccent': 722,
- 'Lcommaaccent': 667,
- 'Atilde': 722,
- 'Aogonek': 722,
- 'Aring': 722,
- 'Otilde': 778,
- 'zdotaccent': 444,
- 'Ecaron': 667,
- 'Iogonek': 389,
- 'kcommaaccent': 556,
- 'minus': 570,
- 'Icircumflex': 389,
- 'ncaron': 556,
- 'tcommaaccent': 333,
- 'logicalnot': 570,
- 'odieresis': 500,
- 'udieresis': 556,
- 'notequal': 549,
- 'gcommaaccent': 500,
- 'eth': 500,
- 'zcaron': 444,
- 'ncommaaccent': 556,
- 'onesuperior': 300,
- 'imacron': 278,
- 'Euro': 500
- },
- 'Times-BoldItalic': {
- 'space': 250,
- 'exclam': 389,
- 'quotedbl': 555,
- 'numbersign': 500,
- 'dollar': 500,
- 'percent': 833,
- 'ampersand': 778,
- 'quoteright': 333,
- 'parenleft': 333,
- 'parenright': 333,
- 'asterisk': 500,
- 'plus': 570,
- 'comma': 250,
- 'hyphen': 333,
- 'period': 250,
- 'slash': 278,
- 'zero': 500,
- 'one': 500,
- 'two': 500,
- 'three': 500,
- 'four': 500,
- 'five': 500,
- 'six': 500,
- 'seven': 500,
- 'eight': 500,
- 'nine': 500,
- 'colon': 333,
- 'semicolon': 333,
- 'less': 570,
- 'equal': 570,
- 'greater': 570,
- 'question': 500,
- 'at': 832,
- 'A': 667,
- 'B': 667,
- 'C': 667,
- 'D': 722,
- 'E': 667,
- 'F': 667,
- 'G': 722,
- 'H': 778,
- 'I': 389,
- 'J': 500,
- 'K': 667,
- 'L': 611,
- 'M': 889,
- 'N': 722,
- 'O': 722,
- 'P': 611,
- 'Q': 722,
- 'R': 667,
- 'S': 556,
- 'T': 611,
- 'U': 722,
- 'V': 667,
- 'W': 889,
- 'X': 667,
- 'Y': 611,
- 'Z': 611,
- 'bracketleft': 333,
- 'backslash': 278,
- 'bracketright': 333,
- 'asciicircum': 570,
- 'underscore': 500,
- 'quoteleft': 333,
- 'a': 500,
- 'b': 500,
- 'c': 444,
- 'd': 500,
- 'e': 444,
- 'f': 333,
- 'g': 500,
- 'h': 556,
- 'i': 278,
- 'j': 278,
- 'k': 500,
- 'l': 278,
- 'm': 778,
- 'n': 556,
- 'o': 500,
- 'p': 500,
- 'q': 500,
- 'r': 389,
- 's': 389,
- 't': 278,
- 'u': 556,
- 'v': 444,
- 'w': 667,
- 'x': 500,
- 'y': 444,
- 'z': 389,
- 'braceleft': 348,
- 'bar': 220,
- 'braceright': 348,
- 'asciitilde': 570,
- 'exclamdown': 389,
- 'cent': 500,
- 'sterling': 500,
- 'fraction': 167,
- 'yen': 500,
- 'florin': 500,
- 'section': 500,
- 'currency': 500,
- 'quotesingle': 278,
- 'quotedblleft': 500,
- 'guillemotleft': 500,
- 'guilsinglleft': 333,
- 'guilsinglright': 333,
- 'fi': 556,
- 'fl': 556,
- 'endash': 500,
- 'dagger': 500,
- 'daggerdbl': 500,
- 'periodcentered': 250,
- 'paragraph': 500,
- 'bullet': 350,
- 'quotesinglbase': 333,
- 'quotedblbase': 500,
- 'quotedblright': 500,
- 'guillemotright': 500,
- 'ellipsis': 1000,
- 'perthousand': 1000,
- 'questiondown': 500,
- 'grave': 333,
- 'acute': 333,
- 'circumflex': 333,
- 'tilde': 333,
- 'macron': 333,
- 'breve': 333,
- 'dotaccent': 333,
- 'dieresis': 333,
- 'ring': 333,
- 'cedilla': 333,
- 'hungarumlaut': 333,
- 'ogonek': 333,
- 'caron': 333,
- 'emdash': 1000,
- 'AE': 944,
- 'ordfeminine': 266,
- 'Lslash': 611,
- 'Oslash': 722,
- 'OE': 944,
- 'ordmasculine': 300,
- 'ae': 722,
- 'dotlessi': 278,
- 'lslash': 278,
- 'oslash': 500,
- 'oe': 722,
- 'germandbls': 500,
- 'Idieresis': 389,
- 'eacute': 444,
- 'abreve': 500,
- 'uhungarumlaut': 556,
- 'ecaron': 444,
- 'Ydieresis': 611,
- 'divide': 570,
- 'Yacute': 611,
- 'Acircumflex': 667,
- 'aacute': 500,
- 'Ucircumflex': 722,
- 'yacute': 444,
- 'scommaaccent': 389,
- 'ecircumflex': 444,
- 'Uring': 722,
- 'Udieresis': 722,
- 'aogonek': 500,
- 'Uacute': 722,
- 'uogonek': 556,
- 'Edieresis': 667,
- 'Dcroat': 722,
- 'commaaccent': 250,
- 'copyright': 747,
- 'Emacron': 667,
- 'ccaron': 444,
- 'aring': 500,
- 'Ncommaaccent': 722,
- 'lacute': 278,
- 'agrave': 500,
- 'Tcommaaccent': 611,
- 'Cacute': 667,
- 'atilde': 500,
- 'Edotaccent': 667,
- 'scaron': 389,
- 'scedilla': 389,
- 'iacute': 278,
- 'lozenge': 494,
- 'Rcaron': 667,
- 'Gcommaaccent': 722,
- 'ucircumflex': 556,
- 'acircumflex': 500,
- 'Amacron': 667,
- 'rcaron': 389,
- 'ccedilla': 444,
- 'Zdotaccent': 611,
- 'Thorn': 611,
- 'Omacron': 722,
- 'Racute': 667,
- 'Sacute': 556,
- 'dcaron': 608,
- 'Umacron': 722,
- 'uring': 556,
- 'threesuperior': 300,
- 'Ograve': 722,
- 'Agrave': 667,
- 'Abreve': 667,
- 'multiply': 570,
- 'uacute': 556,
- 'Tcaron': 611,
- 'partialdiff': 494,
- 'ydieresis': 444,
- 'Nacute': 722,
- 'icircumflex': 278,
- 'Ecircumflex': 667,
- 'adieresis': 500,
- 'edieresis': 444,
- 'cacute': 444,
- 'nacute': 556,
- 'umacron': 556,
- 'Ncaron': 722,
- 'Iacute': 389,
- 'plusminus': 570,
- 'brokenbar': 220,
- 'registered': 747,
- 'Gbreve': 722,
- 'Idotaccent': 389,
- 'summation': 600,
- 'Egrave': 667,
- 'racute': 389,
- 'omacron': 500,
- 'Zacute': 611,
- 'Zcaron': 611,
- 'greaterequal': 549,
- 'Eth': 722,
- 'Ccedilla': 667,
- 'lcommaaccent': 278,
- 'tcaron': 366,
- 'eogonek': 444,
- 'Uogonek': 722,
- 'Aacute': 667,
- 'Adieresis': 667,
- 'egrave': 444,
- 'zacute': 389,
- 'iogonek': 278,
- 'Oacute': 722,
- 'oacute': 500,
- 'amacron': 500,
- 'sacute': 389,
- 'idieresis': 278,
- 'Ocircumflex': 722,
- 'Ugrave': 722,
- 'Delta': 612,
- 'thorn': 500,
- 'twosuperior': 300,
- 'Odieresis': 722,
- 'mu': 576,
- 'igrave': 278,
- 'ohungarumlaut': 500,
- 'Eogonek': 667,
- 'dcroat': 500,
- 'threequarters': 750,
- 'Scedilla': 556,
- 'lcaron': 382,
- 'Kcommaaccent': 667,
- 'Lacute': 611,
- 'trademark': 1000,
- 'edotaccent': 444,
- 'Igrave': 389,
- 'Imacron': 389,
- 'Lcaron': 611,
- 'onehalf': 750,
- 'lessequal': 549,
- 'ocircumflex': 500,
- 'ntilde': 556,
- 'Uhungarumlaut': 722,
- 'Eacute': 667,
- 'emacron': 444,
- 'gbreve': 500,
- 'onequarter': 750,
- 'Scaron': 556,
- 'Scommaaccent': 556,
- 'Ohungarumlaut': 722,
- 'degree': 400,
- 'ograve': 500,
- 'Ccaron': 667,
- 'ugrave': 556,
- 'radical': 549,
- 'Dcaron': 722,
- 'rcommaaccent': 389,
- 'Ntilde': 722,
- 'otilde': 500,
- 'Rcommaaccent': 667,
- 'Lcommaaccent': 611,
- 'Atilde': 667,
- 'Aogonek': 667,
- 'Aring': 667,
- 'Otilde': 722,
- 'zdotaccent': 389,
- 'Ecaron': 667,
- 'Iogonek': 389,
- 'kcommaaccent': 500,
- 'minus': 606,
- 'Icircumflex': 389,
- 'ncaron': 556,
- 'tcommaaccent': 278,
- 'logicalnot': 606,
- 'odieresis': 500,
- 'udieresis': 556,
- 'notequal': 549,
- 'gcommaaccent': 500,
- 'eth': 500,
- 'zcaron': 389,
- 'ncommaaccent': 556,
- 'onesuperior': 300,
- 'imacron': 278,
- 'Euro': 500
- },
- 'Times-Italic': {
- 'space': 250,
- 'exclam': 333,
- 'quotedbl': 420,
- 'numbersign': 500,
- 'dollar': 500,
- 'percent': 833,
- 'ampersand': 778,
- 'quoteright': 333,
- 'parenleft': 333,
- 'parenright': 333,
- 'asterisk': 500,
- 'plus': 675,
- 'comma': 250,
- 'hyphen': 333,
- 'period': 250,
- 'slash': 278,
- 'zero': 500,
- 'one': 500,
- 'two': 500,
- 'three': 500,
- 'four': 500,
- 'five': 500,
- 'six': 500,
- 'seven': 500,
- 'eight': 500,
- 'nine': 500,
- 'colon': 333,
- 'semicolon': 333,
- 'less': 675,
- 'equal': 675,
- 'greater': 675,
- 'question': 500,
- 'at': 920,
- 'A': 611,
- 'B': 611,
- 'C': 667,
- 'D': 722,
- 'E': 611,
- 'F': 611,
- 'G': 722,
- 'H': 722,
- 'I': 333,
- 'J': 444,
- 'K': 667,
- 'L': 556,
- 'M': 833,
- 'N': 667,
- 'O': 722,
- 'P': 611,
- 'Q': 722,
- 'R': 611,
- 'S': 500,
- 'T': 556,
- 'U': 722,
- 'V': 611,
- 'W': 833,
- 'X': 611,
- 'Y': 556,
- 'Z': 556,
- 'bracketleft': 389,
- 'backslash': 278,
- 'bracketright': 389,
- 'asciicircum': 422,
- 'underscore': 500,
- 'quoteleft': 333,
- 'a': 500,
- 'b': 500,
- 'c': 444,
- 'd': 500,
- 'e': 444,
- 'f': 278,
- 'g': 500,
- 'h': 500,
- 'i': 278,
- 'j': 278,
- 'k': 444,
- 'l': 278,
- 'm': 722,
- 'n': 500,
- 'o': 500,
- 'p': 500,
- 'q': 500,
- 'r': 389,
- 's': 389,
- 't': 278,
- 'u': 500,
- 'v': 444,
- 'w': 667,
- 'x': 444,
- 'y': 444,
- 'z': 389,
- 'braceleft': 400,
- 'bar': 275,
- 'braceright': 400,
- 'asciitilde': 541,
- 'exclamdown': 389,
- 'cent': 500,
- 'sterling': 500,
- 'fraction': 167,
- 'yen': 500,
- 'florin': 500,
- 'section': 500,
- 'currency': 500,
- 'quotesingle': 214,
- 'quotedblleft': 556,
- 'guillemotleft': 500,
- 'guilsinglleft': 333,
- 'guilsinglright': 333,
- 'fi': 500,
- 'fl': 500,
- 'endash': 500,
- 'dagger': 500,
- 'daggerdbl': 500,
- 'periodcentered': 250,
- 'paragraph': 523,
- 'bullet': 350,
- 'quotesinglbase': 333,
- 'quotedblbase': 556,
- 'quotedblright': 556,
- 'guillemotright': 500,
- 'ellipsis': 889,
- 'perthousand': 1000,
- 'questiondown': 500,
- 'grave': 333,
- 'acute': 333,
- 'circumflex': 333,
- 'tilde': 333,
- 'macron': 333,
- 'breve': 333,
- 'dotaccent': 333,
- 'dieresis': 333,
- 'ring': 333,
- 'cedilla': 333,
- 'hungarumlaut': 333,
- 'ogonek': 333,
- 'caron': 333,
- 'emdash': 889,
- 'AE': 889,
- 'ordfeminine': 276,
- 'Lslash': 556,
- 'Oslash': 722,
- 'OE': 944,
- 'ordmasculine': 310,
- 'ae': 667,
- 'dotlessi': 278,
- 'lslash': 278,
- 'oslash': 500,
- 'oe': 667,
- 'germandbls': 500,
- 'Idieresis': 333,
- 'eacute': 444,
- 'abreve': 500,
- 'uhungarumlaut': 500,
- 'ecaron': 444,
- 'Ydieresis': 556,
- 'divide': 675,
- 'Yacute': 556,
- 'Acircumflex': 611,
- 'aacute': 500,
- 'Ucircumflex': 722,
- 'yacute': 444,
- 'scommaaccent': 389,
- 'ecircumflex': 444,
- 'Uring': 722,
- 'Udieresis': 722,
- 'aogonek': 500,
- 'Uacute': 722,
- 'uogonek': 500,
- 'Edieresis': 611,
- 'Dcroat': 722,
- 'commaaccent': 250,
- 'copyright': 760,
- 'Emacron': 611,
- 'ccaron': 444,
- 'aring': 500,
- 'Ncommaaccent': 667,
- 'lacute': 278,
- 'agrave': 500,
- 'Tcommaaccent': 556,
- 'Cacute': 667,
- 'atilde': 500,
- 'Edotaccent': 611,
- 'scaron': 389,
- 'scedilla': 389,
- 'iacute': 278,
- 'lozenge': 471,
- 'Rcaron': 611,
- 'Gcommaaccent': 722,
- 'ucircumflex': 500,
- 'acircumflex': 500,
- 'Amacron': 611,
- 'rcaron': 389,
- 'ccedilla': 444,
- 'Zdotaccent': 556,
- 'Thorn': 611,
- 'Omacron': 722,
- 'Racute': 611,
- 'Sacute': 500,
- 'dcaron': 544,
- 'Umacron': 722,
- 'uring': 500,
- 'threesuperior': 300,
- 'Ograve': 722,
- 'Agrave': 611,
- 'Abreve': 611,
- 'multiply': 675,
- 'uacute': 500,
- 'Tcaron': 556,
- 'partialdiff': 476,
- 'ydieresis': 444,
- 'Nacute': 667,
- 'icircumflex': 278,
- 'Ecircumflex': 611,
- 'adieresis': 500,
- 'edieresis': 444,
- 'cacute': 444,
- 'nacute': 500,
- 'umacron': 500,
- 'Ncaron': 667,
- 'Iacute': 333,
- 'plusminus': 675,
- 'brokenbar': 275,
- 'registered': 760,
- 'Gbreve': 722,
- 'Idotaccent': 333,
- 'summation': 600,
- 'Egrave': 611,
- 'racute': 389,
- 'omacron': 500,
- 'Zacute': 556,
- 'Zcaron': 556,
- 'greaterequal': 549,
- 'Eth': 722,
- 'Ccedilla': 667,
- 'lcommaaccent': 278,
- 'tcaron': 300,
- 'eogonek': 444,
- 'Uogonek': 722,
- 'Aacute': 611,
- 'Adieresis': 611,
- 'egrave': 444,
- 'zacute': 389,
- 'iogonek': 278,
- 'Oacute': 722,
- 'oacute': 500,
- 'amacron': 500,
- 'sacute': 389,
- 'idieresis': 278,
- 'Ocircumflex': 722,
- 'Ugrave': 722,
- 'Delta': 612,
- 'thorn': 500,
- 'twosuperior': 300,
- 'Odieresis': 722,
- 'mu': 500,
- 'igrave': 278,
- 'ohungarumlaut': 500,
- 'Eogonek': 611,
- 'dcroat': 500,
- 'threequarters': 750,
- 'Scedilla': 500,
- 'lcaron': 300,
- 'Kcommaaccent': 667,
- 'Lacute': 556,
- 'trademark': 980,
- 'edotaccent': 444,
- 'Igrave': 333,
- 'Imacron': 333,
- 'Lcaron': 611,
- 'onehalf': 750,
- 'lessequal': 549,
- 'ocircumflex': 500,
- 'ntilde': 500,
- 'Uhungarumlaut': 722,
- 'Eacute': 611,
- 'emacron': 444,
- 'gbreve': 500,
- 'onequarter': 750,
- 'Scaron': 500,
- 'Scommaaccent': 500,
- 'Ohungarumlaut': 722,
- 'degree': 400,
- 'ograve': 500,
- 'Ccaron': 667,
- 'ugrave': 500,
- 'radical': 453,
- 'Dcaron': 722,
- 'rcommaaccent': 389,
- 'Ntilde': 667,
- 'otilde': 500,
- 'Rcommaaccent': 611,
- 'Lcommaaccent': 556,
- 'Atilde': 611,
- 'Aogonek': 611,
- 'Aring': 611,
- 'Otilde': 722,
- 'zdotaccent': 389,
- 'Ecaron': 611,
- 'Iogonek': 333,
- 'kcommaaccent': 444,
- 'minus': 675,
- 'Icircumflex': 333,
- 'ncaron': 500,
- 'tcommaaccent': 278,
- 'logicalnot': 675,
- 'odieresis': 500,
- 'udieresis': 500,
- 'notequal': 549,
- 'gcommaaccent': 500,
- 'eth': 500,
- 'zcaron': 389,
- 'ncommaaccent': 500,
- 'onesuperior': 300,
- 'imacron': 278,
- 'Euro': 500
- },
- 'ZapfDingbats': {
- 'space': 278,
- 'a1': 974,
- 'a2': 961,
- 'a202': 974,
- 'a3': 980,
- 'a4': 719,
- 'a5': 789,
- 'a119': 790,
- 'a118': 791,
- 'a117': 690,
- 'a11': 960,
- 'a12': 939,
- 'a13': 549,
- 'a14': 855,
- 'a15': 911,
- 'a16': 933,
- 'a105': 911,
- 'a17': 945,
- 'a18': 974,
- 'a19': 755,
- 'a20': 846,
- 'a21': 762,
- 'a22': 761,
- 'a23': 571,
- 'a24': 677,
- 'a25': 763,
- 'a26': 760,
- 'a27': 759,
- 'a28': 754,
- 'a6': 494,
- 'a7': 552,
- 'a8': 537,
- 'a9': 577,
- 'a10': 692,
- 'a29': 786,
- 'a30': 788,
- 'a31': 788,
- 'a32': 790,
- 'a33': 793,
- 'a34': 794,
- 'a35': 816,
- 'a36': 823,
- 'a37': 789,
- 'a38': 841,
- 'a39': 823,
- 'a40': 833,
- 'a41': 816,
- 'a42': 831,
- 'a43': 923,
- 'a44': 744,
- 'a45': 723,
- 'a46': 749,
- 'a47': 790,
- 'a48': 792,
- 'a49': 695,
- 'a50': 776,
- 'a51': 768,
- 'a52': 792,
- 'a53': 759,
- 'a54': 707,
- 'a55': 708,
- 'a56': 682,
- 'a57': 701,
- 'a58': 826,
- 'a59': 815,
- 'a60': 789,
- 'a61': 789,
- 'a62': 707,
- 'a63': 687,
- 'a64': 696,
- 'a65': 689,
- 'a66': 786,
- 'a67': 787,
- 'a68': 713,
- 'a69': 791,
- 'a70': 785,
- 'a71': 791,
- 'a72': 873,
- 'a73': 761,
- 'a74': 762,
- 'a203': 762,
- 'a75': 759,
- 'a204': 759,
- 'a76': 892,
- 'a77': 892,
- 'a78': 788,
- 'a79': 784,
- 'a81': 438,
- 'a82': 138,
- 'a83': 277,
- 'a84': 415,
- 'a97': 392,
- 'a98': 392,
- 'a99': 668,
- 'a100': 668,
- 'a89': 390,
- 'a90': 390,
- 'a93': 317,
- 'a94': 317,
- 'a91': 276,
- 'a92': 276,
- 'a205': 509,
- 'a85': 509,
- 'a206': 410,
- 'a86': 410,
- 'a87': 234,
- 'a88': 234,
- 'a95': 334,
- 'a96': 334,
- 'a101': 732,
- 'a102': 544,
- 'a103': 544,
- 'a104': 910,
- 'a106': 667,
- 'a107': 760,
- 'a108': 760,
- 'a112': 776,
- 'a111': 595,
- 'a110': 694,
- 'a109': 626,
- 'a120': 788,
- 'a121': 788,
- 'a122': 788,
- 'a123': 788,
- 'a124': 788,
- 'a125': 788,
- 'a126': 788,
- 'a127': 788,
- 'a128': 788,
- 'a129': 788,
- 'a130': 788,
- 'a131': 788,
- 'a132': 788,
- 'a133': 788,
- 'a134': 788,
- 'a135': 788,
- 'a136': 788,
- 'a137': 788,
- 'a138': 788,
- 'a139': 788,
- 'a140': 788,
- 'a141': 788,
- 'a142': 788,
- 'a143': 788,
- 'a144': 788,
- 'a145': 788,
- 'a146': 788,
- 'a147': 788,
- 'a148': 788,
- 'a149': 788,
- 'a150': 788,
- 'a151': 788,
- 'a152': 788,
- 'a153': 788,
- 'a154': 788,
- 'a155': 788,
- 'a156': 788,
- 'a157': 788,
- 'a158': 788,
- 'a159': 788,
- 'a160': 894,
- 'a161': 838,
- 'a163': 1016,
- 'a164': 458,
- 'a196': 748,
- 'a165': 924,
- 'a192': 748,
- 'a166': 918,
- 'a167': 927,
- 'a168': 928,
- 'a169': 928,
- 'a170': 834,
- 'a171': 873,
- 'a172': 828,
- 'a173': 924,
- 'a162': 924,
- 'a174': 917,
- 'a175': 930,
- 'a176': 931,
- 'a177': 463,
- 'a178': 883,
- 'a179': 836,
- 'a193': 836,
- 'a180': 867,
- 'a199': 867,
- 'a181': 696,
- 'a200': 696,
- 'a182': 874,
- 'a201': 874,
- 'a183': 760,
- 'a184': 946,
- 'a197': 771,
- 'a185': 865,
- 'a194': 771,
- 'a198': 888,
- 'a186': 967,
- 'a195': 888,
- 'a187': 831,
- 'a188': 873,
- 'a189': 927,
- 'a190': 970,
- 'a191': 918
- }
-};
-
-
-
-var EOF = {};
-
-function isEOF(v) {
- return v == EOF;
-}
-
-var Parser = (function ParserClosure() {
- function Parser(lexer, allowStreams, xref) {
- this.lexer = lexer;
- this.allowStreams = allowStreams;
- this.xref = xref;
- this.inlineImg = 0;
- this.refill();
- }
-
- Parser.prototype = {
- refill: function Parser_refill() {
- this.buf1 = this.lexer.getObj();
- this.buf2 = this.lexer.getObj();
- },
- shift: function Parser_shift() {
- if (isCmd(this.buf2, 'ID')) {
- this.buf1 = this.buf2;
- this.buf2 = null;
- // skip byte after ID
- this.lexer.skip();
- } else {
- this.buf1 = this.buf2;
- this.buf2 = this.lexer.getObj();
- }
- },
- getObj: function Parser_getObj(cipherTransform) {
- if (isCmd(this.buf1, 'BI')) { // inline image
- this.shift();
- return this.makeInlineImage(cipherTransform);
- }
- if (isCmd(this.buf1, '[')) { // array
- this.shift();
- var array = [];
- while (!isCmd(this.buf1, ']') && !isEOF(this.buf1))
- array.push(this.getObj());
- if (isEOF(this.buf1))
- error('End of file inside array');
- this.shift();
- return array;
- }
- if (isCmd(this.buf1, '<<')) { // dictionary or stream
- this.shift();
- var dict = new Dict(this.xref);
- while (!isCmd(this.buf1, '>>') && !isEOF(this.buf1)) {
- if (!isName(this.buf1))
- error('Dictionary key must be a name object');
-
- var key = this.buf1.name;
- this.shift();
- if (isEOF(this.buf1))
- break;
- dict.set(key, this.getObj(cipherTransform));
- }
- if (isEOF(this.buf1))
- error('End of file inside dictionary');
-
- // stream objects are not allowed inside content streams or
- // object streams
- if (isCmd(this.buf2, 'stream')) {
- return this.allowStreams ?
- this.makeStream(dict, cipherTransform) : dict;
- }
- this.shift();
- return dict;
- }
- if (isInt(this.buf1)) { // indirect reference or integer
- var num = this.buf1;
- this.shift();
- if (isInt(this.buf1) && isCmd(this.buf2, 'R')) {
- var ref = new Ref(num, this.buf1);
- this.shift();
- this.shift();
- return ref;
- }
- return num;
- }
- if (isString(this.buf1)) { // string
- var str = this.buf1;
- this.shift();
- if (cipherTransform)
- str = cipherTransform.decryptString(str);
- return str;
- }
-
- // simple object
- var obj = this.buf1;
- this.shift();
- return obj;
- },
- makeInlineImage: function Parser_makeInlineImage(cipherTransform) {
- var lexer = this.lexer;
- var stream = lexer.stream;
-
- // parse dictionary
- var dict = new Dict();
- while (!isCmd(this.buf1, 'ID') && !isEOF(this.buf1)) {
- if (!isName(this.buf1))
- error('Dictionary key must be a name object');
-
- var key = this.buf1.name;
- this.shift();
- if (isEOF(this.buf1))
- break;
- dict.set(key, this.getObj(cipherTransform));
- }
-
- // parse image stream
- var startPos = stream.pos;
-
- // searching for the /EI\s/
- var state = 0, ch;
- while (state != 4 && (ch = stream.getByte()) != null) {
- switch (ch) {
- case 0x20:
- case 0x0D:
- case 0x0A:
- state = state === 3 ? 4 : 0;
- break;
- case 0x45:
- state = 2;
- break;
- case 0x49:
- state = state === 2 ? 3 : 0;
- break;
- default:
- state = 0;
- break;
- }
- }
-
- // TODO improve the small images performance to remove the limit
- var inlineImgLimit = 500;
- if (++this.inlineImg >= inlineImgLimit) {
- if (this.inlineImg === inlineImgLimit)
- warn('Too many inline images');
- this.shift();
- return null;
- }
-
- var length = (stream.pos - 4) - startPos;
- var imageStream = stream.makeSubStream(startPos, length, dict);
- if (cipherTransform)
- imageStream = cipherTransform.createStream(imageStream);
- imageStream = this.filter(imageStream, dict, length);
- imageStream.parameters = dict;
-
- this.buf2 = Cmd.get('EI');
- this.shift();
-
- return imageStream;
- },
- fetchIfRef: function Parser_fetchIfRef(obj) {
- // not relying on the xref.fetchIfRef -- xref might not be set
- return isRef(obj) ? this.xref.fetch(obj) : obj;
- },
- makeStream: function Parser_makeStream(dict, cipherTransform) {
- var lexer = this.lexer;
- var stream = lexer.stream;
-
- // get stream start position
- lexer.skipToNextLine();
- var pos = stream.pos;
-
- // get length
- var length = this.fetchIfRef(dict.get('Length'));
- if (!isInt(length))
- error('Bad ' + length + ' attribute in stream');
-
- // skip over the stream data
- stream.pos = pos + length;
- this.shift(); // '>>'
- this.shift(); // 'stream'
- if (!isCmd(this.buf1, 'endstream'))
- error('Missing endstream');
- this.shift();
-
- stream = stream.makeSubStream(pos, length, dict);
- if (cipherTransform)
- stream = cipherTransform.createStream(stream);
- stream = this.filter(stream, dict, length);
- stream.parameters = dict;
- return stream;
- },
- filter: function Parser_filter(stream, dict, length) {
- var filter = this.fetchIfRef(dict.get('Filter', 'F'));
- var params = this.fetchIfRef(dict.get('DecodeParms', 'DP'));
- if (isName(filter))
- return this.makeFilter(stream, filter.name, length, params);
- if (isArray(filter)) {
- var filterArray = filter;
- var paramsArray = params;
- for (var i = 0, ii = filterArray.length; i < ii; ++i) {
- filter = filterArray[i];
- if (!isName(filter))
- error('Bad filter name: ' + filter);
-
- params = null;
- if (isArray(paramsArray) && (i in paramsArray))
- params = paramsArray[i];
- stream = this.makeFilter(stream, filter.name, length, params);
- // after the first stream the length variable is invalid
- length = null;
- }
- }
- return stream;
- },
- makeFilter: function Parser_makeFilter(stream, name, length, params) {
- if (name == 'FlateDecode' || name == 'Fl') {
- if (params) {
- return new PredictorStream(new FlateStream(stream), params);
- }
- return new FlateStream(stream);
- }
- if (name == 'LZWDecode' || name == 'LZW') {
- var earlyChange = 1;
- if (params) {
- if (params.has('EarlyChange'))
- earlyChange = params.get('EarlyChange');
- return new PredictorStream(
- new LZWStream(stream, earlyChange), params);
- }
- return new LZWStream(stream, earlyChange);
- }
- if (name == 'DCTDecode' || name == 'DCT') {
- var bytes = stream.getBytes(length);
- return new JpegStream(bytes, stream.dict, this.xref);
- }
- if (name == 'JPXDecode' || name == 'JPX') {
- var bytes = stream.getBytes(length);
- return new JpxStream(bytes, stream.dict);
- }
- if (name == 'ASCII85Decode' || name == 'A85') {
- return new Ascii85Stream(stream);
- }
- if (name == 'ASCIIHexDecode' || name == 'AHx') {
- return new AsciiHexStream(stream);
- }
- if (name == 'CCITTFaxDecode' || name == 'CCF') {
- return new CCITTFaxStream(stream, params);
- }
- if (name == 'RunLengthDecode' || name == 'RL') {
- return new RunLengthStream(stream);
- }
- if (name == 'JBIG2Decode') {
- var bytes = stream.getBytes(length);
- return new Jbig2Stream(bytes, stream.dict);
- }
- warn('filter "' + name + '" not supported yet');
- return stream;
- }
- };
-
- return Parser;
-})();
-
-var Lexer = (function LexerClosure() {
- function Lexer(stream, knownCommands) {
- this.stream = stream;
- // The PDFs might have "glued" commands with other commands, operands or
- // literals, e.g. "q1". The knownCommands is a dictionary of the valid
- // commands and their prefixes. The prefixes are built the following way:
- // if there a command that is a prefix of the other valid command or
- // literal (e.g. 'f' and 'false') the following prefixes must be included,
- // 'fa', 'fal', 'fals'. The prefixes are not needed, if the command has no
- // other commands or literals as a prefix. The knowCommands is optional.
- this.knownCommands = knownCommands;
- }
-
- Lexer.isSpace = function Lexer_isSpace(ch) {
- return ch == ' ' || ch == '\t' || ch == '\x0d' || ch == '\x0a';
- };
-
- // A '1' in this array means the character is white space. A '1' or
- // '2' means the character ends a name or command.
- var specialChars = [
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // 0x
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
- 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, // 2x
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, // 3x
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4x
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 5x
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6x
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 7x
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ax
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // bx
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // cx
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // dx
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ex
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // fx
- ];
-
- function toHexDigit(ch) {
- if (ch >= '0' && ch <= '9')
- return ch.charCodeAt(0) - 48;
- ch = ch.toUpperCase();
- if (ch >= 'A' && ch <= 'F')
- return ch.charCodeAt(0) - 55;
- return -1;
- }
-
- Lexer.prototype = {
- getNumber: function Lexer_getNumber(ch) {
- var floating = false;
- var str = ch;
- var stream = this.stream;
- for (;;) {
- ch = stream.lookChar();
- if (ch == '.' && !floating) {
- str += ch;
- floating = true;
- } else if (ch == '-') {
- // ignore minus signs in the middle of numbers to match
- // Adobe's behavior
- warn('Badly formated number');
- } else if (ch >= '0' && ch <= '9') {
- str += ch;
- } else if (ch == 'e' || ch == 'E') {
- floating = true;
- } else {
- // the last character doesn't belong to us
- break;
- }
- stream.skip();
- }
- var value = parseFloat(str);
- if (isNaN(value))
- error('Invalid floating point number: ' + value);
- return value;
- },
- getString: function Lexer_getString() {
- var numParen = 1;
- var done = false;
- var str = '';
- var stream = this.stream;
- var ch;
- do {
- ch = stream.getChar();
- switch (ch) {
- case undefined:
- warn('Unterminated string');
- done = true;
- break;
- case '(':
- ++numParen;
- str += ch;
- break;
- case ')':
- if (--numParen == 0) {
- done = true;
- } else {
- str += ch;
- }
- break;
- case '\\':
- ch = stream.getChar();
- switch (ch) {
- case undefined:
- warn('Unterminated string');
- done = true;
- break;
- case 'n':
- str += '\n';
- break;
- case 'r':
- str += '\r';
- break;
- case 't':
- str += '\t';
- break;
- case 'b':
- str += '\b';
- break;
- case 'f':
- str += '\f';
- break;
- case '\\':
- case '(':
- case ')':
- str += ch;
- break;
- case '0': case '1': case '2': case '3':
- case '4': case '5': case '6': case '7':
- var x = ch - '0';
- ch = stream.lookChar();
- if (ch >= '0' && ch <= '7') {
- stream.skip();
- x = (x << 3) + (ch - '0');
- ch = stream.lookChar();
- if (ch >= '0' && ch <= '7') {
- stream.skip();
- x = (x << 3) + (ch - '0');
- }
- }
-
- str += String.fromCharCode(x);
- break;
- case '\r':
- ch = stream.lookChar();
- if (ch == '\n')
- stream.skip();
- break;
- case '\n':
- break;
- default:
- str += ch;
- }
- break;
- default:
- str += ch;
- }
- } while (!done);
- return str;
- },
- getName: function Lexer_getName(ch) {
- var str = '';
- var stream = this.stream;
- while (!!(ch = stream.lookChar()) && !specialChars[ch.charCodeAt(0)]) {
- stream.skip();
- if (ch == '#') {
- ch = stream.lookChar();
- var x = toHexDigit(ch);
- if (x != -1) {
- stream.skip();
- var x2 = toHexDigit(stream.getChar());
- if (x2 == -1)
- error('Illegal digit in hex char in name: ' + x2);
- str += String.fromCharCode((x << 4) | x2);
- } else {
- str += '#';
- str += ch;
- }
- } else {
- str += ch;
- }
- }
- if (str.length > 128)
- error('Warning: name token is longer than allowed by the spec: ' +
- str.length);
- return new Name(str);
- },
- getHexString: function Lexer_getHexString(ch) {
- var str = '';
- var stream = this.stream;
- for (;;) {
- ch = stream.getChar();
- if (ch == '>') {
- break;
- }
- if (!ch) {
- warn('Unterminated hex string');
- break;
- }
- if (specialChars[ch.charCodeAt(0)] != 1) {
- var x, x2;
- if ((x = toHexDigit(ch)) == -1)
- error('Illegal character in hex string: ' + ch);
-
- ch = stream.getChar();
- while (specialChars[ch.charCodeAt(0)] == 1)
- ch = stream.getChar();
-
- if ((x2 = toHexDigit(ch)) == -1)
- error('Illegal character in hex string: ' + ch);
-
- str += String.fromCharCode((x << 4) | x2);
- }
- }
- return str;
- },
- getObj: function Lexer_getObj() {
- // skip whitespace and comments
- var comment = false;
- var stream = this.stream;
- var ch;
- while (true) {
- if (!(ch = stream.getChar()))
- return EOF;
- if (comment) {
- if (ch == '\r' || ch == '\n')
- comment = false;
- } else if (ch == '%') {
- comment = true;
- } else if (specialChars[ch.charCodeAt(0)] != 1) {
- break;
- }
- }
-
- // start reading token
- switch (ch) {
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- case '+': case '-': case '.':
- return this.getNumber(ch);
- case '(':
- return this.getString();
- case '/':
- return this.getName(ch);
- // array punctuation
- case '[':
- case ']':
- return Cmd.get(ch);
- // hex string or dict punctuation
- case '<':
- ch = stream.lookChar();
- if (ch == '<') {
- // dict punctuation
- stream.skip();
- return Cmd.get('<<');
- }
- return this.getHexString(ch);
- // dict punctuation
- case '>':
- ch = stream.lookChar();
- if (ch == '>') {
- stream.skip();
- return Cmd.get('>>');
- }
- case '{':
- case '}':
- return Cmd.get(ch);
- // fall through
- case ')':
- error('Illegal character: ' + ch);
- }
-
- // command
- var str = ch;
- var knownCommands = this.knownCommands;
- var knownCommandFound = knownCommands && (str in knownCommands);
- while (!!(ch = stream.lookChar()) && !specialChars[ch.charCodeAt(0)]) {
- // stop if known command is found and next character does not make
- // the str a command
- if (knownCommandFound && !((str + ch) in knownCommands))
- break;
- stream.skip();
- if (str.length == 128)
- error('Command token too long: ' + str.length);
- str += ch;
- knownCommandFound = knownCommands && (str in knownCommands);
- }
- if (str == 'true')
- return true;
- if (str == 'false')
- return false;
- if (str == 'null')
- return null;
- return Cmd.get(str);
- },
- skipToNextLine: function Lexer_skipToNextLine() {
- var stream = this.stream;
- while (true) {
- var ch = stream.getChar();
- if (!ch || ch == '\n')
- return;
- if (ch == '\r') {
- if ((ch = stream.lookChar()) == '\n')
- stream.skip();
- return;
- }
- }
- },
- skip: function Lexer_skip() {
- this.stream.skip();
- }
- };
-
- return Lexer;
-})();
-
-var Linearization = (function LinearizationClosure() {
- function Linearization(stream) {
- this.parser = new Parser(new Lexer(stream), false, null);
- var obj1 = this.parser.getObj();
- var obj2 = this.parser.getObj();
- var obj3 = this.parser.getObj();
- this.linDict = this.parser.getObj();
- if (isInt(obj1) && isInt(obj2) && isCmd(obj3, 'obj') &&
- isDict(this.linDict)) {
- var obj = this.linDict.get('Linearized');
- if (!(isNum(obj) && obj > 0))
- this.linDict = null;
- }
- }
-
- Linearization.prototype = {
- getInt: function Linearization_getInt(name) {
- var linDict = this.linDict;
- var obj;
- if (isDict(linDict) &&
- isInt(obj = linDict.get(name)) &&
- obj > 0) {
- return obj;
- }
- error('"' + name + '" field in linearization table is invalid');
- },
- getHint: function Linearization_getHint(index) {
- var linDict = this.linDict;
- var obj1, obj2;
- if (isDict(linDict) &&
- isArray(obj1 = linDict.get('H')) &&
- obj1.length >= 2 &&
- isInt(obj2 = obj1[index]) &&
- obj2 > 0) {
- return obj2;
- }
- error('Hints table in linearization table is invalid: ' + index);
- },
- get length() {
- if (!isDict(this.linDict))
- return 0;
- return this.getInt('L');
- },
- get hintsOffset() {
- return this.getHint(0);
- },
- get hintsLength() {
- return this.getHint(1);
- },
- get hintsOffset2() {
- return this.getHint(2);
- },
- get hintsLenth2() {
- return this.getHint(3);
- },
- get objectNumberFirst() {
- return this.getInt('O');
- },
- get endFirst() {
- return this.getInt('E');
- },
- get numPages() {
- return this.getInt('N');
- },
- get mainXRefEntriesOffset() {
- return this.getInt('T');
- },
- get pageFirst() {
- return this.getInt('P');
- }
- };
-
- return Linearization;
-})();
-
-
-
-var PatternType = {
- AXIAL: 2,
- RADIAL: 3
-};
-
-var Pattern = (function PatternClosure() {
- // Constructor should define this.getPattern
- function Pattern() {
- error('should not call Pattern constructor');
- }
-
- Pattern.prototype = {
- // Input: current Canvas context
- // Output: the appropriate fillStyle or strokeStyle
- getPattern: function Pattern_getPattern(ctx) {
- error('Should not call Pattern.getStyle: ' + ctx);
- }
- };
-
- Pattern.shadingFromIR = function Pattern_shadingFromIR(raw) {
- return Shadings[raw[0]].fromIR(raw);
- };
-
- Pattern.parseShading = function Pattern_parseShading(shading, matrix, xref,
- res) {
-
- var dict = isStream(shading) ? shading.dict : shading;
- var type = dict.get('ShadingType');
-
- switch (type) {
- case PatternType.AXIAL:
- case PatternType.RADIAL:
- // Both radial and axial shadings are handled by RadialAxial shading.
- return new Shadings.RadialAxial(dict, matrix, xref, res);
- default:
- TODO('Unsupported shading type: ' + type);
- return new Shadings.Dummy();
- }
- };
- return Pattern;
-})();
-
-var Shadings = {};
-
-// A small number to offset the first/last color stops so we can insert ones to
-// support extend. Number.MIN_VALUE appears to be too small and breaks the
-// extend. 1e-7 works in FF but chrome seems to use an even smaller sized number
-// internally so we have to go bigger.
-Shadings.SMALL_NUMBER = 1e-2;
-
-// Radial and axial shading have very similar implementations
-// If needed, the implementations can be broken into two classes
-Shadings.RadialAxial = (function RadialAxialClosure() {
- function RadialAxial(dict, matrix, xref, res, ctx) {
- this.matrix = matrix;
- this.coordsArr = dict.get('Coords');
- this.shadingType = dict.get('ShadingType');
- this.type = 'Pattern';
- this.ctx = ctx;
- var cs = dict.get('ColorSpace', 'CS');
- cs = ColorSpace.parse(cs, xref, res);
- this.cs = cs;
-
- var t0 = 0.0, t1 = 1.0;
- if (dict.has('Domain')) {
- var domainArr = dict.get('Domain');
- t0 = domainArr[0];
- t1 = domainArr[1];
- }
-
- var extendStart = false, extendEnd = false;
- if (dict.has('Extend')) {
- var extendArr = dict.get('Extend');
- extendStart = extendArr[0];
- extendEnd = extendArr[1];
- }
-
- if (this.shadingType === PatternType.RADIAL &&
- (!extendStart || !extendEnd)) {
- // Radial gradient only currently works if either circle is fully within
- // the other circle.
- var x1 = this.coordsArr[0];
- var y1 = this.coordsArr[1];
- var r1 = this.coordsArr[2];
- var x2 = this.coordsArr[3];
- var y2 = this.coordsArr[4];
- var r2 = this.coordsArr[5];
- var distance = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
- if (r1 <= r2 + distance &&
- r2 <= r1 + distance) {
- warn('Unsupported radial gradient.');
- }
- }
-
- this.extendStart = extendStart;
- this.extendEnd = extendEnd;
-
- var fnObj = dict.get('Function');
- if (isArray(fnObj))
- error('No support for array of functions');
- if (!isPDFFunction(fnObj))
- error('Invalid function');
- var fn = PDFFunction.parse(xref, fnObj);
-
- // 10 samples seems good enough for now, but probably won't work
- // if there are sharp color changes. Ideally, we would implement
- // the spec faithfully and add lossless optimizations.
- var diff = t1 - t0;
- var step = diff / 10;
-
- var colorStops = this.colorStops = [];
-
- // Protect against bad domains so we don't end up in an infinte loop below.
- if (t0 >= t1 || step <= 0) {
- // Acrobat doesn't seem to handle these cases so we'll ignore for
- // now.
- info('Bad shading domain.');
- return;
- }
-
- for (var i = t0; i <= t1; i += step) {
- var rgbColor = cs.getRgb(fn([i]));
- var cssColor = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);
- colorStops.push([(i - t0) / diff, cssColor]);
- }
-
- var background = 'transparent';
- if (dict.has('Background')) {
- var rgbColor = cs.getRgb(dict.get('Background'));
- background = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);
- }
-
- if (!extendStart) {
- // Insert a color stop at the front and offset the first real color stop
- // so it doesn't conflict with the one we insert.
- colorStops.unshift([0, background]);
- colorStops[1][0] += Shadings.SMALL_NUMBER;
- }
- if (!extendEnd) {
- // Same idea as above in extendStart but for the end.
- colorStops[colorStops.length - 1][0] -= Shadings.SMALL_NUMBER;
- colorStops.push([1, background]);
- }
-
- this.colorStops = colorStops;
- }
-
- RadialAxial.fromIR = function RadialAxial_fromIR(raw) {
- var type = raw[1];
- var colorStops = raw[2];
- var p0 = raw[3];
- var p1 = raw[4];
- var r0 = raw[5];
- var r1 = raw[6];
- return {
- type: 'Pattern',
- getPattern: function RadialAxial_getPattern(ctx) {
- var grad;
- if (type == PatternType.AXIAL)
- grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]);
- else if (type == PatternType.RADIAL)
- grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1);
-
- for (var i = 0, ii = colorStops.length; i < ii; ++i) {
- var c = colorStops[i];
- grad.addColorStop(c[0], c[1]);
- }
- return grad;
- }
- };
- };
-
- RadialAxial.prototype = {
- getIR: function RadialAxial_getIR() {
- var coordsArr = this.coordsArr;
- var type = this.shadingType;
- if (type == PatternType.AXIAL) {
- var p0 = [coordsArr[0], coordsArr[1]];
- var p1 = [coordsArr[2], coordsArr[3]];
- var r0 = null;
- var r1 = null;
- } else if (type == PatternType.RADIAL) {
- var p0 = [coordsArr[0], coordsArr[1]];
- var p1 = [coordsArr[3], coordsArr[4]];
- var r0 = coordsArr[2];
- var r1 = coordsArr[5];
- } else {
- error('getPattern type unknown: ' + type);
- }
-
- var matrix = this.matrix;
- if (matrix) {
- p0 = Util.applyTransform(p0, matrix);
- p1 = Util.applyTransform(p1, matrix);
- }
-
- return ['RadialAxial', type, this.colorStops, p0, p1, r0, r1];
- }
- };
-
- return RadialAxial;
-})();
-
-Shadings.Dummy = (function DummyClosure() {
- function Dummy() {
- this.type = 'Pattern';
- }
-
- Dummy.fromIR = function Dummy_fromIR() {
- return {
- type: 'Pattern',
- getPattern: function Dummy_fromIR_getPattern() {
- return 'hotpink';
- }
- };
- };
-
- Dummy.prototype = {
- getIR: function Dummy_getIR() {
- return ['Dummy'];
- }
- };
- return Dummy;
-})();
-
-var TilingPattern = (function TilingPatternClosure() {
- var PaintType = {
- COLORED: 1,
- UNCOLORED: 2
- };
- var MAX_PATTERN_SIZE = 512;
-
- function TilingPattern(IR, color, ctx, objs) {
- var operatorList = IR[2];
- this.matrix = IR[3];
- var bbox = IR[4];
- var xstep = IR[5];
- var ystep = IR[6];
- var paintType = IR[7];
- var tilingType = IR[8];
-
- TODO('TilingType: ' + tilingType);
-
- this.curMatrix = ctx.mozCurrentTransform;
- this.ctx = ctx;
- this.type = 'Pattern';
-
- var x0 = bbox[0], y0 = bbox[1], x1 = bbox[2], y1 = bbox[3];
-
- var topLeft = [x0, y0];
- // we want the canvas to be as large as the step size
- var botRight = [x0 + xstep, y0 + ystep];
-
- var width = botRight[0] - topLeft[0];
- var height = botRight[1] - topLeft[1];
-
- // TODO: hack to avoid OOM, we would ideally compute the tiling
- // pattern to be only as large as the acual size in device space
- // This could be computed with .mozCurrentTransform, but still
- // needs to be implemented
- while (Math.abs(width) > MAX_PATTERN_SIZE ||
- Math.abs(height) > MAX_PATTERN_SIZE) {
- width = height = MAX_PATTERN_SIZE;
- }
-
- var tmpCanvas = createScratchCanvas(width, height);
-
- // set the new canvas element context as the graphics context
- var tmpCtx = tmpCanvas.getContext('2d');
- var graphics = new CanvasGraphics(tmpCtx, objs);
-
- switch (paintType) {
- case PaintType.COLORED:
- tmpCtx.fillStyle = ctx.fillStyle;
- tmpCtx.strokeStyle = ctx.strokeStyle;
- break;
- case PaintType.UNCOLORED:
- var cssColor = Util.makeCssRgb(this, color[0], color[1], color[2]);
- tmpCtx.fillStyle = cssColor;
- tmpCtx.strokeStyle = cssColor;
- break;
- default:
- error('Unsupported paint type: ' + paintType);
- }
-
- var scale = [width / xstep, height / ystep];
- this.scale = scale;
-
- // transform coordinates to pattern space
- var tmpTranslate = [1, 0, 0, 1, -topLeft[0], -topLeft[1]];
- var tmpScale = [scale[0], 0, 0, scale[1], 0, 0];
- graphics.transform.apply(graphics, tmpScale);
- graphics.transform.apply(graphics, tmpTranslate);
-
- if (bbox && isArray(bbox) && 4 == bbox.length) {
- var bboxWidth = x1 - x0;
- var bboxHeight = y1 - y0;
- graphics.rectangle(x0, y0, bboxWidth, bboxHeight);
- graphics.clip();
- graphics.endPath();
- }
-
- graphics.executeOperatorList(operatorList);
-
- this.canvas = tmpCanvas;
- }
-
- TilingPattern.getIR = function TilingPattern_getIR(operatorList, dict, args) {
- var matrix = dict.get('Matrix');
- var bbox = dict.get('BBox');
- var xstep = dict.get('XStep');
- var ystep = dict.get('YStep');
- var paintType = dict.get('PaintType');
- var tilingType = dict.get('TilingType');
-
- return [
- 'TilingPattern', args, operatorList, matrix, bbox, xstep, ystep,
- paintType, tilingType
- ];
- };
-
- TilingPattern.prototype = {
- getPattern: function TilingPattern_getPattern() {
- var matrix = this.matrix;
- var curMatrix = this.curMatrix;
- var ctx = this.ctx;
-
- if (curMatrix)
- ctx.setTransform.apply(ctx, curMatrix);
-
- if (matrix)
- ctx.transform.apply(ctx, matrix);
-
- var scale = this.scale;
- ctx.scale(1 / scale[0], 1 / scale[1]);
-
- return ctx.createPattern(this.canvas, 'repeat');
- }
- };
-
- return TilingPattern;
-})();
-
-
-
-var Stream = (function StreamClosure() {
- function Stream(arrayBuffer, start, length, dict) {
- this.bytes = new Uint8Array(arrayBuffer);
- this.start = start || 0;
- this.pos = this.start;
- this.end = (start + length) || this.bytes.length;
- this.dict = dict;
- }
-
- // required methods for a stream. if a particular stream does not
- // implement these, an error should be thrown
- Stream.prototype = {
- get length() {
- return this.end - this.start;
- },
- getByte: function Stream_getByte() {
- if (this.pos >= this.end)
- return null;
- return this.bytes[this.pos++];
- },
- // returns subarray of original buffer
- // should only be read
- getBytes: function Stream_getBytes(length) {
- var bytes = this.bytes;
- var pos = this.pos;
- var strEnd = this.end;
-
- if (!length)
- return bytes.subarray(pos, strEnd);
-
- var end = pos + length;
- if (end > strEnd)
- end = strEnd;
-
- this.pos = end;
- return bytes.subarray(pos, end);
- },
- lookChar: function Stream_lookChar() {
- if (this.pos >= this.end)
- return null;
- return String.fromCharCode(this.bytes[this.pos]);
- },
- getChar: function Stream_getChar() {
- if (this.pos >= this.end)
- return null;
- return String.fromCharCode(this.bytes[this.pos++]);
- },
- skip: function Stream_skip(n) {
- if (!n)
- n = 1;
- this.pos += n;
- },
- reset: function Stream_reset() {
- this.pos = this.start;
- },
- moveStart: function Stream_moveStart() {
- this.start = this.pos;
- },
- makeSubStream: function Stream_makeSubStream(start, length, dict) {
- return new Stream(this.bytes.buffer, start, length, dict);
- },
- isStream: true
- };
-
- return Stream;
-})();
-
-var StringStream = (function StringStreamClosure() {
- function StringStream(str) {
- var length = str.length;
- var bytes = new Uint8Array(length);
- for (var n = 0; n < length; ++n)
- bytes[n] = str.charCodeAt(n);
- Stream.call(this, bytes);
- }
-
- StringStream.prototype = Stream.prototype;
-
- return StringStream;
-})();
-
-// super class for the decoding streams
-var DecodeStream = (function DecodeStreamClosure() {
- function DecodeStream() {
- this.pos = 0;
- this.bufferLength = 0;
- this.eof = false;
- this.buffer = null;
- }
-
- DecodeStream.prototype = {
- ensureBuffer: function DecodeStream_ensureBuffer(requested) {
- var buffer = this.buffer;
- var current = buffer ? buffer.byteLength : 0;
- if (requested < current)
- return buffer;
- var size = 512;
- while (size < requested)
- size <<= 1;
- var buffer2 = new Uint8Array(size);
- for (var i = 0; i < current; ++i)
- buffer2[i] = buffer[i];
- return (this.buffer = buffer2);
- },
- getByte: function DecodeStream_getByte() {
- var pos = this.pos;
- while (this.bufferLength <= pos) {
- if (this.eof)
- return null;
- this.readBlock();
- }
- return this.buffer[this.pos++];
- },
- getBytes: function DecodeStream_getBytes(length) {
- var end, pos = this.pos;
-
- if (length) {
- this.ensureBuffer(pos + length);
- end = pos + length;
-
- while (!this.eof && this.bufferLength < end)
- this.readBlock();
-
- var bufEnd = this.bufferLength;
- if (end > bufEnd)
- end = bufEnd;
- } else {
- while (!this.eof)
- this.readBlock();
-
- end = this.bufferLength;
-
- // checking if bufferLength is still 0 then
- // the buffer has to be initialized
- if (!end)
- this.buffer = new Uint8Array(0);
- }
-
- this.pos = end;
- return this.buffer.subarray(pos, end);
- },
- lookChar: function DecodeStream_lookChar() {
- var pos = this.pos;
- while (this.bufferLength <= pos) {
- if (this.eof)
- return null;
- this.readBlock();
- }
- return String.fromCharCode(this.buffer[this.pos]);
- },
- getChar: function DecodeStream_getChar() {
- var pos = this.pos;
- while (this.bufferLength <= pos) {
- if (this.eof)
- return null;
- this.readBlock();
- }
- return String.fromCharCode(this.buffer[this.pos++]);
- },
- makeSubStream: function DecodeStream_makeSubStream(start, length, dict) {
- var end = start + length;
- while (this.bufferLength <= end && !this.eof)
- this.readBlock();
- return new Stream(this.buffer, start, length, dict);
- },
- skip: function DecodeStream_skip(n) {
- if (!n)
- n = 1;
- this.pos += n;
- },
- reset: function DecodeStream_reset() {
- this.pos = 0;
- }
- };
-
- return DecodeStream;
-})();
-
-var FakeStream = (function FakeStreamClosure() {
- function FakeStream(stream) {
- this.dict = stream.dict;
- DecodeStream.call(this);
- }
-
- FakeStream.prototype = Object.create(DecodeStream.prototype);
- FakeStream.prototype.readBlock = function FakeStream_readBlock() {
- var bufferLength = this.bufferLength;
- bufferLength += 1024;
- var buffer = this.ensureBuffer(bufferLength);
- this.bufferLength = bufferLength;
- };
-
- FakeStream.prototype.getBytes = function FakeStream_getBytes(length) {
- var end, pos = this.pos;
-
- if (length) {
- this.ensureBuffer(pos + length);
- end = pos + length;
-
- while (!this.eof && this.bufferLength < end)
- this.readBlock();
-
- var bufEnd = this.bufferLength;
- if (end > bufEnd)
- end = bufEnd;
- } else {
- this.eof = true;
- end = this.bufferLength;
- }
-
- this.pos = end;
- return this.buffer.subarray(pos, end);
- };
-
- return FakeStream;
-})();
-
-var StreamsSequenceStream = (function StreamsSequenceStreamClosure() {
- function StreamsSequenceStream(streams) {
- this.streams = streams;
- DecodeStream.call(this);
- }
-
- StreamsSequenceStream.prototype = Object.create(DecodeStream.prototype);
-
- StreamsSequenceStream.prototype.readBlock =
- function streamSequenceStreamReadBlock() {
-
- var streams = this.streams;
- if (streams.length == 0) {
- this.eof = true;
- return;
- }
- var stream = streams.shift();
- var chunk = stream.getBytes();
- var bufferLength = this.bufferLength;
- var newLength = bufferLength + chunk.length;
- var buffer = this.ensureBuffer(newLength);
- buffer.set(chunk, bufferLength);
- this.bufferLength = newLength;
- };
-
- return StreamsSequenceStream;
-})();
-
-var FlateStream = (function FlateStreamClosure() {
- var codeLenCodeMap = new Uint32Array([
- 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
- ]);
-
- var lengthDecode = new Uint32Array([
- 0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a,
- 0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f,
- 0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073,
- 0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102
- ]);
-
- var distDecode = new Uint32Array([
- 0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d,
- 0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1,
- 0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01,
- 0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001
- ]);
-
- var fixedLitCodeTab = [new Uint32Array([
- 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0,
- 0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0,
- 0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0,
- 0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0,
- 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8,
- 0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8,
- 0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8,
- 0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8,
- 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4,
- 0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4,
- 0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4,
- 0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4,
- 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc,
- 0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec,
- 0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc,
- 0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc,
- 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2,
- 0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2,
- 0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2,
- 0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2,
- 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca,
- 0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea,
- 0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da,
- 0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa,
- 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6,
- 0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6,
- 0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6,
- 0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6,
- 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce,
- 0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee,
- 0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de,
- 0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe,
- 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1,
- 0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1,
- 0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1,
- 0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1,
- 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9,
- 0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9,
- 0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9,
- 0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9,
- 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5,
- 0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5,
- 0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5,
- 0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5,
- 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd,
- 0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed,
- 0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd,
- 0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd,
- 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3,
- 0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3,
- 0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3,
- 0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3,
- 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb,
- 0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb,
- 0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db,
- 0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb,
- 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7,
- 0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7,
- 0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7,
- 0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7,
- 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf,
- 0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef,
- 0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df,
- 0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff
- ]), 9];
-
- var fixedDistCodeTab = [new Uint32Array([
- 0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c,
- 0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000,
- 0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d,
- 0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000
- ]), 5];
-
- function FlateStream(stream) {
- var bytes = stream.getBytes();
- var bytesPos = 0;
-
- this.dict = stream.dict;
- var cmf = bytes[bytesPos++];
- var flg = bytes[bytesPos++];
- if (cmf == -1 || flg == -1)
- error('Invalid header in flate stream: ' + cmf + ', ' + flg);
- if ((cmf & 0x0f) != 0x08)
- error('Unknown compression method in flate stream: ' + cmf + ', ' + flg);
- if ((((cmf << 8) + flg) % 31) != 0)
- error('Bad FCHECK in flate stream: ' + cmf + ', ' + flg);
- if (flg & 0x20)
- error('FDICT bit set in flate stream: ' + cmf + ', ' + flg);
-
- this.bytes = bytes;
- this.bytesPos = bytesPos;
-
- this.codeSize = 0;
- this.codeBuf = 0;
-
- DecodeStream.call(this);
- }
-
- FlateStream.prototype = Object.create(DecodeStream.prototype);
-
- FlateStream.prototype.getBits = function FlateStream_getBits(bits) {
- var codeSize = this.codeSize;
- var codeBuf = this.codeBuf;
- var bytes = this.bytes;
- var bytesPos = this.bytesPos;
-
- var b;
- while (codeSize < bits) {
- if (typeof (b = bytes[bytesPos++]) == 'undefined')
- error('Bad encoding in flate stream');
- codeBuf |= b << codeSize;
- codeSize += 8;
- }
- b = codeBuf & ((1 << bits) - 1);
- this.codeBuf = codeBuf >> bits;
- this.codeSize = codeSize -= bits;
- this.bytesPos = bytesPos;
- return b;
- };
-
- FlateStream.prototype.getCode = function FlateStream_getCode(table) {
- var codes = table[0];
- var maxLen = table[1];
- var codeSize = this.codeSize;
- var codeBuf = this.codeBuf;
- var bytes = this.bytes;
- var bytesPos = this.bytesPos;
-
- while (codeSize < maxLen) {
- var b;
- if (typeof (b = bytes[bytesPos++]) == 'undefined')
- error('Bad encoding in flate stream');
- codeBuf |= (b << codeSize);
- codeSize += 8;
- }
- var code = codes[codeBuf & ((1 << maxLen) - 1)];
- var codeLen = code >> 16;
- var codeVal = code & 0xffff;
- if (codeSize == 0 || codeSize < codeLen || codeLen == 0)
- error('Bad encoding in flate stream');
- this.codeBuf = (codeBuf >> codeLen);
- this.codeSize = (codeSize - codeLen);
- this.bytesPos = bytesPos;
- return codeVal;
- };
-
- FlateStream.prototype.generateHuffmanTable =
- function flateStreamGenerateHuffmanTable(lengths) {
- var n = lengths.length;
-
- // find max code length
- var maxLen = 0;
- for (var i = 0; i < n; ++i) {
- if (lengths[i] > maxLen)
- maxLen = lengths[i];
- }
-
- // build the table
- var size = 1 << maxLen;
- var codes = new Uint32Array(size);
- for (var len = 1, code = 0, skip = 2;
- len <= maxLen;
- ++len, code <<= 1, skip <<= 1) {
- for (var val = 0; val < n; ++val) {
- if (lengths[val] == len) {
- // bit-reverse the code
- var code2 = 0;
- var t = code;
- for (var i = 0; i < len; ++i) {
- code2 = (code2 << 1) | (t & 1);
- t >>= 1;
- }
-
- // fill the table entries
- for (var i = code2; i < size; i += skip)
- codes[i] = (len << 16) | val;
-
- ++code;
- }
- }
- }
-
- return [codes, maxLen];
- };
-
- FlateStream.prototype.readBlock = function FlateStream_readBlock() {
- // read block header
- var hdr = this.getBits(3);
- if (hdr & 1)
- this.eof = true;
- hdr >>= 1;
-
- if (hdr == 0) { // uncompressed block
- var bytes = this.bytes;
- var bytesPos = this.bytesPos;
- var b;
-
- if (typeof (b = bytes[bytesPos++]) == 'undefined')
- error('Bad block header in flate stream');
- var blockLen = b;
- if (typeof (b = bytes[bytesPos++]) == 'undefined')
- error('Bad block header in flate stream');
- blockLen |= (b << 8);
- if (typeof (b = bytes[bytesPos++]) == 'undefined')
- error('Bad block header in flate stream');
- var check = b;
- if (typeof (b = bytes[bytesPos++]) == 'undefined')
- error('Bad block header in flate stream');
- check |= (b << 8);
- if (check != (~blockLen & 0xffff))
- error('Bad uncompressed block length in flate stream');
-
- this.codeBuf = 0;
- this.codeSize = 0;
-
- var bufferLength = this.bufferLength;
- var buffer = this.ensureBuffer(bufferLength + blockLen);
- var end = bufferLength + blockLen;
- this.bufferLength = end;
- for (var n = bufferLength; n < end; ++n) {
- if (typeof (b = bytes[bytesPos++]) == 'undefined') {
- this.eof = true;
- break;
- }
- buffer[n] = b;
- }
- this.bytesPos = bytesPos;
- return;
- }
-
- var litCodeTable;
- var distCodeTable;
- if (hdr == 1) { // compressed block, fixed codes
- litCodeTable = fixedLitCodeTab;
- distCodeTable = fixedDistCodeTab;
- } else if (hdr == 2) { // compressed block, dynamic codes
- var numLitCodes = this.getBits(5) + 257;
- var numDistCodes = this.getBits(5) + 1;
- var numCodeLenCodes = this.getBits(4) + 4;
-
- // build the code lengths code table
- var codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length);
-
- for (var i = 0; i < numCodeLenCodes; ++i)
- codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3);
- var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths);
-
- // build the literal and distance code tables
- var len = 0;
- var i = 0;
- var codes = numLitCodes + numDistCodes;
- var codeLengths = new Uint8Array(codes);
- while (i < codes) {
- var code = this.getCode(codeLenCodeTab);
- if (code == 16) {
- var bitsLength = 2, bitsOffset = 3, what = len;
- } else if (code == 17) {
- var bitsLength = 3, bitsOffset = 3, what = (len = 0);
- } else if (code == 18) {
- var bitsLength = 7, bitsOffset = 11, what = (len = 0);
- } else {
- codeLengths[i++] = len = code;
- continue;
- }
-
- var repeatLength = this.getBits(bitsLength) + bitsOffset;
- while (repeatLength-- > 0)
- codeLengths[i++] = what;
- }
-
- litCodeTable =
- this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes));
- distCodeTable =
- this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes));
- } else {
- error('Unknown block type in flate stream');
- }
-
- var buffer = this.buffer;
- var limit = buffer ? buffer.length : 0;
- var pos = this.bufferLength;
- while (true) {
- var code1 = this.getCode(litCodeTable);
- if (code1 < 256) {
- if (pos + 1 >= limit) {
- buffer = this.ensureBuffer(pos + 1);
- limit = buffer.length;
- }
- buffer[pos++] = code1;
- continue;
- }
- if (code1 == 256) {
- this.bufferLength = pos;
- return;
- }
- code1 -= 257;
- code1 = lengthDecode[code1];
- var code2 = code1 >> 16;
- if (code2 > 0)
- code2 = this.getBits(code2);
- var len = (code1 & 0xffff) + code2;
- code1 = this.getCode(distCodeTable);
- code1 = distDecode[code1];
- code2 = code1 >> 16;
- if (code2 > 0)
- code2 = this.getBits(code2);
- var dist = (code1 & 0xffff) + code2;
- if (pos + len >= limit) {
- buffer = this.ensureBuffer(pos + len);
- limit = buffer.length;
- }
- for (var k = 0; k < len; ++k, ++pos)
- buffer[pos] = buffer[pos - dist];
- }
- };
-
- return FlateStream;
-})();
-
-var PredictorStream = (function PredictorStreamClosure() {
- function PredictorStream(stream, params) {
- var predictor = this.predictor = params.get('Predictor') || 1;
-
- if (predictor <= 1)
- return stream; // no prediction
- if (predictor !== 2 && (predictor < 10 || predictor > 15))
- error('Unsupported predictor: ' + predictor);
-
- if (predictor === 2)
- this.readBlock = this.readBlockTiff;
- else
- this.readBlock = this.readBlockPng;
-
- this.stream = stream;
- this.dict = stream.dict;
-
- var colors = this.colors = params.get('Colors') || 1;
- var bits = this.bits = params.get('BitsPerComponent') || 8;
- var columns = this.columns = params.get('Columns') || 1;
-
- this.pixBytes = (colors * bits + 7) >> 3;
- this.rowBytes = (columns * colors * bits + 7) >> 3;
-
- DecodeStream.call(this);
- return this;
- }
-
- PredictorStream.prototype = Object.create(DecodeStream.prototype);
-
- PredictorStream.prototype.readBlockTiff =
- function predictorStreamReadBlockTiff() {
- var rowBytes = this.rowBytes;
-
- var bufferLength = this.bufferLength;
- var buffer = this.ensureBuffer(bufferLength + rowBytes);
-
- var bits = this.bits;
- var colors = this.colors;
-
- var rawBytes = this.stream.getBytes(rowBytes);
-
- var inbuf = 0, outbuf = 0;
- var inbits = 0, outbits = 0;
- var pos = bufferLength;
-
- if (bits === 1) {
- for (var i = 0; i < rowBytes; ++i) {
- var c = rawBytes[i];
- inbuf = (inbuf << 8) | c;
- // bitwise addition is exclusive or
- // first shift inbuf and then add
- buffer[pos++] = (c ^ (inbuf >> colors)) & 0xFF;
- // truncate inbuf (assumes colors < 16)
- inbuf &= 0xFFFF;
- }
- } else if (bits === 8) {
- for (var i = 0; i < colors; ++i)
- buffer[pos++] = rawBytes[i];
- for (; i < rowBytes; ++i) {
- buffer[pos] = buffer[pos - colors] + rawBytes[i];
- pos++;
- }
- } else {
- var compArray = new Uint8Array(colors + 1);
- var bitMask = (1 << bits) - 1;
- var j = 0, k = bufferLength;
- var columns = this.columns;
- for (var i = 0; i < columns; ++i) {
- for (var kk = 0; kk < colors; ++kk) {
- if (inbits < bits) {
- inbuf = (inbuf << 8) | (rawBytes[j++] & 0xFF);
- inbits += 8;
- }
- compArray[kk] = (compArray[kk] +
- (inbuf >> (inbits - bits))) & bitMask;
- inbits -= bits;
- outbuf = (outbuf << bits) | compArray[kk];
- outbits += bits;
- if (outbits >= 8) {
- buffer[k++] = (outbuf >> (outbits - 8)) & 0xFF;
- outbits -= 8;
- }
- }
- }
- if (outbits > 0) {
- buffer[k++] = (outbuf << (8 - outbits)) +
- (inbuf & ((1 << (8 - outbits)) - 1));
- }
- }
- this.bufferLength += rowBytes;
- };
-
- PredictorStream.prototype.readBlockPng =
- function predictorStreamReadBlockPng() {
-
- var rowBytes = this.rowBytes;
- var pixBytes = this.pixBytes;
-
- var predictor = this.stream.getByte();
- var rawBytes = this.stream.getBytes(rowBytes);
-
- var bufferLength = this.bufferLength;
- var buffer = this.ensureBuffer(bufferLength + rowBytes);
-
- var prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength);
- if (prevRow.length == 0)
- prevRow = new Uint8Array(rowBytes);
-
- var j = bufferLength;
- switch (predictor) {
- case 0:
- for (var i = 0; i < rowBytes; ++i)
- buffer[j++] = rawBytes[i];
- break;
- case 1:
- for (var i = 0; i < pixBytes; ++i)
- buffer[j++] = rawBytes[i];
- for (; i < rowBytes; ++i) {
- buffer[j] = (buffer[j - pixBytes] + rawBytes[i]) & 0xFF;
- j++;
- }
- break;
- case 2:
- for (var i = 0; i < rowBytes; ++i)
- buffer[j++] = (prevRow[i] + rawBytes[i]) & 0xFF;
- break;
- case 3:
- for (var i = 0; i < pixBytes; ++i)
- buffer[j++] = (prevRow[i] >> 1) + rawBytes[i];
- for (; i < rowBytes; ++i) {
- buffer[j] = (((prevRow[i] + buffer[j - pixBytes]) >> 1) +
- rawBytes[i]) & 0xFF;
- j++;
- }
- break;
- case 4:
- // we need to save the up left pixels values. the simplest way
- // is to create a new buffer
- for (var i = 0; i < pixBytes; ++i) {
- var up = prevRow[i];
- var c = rawBytes[i];
- buffer[j++] = up + c;
- }
- for (; i < rowBytes; ++i) {
- var up = prevRow[i];
- var upLeft = prevRow[i - pixBytes];
- var left = buffer[j - pixBytes];
- var p = left + up - upLeft;
-
- var pa = p - left;
- if (pa < 0)
- pa = -pa;
- var pb = p - up;
- if (pb < 0)
- pb = -pb;
- var pc = p - upLeft;
- if (pc < 0)
- pc = -pc;
-
- var c = rawBytes[i];
- if (pa <= pb && pa <= pc)
- buffer[j++] = left + c;
- else if (pb <= pc)
- buffer[j++] = up + c;
- else
- buffer[j++] = upLeft + c;
- }
- break;
- default:
- error('Unsupported predictor: ' + predictor);
- }
- this.bufferLength += rowBytes;
- };
-
- return PredictorStream;
-})();
-
-/**
- * Depending on the type of JPEG a JpegStream is handled in different ways. For
- * JPEG's that are supported natively such as DeviceGray and DeviceRGB the image
- * data is stored and then loaded by the browser. For unsupported JPEG's we use
- * a library to decode these images and the stream behaves like all the other
- * DecodeStreams.
- */
-var JpegStream = (function JpegStreamClosure() {
- function isAdobeImage(bytes) {
- var maxBytesScanned = Math.max(bytes.length - 16, 1024);
- // Looking for APP14, 'Adobe'
- for (var i = 0; i < maxBytesScanned; ++i) {
- if (bytes[i] == 0xFF && bytes[i + 1] == 0xEE &&
- bytes[i + 2] == 0x00 && bytes[i + 3] == 0x0E &&
- bytes[i + 4] == 0x41 && bytes[i + 5] == 0x64 &&
- bytes[i + 6] == 0x6F && bytes[i + 7] == 0x62 &&
- bytes[i + 8] == 0x65 && bytes[i + 9] == 0x00)
- return true;
- // scanning until frame tag
- if (bytes[i] == 0xFF && bytes[i + 1] == 0xC0)
- break;
- }
- return false;
- }
-
- function fixAdobeImage(bytes) {
- // Inserting 'EMBED' marker after JPEG signature
- var embedMarker = new Uint8Array([0xFF, 0xEC, 0, 8, 0x45, 0x4D, 0x42, 0x45,
- 0x44, 0]);
- var newBytes = new Uint8Array(bytes.length + embedMarker.length);
- newBytes.set(bytes, embedMarker.length);
- // copy JPEG header
- newBytes[0] = bytes[0];
- newBytes[1] = bytes[1];
- newBytes.set(embedMarker, 2);
- return newBytes;
- }
-
- function JpegStream(bytes, dict, xref) {
- // TODO: per poppler, some images may have 'junk' before that
- // need to be removed
- this.dict = dict;
-
- this.isAdobeImage = false;
- this.colorTransform = dict.get('ColorTransform') || -1;
-
- if (isAdobeImage(bytes)) {
- this.isAdobeImage = true;
- bytes = fixAdobeImage(bytes);
- }
-
- this.bytes = bytes;
-
- DecodeStream.call(this);
- }
-
- JpegStream.prototype = Object.create(DecodeStream.prototype);
-
- JpegStream.prototype.ensureBuffer = function JpegStream_ensureBuffer(req) {
- if (this.bufferLength)
- return;
- try {
- var jpegImage = new JpegImage();
- if (this.colorTransform != -1)
- jpegImage.colorTransform = this.colorTransform;
- jpegImage.parse(this.bytes);
- var width = jpegImage.width;
- var height = jpegImage.height;
- var data = jpegImage.getData(width, height);
- this.buffer = data;
- this.bufferLength = data.length;
- } catch (e) {
- error('JPEG error: ' + e);
- }
- };
- JpegStream.prototype.getIR = function JpegStream_getIR() {
- return bytesToString(this.bytes);
- };
- JpegStream.prototype.getChar = function JpegStream_getChar() {
- error('internal error: getChar is not valid on JpegStream');
- };
- /**
- * Checks if the image can be decoded and displayed by the browser without any
- * further processing such as color space conversions.
- */
- JpegStream.prototype.isNativelySupported =
- function JpegStream_isNativelySupported(xref, res) {
- var cs = ColorSpace.parse(this.dict.get('ColorSpace', 'CS'), xref, res);
- // when bug 674619 lands, let's check if browser can do
- // normal cmyk and then we won't need to decode in JS
- if (cs.name === 'DeviceGray' || cs.name === 'DeviceRGB')
- return true;
- if (cs.name === 'DeviceCMYK' && !this.isAdobeImage &&
- this.colorTransform < 1)
- return true;
- return false;
- };
- /**
- * Checks if the image can be decoded by the browser.
- */
- JpegStream.prototype.isNativelyDecodable =
- function JpegStream_isNativelyDecodable(xref, res) {
- var cs = ColorSpace.parse(this.dict.get('ColorSpace', 'CS'), xref, res);
- var numComps = cs.numComps;
- if (numComps == 1 || numComps == 3)
- return true;
-
- return false;
- };
-
- return JpegStream;
-})();
-
-/**
- * For JPEG 2000's we use a library to decode these images and
- * the stream behaves like all the other DecodeStreams.
- */
-var JpxStream = (function JpxStreamClosure() {
- function JpxStream(bytes, dict) {
- this.dict = dict;
- this.bytes = bytes;
-
- DecodeStream.call(this);
- }
-
- JpxStream.prototype = Object.create(DecodeStream.prototype);
-
- JpxStream.prototype.ensureBuffer = function JpxStream_ensureBuffer(req) {
- if (this.bufferLength)
- return;
-
- var jpxImage = new JpxImage();
- jpxImage.parse(this.bytes);
-
- var width = jpxImage.width;
- var height = jpxImage.height;
- var componentsCount = jpxImage.componentsCount;
- if (componentsCount != 1 && componentsCount != 3 && componentsCount != 4)
- error('JPX with ' + componentsCount + ' components is not supported');
-
- var data = new Uint8Array(width * height * componentsCount);
-
- for (var k = 0, kk = jpxImage.tiles.length; k < kk; k++) {
- var tileCompoments = jpxImage.tiles[k];
- var tileWidth = tileCompoments[0].width;
- var tileHeight = tileCompoments[0].height;
- var tileLeft = tileCompoments[0].left;
- var tileTop = tileCompoments[0].top;
-
- var dataPosition, sourcePosition, data0, data1, data2, data3, rowFeed;
- switch (componentsCount) {
- case 1:
- data0 = tileCompoments[0].items;
-
- dataPosition = width * tileTop + tileLeft;
- rowFeed = width - tileWidth;
- sourcePosition = 0;
- for (var j = 0; j < tileHeight; j++) {
- for (var i = 0; i < tileWidth; i++)
- data[dataPosition++] = data0[sourcePosition++];
- dataPosition += rowFeed;
- }
- break;
- case 3:
- data0 = tileCompoments[0].items;
- data1 = tileCompoments[1].items;
- data2 = tileCompoments[2].items;
-
- dataPosition = (width * tileTop + tileLeft) * 3;
- rowFeed = (width - tileWidth) * 3;
- sourcePosition = 0;
- for (var j = 0; j < tileHeight; j++) {
- for (var i = 0; i < tileWidth; i++) {
- data[dataPosition++] = data0[sourcePosition];
- data[dataPosition++] = data1[sourcePosition];
- data[dataPosition++] = data2[sourcePosition];
- sourcePosition++;
- }
- dataPosition += rowFeed;
- }
- break;
- case 4:
- data0 = tileCompoments[0].items;
- data1 = tileCompoments[1].items;
- data2 = tileCompoments[2].items;
- data3 = tileCompoments[3].items;
-
- dataPosition = (width * tileTop + tileLeft) * 4;
- rowFeed = (width - tileWidth) * 4;
- sourcePosition = 0;
- for (var j = 0; j < tileHeight; j++) {
- for (var i = 0; i < tileWidth; i++) {
- data[dataPosition++] = data0[sourcePosition];
- data[dataPosition++] = data1[sourcePosition];
- data[dataPosition++] = data2[sourcePosition];
- data[dataPosition++] = data3[sourcePosition];
- sourcePosition++;
- }
- dataPosition += rowFeed;
- }
- break;
- }
- }
-
- this.buffer = data;
- this.bufferLength = data.length;
- };
- JpxStream.prototype.getChar = function JpxStream_getChar() {
- error('internal error: getChar is not valid on JpxStream');
- };
-
- return JpxStream;
-})();
-
-/**
- * For JBIG2's we use a library to decode these images and
- * the stream behaves like all the other DecodeStreams.
- */
-var Jbig2Stream = (function Jbig2StreamClosure() {
- function Jbig2Stream(bytes, dict) {
- this.dict = dict;
- this.bytes = bytes;
-
- DecodeStream.call(this);
- }
-
- Jbig2Stream.prototype = Object.create(DecodeStream.prototype);
-
- Jbig2Stream.prototype.ensureBuffer = function Jbig2Stream_ensureBuffer(req) {
- if (this.bufferLength)
- return;
-
- var jbig2Image = new Jbig2Image();
-
- var chunks = [], decodeParams = this.dict.get('DecodeParms');
- if (decodeParams && decodeParams.has('JBIG2Globals')) {
- var globalsStream = decodeParams.get('JBIG2Globals');
- var globals = globalsStream.getBytes();
- chunks.push({data: globals, start: 0, end: globals.length});
- }
- chunks.push({data: this.bytes, start: 0, end: this.bytes.length});
- var data = jbig2Image.parseChunks(chunks);
- var dataLength = data.length;
-
- // JBIG2 had black as 1 and white as 0, inverting the colors
- for (var i = 0; i < dataLength; i++)
- data[i] ^= 0xFF;
-
- this.buffer = data;
- this.bufferLength = dataLength;
- };
- Jbig2Stream.prototype.getChar = function Jbig2Stream_getChar() {
- error('internal error: getChar is not valid on Jbig2Stream');
- };
-
- return Jbig2Stream;
-})();
-
-var DecryptStream = (function DecryptStreamClosure() {
- function DecryptStream(str, decrypt) {
- this.str = str;
- this.dict = str.dict;
- this.decrypt = decrypt;
-
- DecodeStream.call(this);
- }
-
- var chunkSize = 512;
-
- DecryptStream.prototype = Object.create(DecodeStream.prototype);
-
- DecryptStream.prototype.readBlock = function DecryptStream_readBlock() {
- var chunk = this.str.getBytes(chunkSize);
- if (!chunk || chunk.length == 0) {
- this.eof = true;
- return;
- }
- var decrypt = this.decrypt;
- chunk = decrypt(chunk);
-
- var bufferLength = this.bufferLength;
- var i, n = chunk.length;
- var buffer = this.ensureBuffer(bufferLength + n);
- for (i = 0; i < n; i++)
- buffer[bufferLength++] = chunk[i];
- this.bufferLength = bufferLength;
- };
-
- return DecryptStream;
-})();
-
-var Ascii85Stream = (function Ascii85StreamClosure() {
- function Ascii85Stream(str) {
- this.str = str;
- this.dict = str.dict;
- this.input = new Uint8Array(5);
-
- DecodeStream.call(this);
- }
-
- Ascii85Stream.prototype = Object.create(DecodeStream.prototype);
-
- Ascii85Stream.prototype.readBlock = function Ascii85Stream_readBlock() {
- var tildaCode = '~'.charCodeAt(0);
- var zCode = 'z'.charCodeAt(0);
- var str = this.str;
-
- var c = str.getByte();
- while (Lexer.isSpace(String.fromCharCode(c)))
- c = str.getByte();
-
- if (!c || c === tildaCode) {
- this.eof = true;
- return;
- }
-
- var bufferLength = this.bufferLength, buffer;
-
- // special code for z
- if (c == zCode) {
- buffer = this.ensureBuffer(bufferLength + 4);
- for (var i = 0; i < 4; ++i)
- buffer[bufferLength + i] = 0;
- this.bufferLength += 4;
- } else {
- var input = this.input;
- input[0] = c;
- for (var i = 1; i < 5; ++i) {
- c = str.getByte();
- while (Lexer.isSpace(String.fromCharCode(c)))
- c = str.getByte();
-
- input[i] = c;
-
- if (!c || c == tildaCode)
- break;
- }
- buffer = this.ensureBuffer(bufferLength + i - 1);
- this.bufferLength += i - 1;
-
- // partial ending;
- if (i < 5) {
- for (; i < 5; ++i)
- input[i] = 0x21 + 84;
- this.eof = true;
- }
- var t = 0;
- for (var i = 0; i < 5; ++i)
- t = t * 85 + (input[i] - 0x21);
-
- for (var i = 3; i >= 0; --i) {
- buffer[bufferLength + i] = t & 0xFF;
- t >>= 8;
- }
- }
- };
-
- return Ascii85Stream;
-})();
-
-var AsciiHexStream = (function AsciiHexStreamClosure() {
- function AsciiHexStream(str) {
- this.str = str;
- this.dict = str.dict;
-
- DecodeStream.call(this);
- }
-
- var hexvalueMap = {
- 9: -1, // \t
- 32: -1, // space
- 48: 0,
- 49: 1,
- 50: 2,
- 51: 3,
- 52: 4,
- 53: 5,
- 54: 6,
- 55: 7,
- 56: 8,
- 57: 9,
- 65: 10,
- 66: 11,
- 67: 12,
- 68: 13,
- 69: 14,
- 70: 15,
- 97: 10,
- 98: 11,
- 99: 12,
- 100: 13,
- 101: 14,
- 102: 15
- };
-
- AsciiHexStream.prototype = Object.create(DecodeStream.prototype);
-
- AsciiHexStream.prototype.readBlock = function AsciiHexStream_readBlock() {
- var gtCode = '>'.charCodeAt(0), bytes = this.str.getBytes(), c, n,
- decodeLength, buffer, bufferLength, i, length;
-
- decodeLength = (bytes.length + 1) >> 1;
- buffer = this.ensureBuffer(this.bufferLength + decodeLength);
- bufferLength = this.bufferLength;
-
- for (i = 0, length = bytes.length; i < length; i++) {
- c = hexvalueMap[bytes[i]];
- while (c == -1 && (i + 1) < length) {
- c = hexvalueMap[bytes[++i]];
- }
-
- if ((i + 1) < length && (bytes[i + 1] !== gtCode)) {
- n = hexvalueMap[bytes[++i]];
- buffer[bufferLength++] = c * 16 + n;
- } else {
- // EOD marker at an odd number, behave as if a 0 followed the last
- // digit.
- if (bytes[i] !== gtCode) {
- buffer[bufferLength++] = c * 16;
- }
- }
- }
-
- this.bufferLength = bufferLength;
- this.eof = true;
- };
-
- return AsciiHexStream;
-})();
-
-var RunLengthStream = (function RunLengthStreamClosure() {
- function RunLengthStream(str) {
- this.str = str;
- this.dict = str.dict;
-
- DecodeStream.call(this);
- }
-
- RunLengthStream.prototype = Object.create(DecodeStream.prototype);
-
- RunLengthStream.prototype.readBlock = function RunLengthStream_readBlock() {
- // The repeatHeader has following format. The first byte defines type of run
- // and amount of bytes to repeat/copy: n = 0 through 127 - copy next n bytes
- // (in addition to the second byte from the header), n = 129 through 255 -
- // duplicate the second byte from the header (257 - n) times, n = 128 - end.
- var repeatHeader = this.str.getBytes(2);
- if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] == 128) {
- this.eof = true;
- return;
- }
-
- var bufferLength = this.bufferLength;
- var n = repeatHeader[0];
- if (n < 128) {
- // copy n bytes
- var buffer = this.ensureBuffer(bufferLength + n + 1);
- buffer[bufferLength++] = repeatHeader[1];
- if (n > 0) {
- var source = this.str.getBytes(n);
- buffer.set(source, bufferLength);
- bufferLength += n;
- }
- } else {
- n = 257 - n;
- var b = repeatHeader[1];
- var buffer = this.ensureBuffer(bufferLength + n + 1);
- for (var i = 0; i < n; i++)
- buffer[bufferLength++] = b;
- }
- this.bufferLength = bufferLength;
- };
-
- return RunLengthStream;
-})();
-
-var CCITTFaxStream = (function CCITTFaxStreamClosure() {
-
- var ccittEOL = -2;
- var twoDimPass = 0;
- var twoDimHoriz = 1;
- var twoDimVert0 = 2;
- var twoDimVertR1 = 3;
- var twoDimVertL1 = 4;
- var twoDimVertR2 = 5;
- var twoDimVertL2 = 6;
- var twoDimVertR3 = 7;
- var twoDimVertL3 = 8;
-
- var twoDimTable = [
- [-1, -1], [-1, -1], // 000000x
- [7, twoDimVertL3], // 0000010
- [7, twoDimVertR3], // 0000011
- [6, twoDimVertL2], [6, twoDimVertL2], // 000010x
- [6, twoDimVertR2], [6, twoDimVertR2], // 000011x
- [4, twoDimPass], [4, twoDimPass], // 0001xxx
- [4, twoDimPass], [4, twoDimPass],
- [4, twoDimPass], [4, twoDimPass],
- [4, twoDimPass], [4, twoDimPass],
- [3, twoDimHoriz], [3, twoDimHoriz], // 001xxxx
- [3, twoDimHoriz], [3, twoDimHoriz],
- [3, twoDimHoriz], [3, twoDimHoriz],
- [3, twoDimHoriz], [3, twoDimHoriz],
- [3, twoDimHoriz], [3, twoDimHoriz],
- [3, twoDimHoriz], [3, twoDimHoriz],
- [3, twoDimHoriz], [3, twoDimHoriz],
- [3, twoDimHoriz], [3, twoDimHoriz],
- [3, twoDimVertL1], [3, twoDimVertL1], // 010xxxx
- [3, twoDimVertL1], [3, twoDimVertL1],
- [3, twoDimVertL1], [3, twoDimVertL1],
- [3, twoDimVertL1], [3, twoDimVertL1],
- [3, twoDimVertL1], [3, twoDimVertL1],
- [3, twoDimVertL1], [3, twoDimVertL1],
- [3, twoDimVertL1], [3, twoDimVertL1],
- [3, twoDimVertL1], [3, twoDimVertL1],
- [3, twoDimVertR1], [3, twoDimVertR1], // 011xxxx
- [3, twoDimVertR1], [3, twoDimVertR1],
- [3, twoDimVertR1], [3, twoDimVertR1],
- [3, twoDimVertR1], [3, twoDimVertR1],
- [3, twoDimVertR1], [3, twoDimVertR1],
- [3, twoDimVertR1], [3, twoDimVertR1],
- [3, twoDimVertR1], [3, twoDimVertR1],
- [3, twoDimVertR1], [3, twoDimVertR1],
- [1, twoDimVert0], [1, twoDimVert0], // 1xxxxxx
- [1, twoDimVert0], [1, twoDimVert0],
- [1, twoDimVert0], [1, twoDimVert0],
- [1, twoDimVert0], [1, twoDimVert0],
- [1, twoDimVert0], [1, twoDimVert0],
- [1, twoDimVert0], [1, twoDimVert0],
- [1, twoDimVert0], [1, twoDimVert0],
- [1, twoDimVert0], [1, twoDimVert0],
- [1, twoDimVert0], [1, twoDimVert0],
- [1, twoDimVert0], [1, twoDimVert0],
- [1, twoDimVert0], [1, twoDimVert0],
- [1, twoDimVert0], [1, twoDimVert0],
- [1, twoDimVert0], [1, twoDimVert0],
- [1, twoDimVert0], [1, twoDimVert0],
- [1, twoDimVert0], [1, twoDimVert0],
- [1, twoDimVert0], [1, twoDimVert0],
- [1, twoDimVert0], [1, twoDimVert0],
- [1, twoDimVert0], [1, twoDimVert0],
- [1, twoDimVert0], [1, twoDimVert0],
- [1, twoDimVert0], [1, twoDimVert0],
- [1, twoDimVert0], [1, twoDimVert0],
- [1, twoDimVert0], [1, twoDimVert0],
- [1, twoDimVert0], [1, twoDimVert0],
- [1, twoDimVert0], [1, twoDimVert0],
- [1, twoDimVert0], [1, twoDimVert0],
- [1, twoDimVert0], [1, twoDimVert0],
- [1, twoDimVert0], [1, twoDimVert0],
- [1, twoDimVert0], [1, twoDimVert0],
- [1, twoDimVert0], [1, twoDimVert0],
- [1, twoDimVert0], [1, twoDimVert0],
- [1, twoDimVert0], [1, twoDimVert0],
- [1, twoDimVert0], [1, twoDimVert0]
- ];
-
- var whiteTable1 = [
- [-1, -1], // 00000
- [12, ccittEOL], // 00001
- [-1, -1], [-1, -1], // 0001x
- [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 001xx
- [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 010xx
- [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 011xx
- [11, 1792], [11, 1792], // 1000x
- [12, 1984], // 10010
- [12, 2048], // 10011
- [12, 2112], // 10100
- [12, 2176], // 10101
- [12, 2240], // 10110
- [12, 2304], // 10111
- [11, 1856], [11, 1856], // 1100x
- [11, 1920], [11, 1920], // 1101x
- [12, 2368], // 11100
- [12, 2432], // 11101
- [12, 2496], // 11110
- [12, 2560] // 11111
- ];
-
- var whiteTable2 = [
- [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000000xx
- [8, 29], [8, 29], // 00000010x
- [8, 30], [8, 30], // 00000011x
- [8, 45], [8, 45], // 00000100x
- [8, 46], [8, 46], // 00000101x
- [7, 22], [7, 22], [7, 22], [7, 22], // 0000011xx
- [7, 23], [7, 23], [7, 23], [7, 23], // 0000100xx
- [8, 47], [8, 47], // 00001010x
- [8, 48], [8, 48], // 00001011x
- [6, 13], [6, 13], [6, 13], [6, 13], // 000011xxx
- [6, 13], [6, 13], [6, 13], [6, 13],
- [7, 20], [7, 20], [7, 20], [7, 20], // 0001000xx
- [8, 33], [8, 33], // 00010010x
- [8, 34], [8, 34], // 00010011x
- [8, 35], [8, 35], // 00010100x
- [8, 36], [8, 36], // 00010101x
- [8, 37], [8, 37], // 00010110x
- [8, 38], [8, 38], // 00010111x
- [7, 19], [7, 19], [7, 19], [7, 19], // 0001100xx
- [8, 31], [8, 31], // 00011010x
- [8, 32], [8, 32], // 00011011x
- [6, 1], [6, 1], [6, 1], [6, 1], // 000111xxx
- [6, 1], [6, 1], [6, 1], [6, 1],
- [6, 12], [6, 12], [6, 12], [6, 12], // 001000xxx
- [6, 12], [6, 12], [6, 12], [6, 12],
- [8, 53], [8, 53], // 00100100x
- [8, 54], [8, 54], // 00100101x
- [7, 26], [7, 26], [7, 26], [7, 26], // 0010011xx
- [8, 39], [8, 39], // 00101000x
- [8, 40], [8, 40], // 00101001x
- [8, 41], [8, 41], // 00101010x
- [8, 42], [8, 42], // 00101011x
- [8, 43], [8, 43], // 00101100x
- [8, 44], [8, 44], // 00101101x
- [7, 21], [7, 21], [7, 21], [7, 21], // 0010111xx
- [7, 28], [7, 28], [7, 28], [7, 28], // 0011000xx
- [8, 61], [8, 61], // 00110010x
- [8, 62], [8, 62], // 00110011x
- [8, 63], [8, 63], // 00110100x
- [8, 0], [8, 0], // 00110101x
- [8, 320], [8, 320], // 00110110x
- [8, 384], [8, 384], // 00110111x
- [5, 10], [5, 10], [5, 10], [5, 10], // 00111xxxx
- [5, 10], [5, 10], [5, 10], [5, 10],
- [5, 10], [5, 10], [5, 10], [5, 10],
- [5, 10], [5, 10], [5, 10], [5, 10],
- [5, 11], [5, 11], [5, 11], [5, 11], // 01000xxxx
- [5, 11], [5, 11], [5, 11], [5, 11],
- [5, 11], [5, 11], [5, 11], [5, 11],
- [5, 11], [5, 11], [5, 11], [5, 11],
- [7, 27], [7, 27], [7, 27], [7, 27], // 0100100xx
- [8, 59], [8, 59], // 01001010x
- [8, 60], [8, 60], // 01001011x
- [9, 1472], // 010011000
- [9, 1536], // 010011001
- [9, 1600], // 010011010
- [9, 1728], // 010011011
- [7, 18], [7, 18], [7, 18], [7, 18], // 0100111xx
- [7, 24], [7, 24], [7, 24], [7, 24], // 0101000xx
- [8, 49], [8, 49], // 01010010x
- [8, 50], [8, 50], // 01010011x
- [8, 51], [8, 51], // 01010100x
- [8, 52], [8, 52], // 01010101x
- [7, 25], [7, 25], [7, 25], [7, 25], // 0101011xx
- [8, 55], [8, 55], // 01011000x
- [8, 56], [8, 56], // 01011001x
- [8, 57], [8, 57], // 01011010x
- [8, 58], [8, 58], // 01011011x
- [6, 192], [6, 192], [6, 192], [6, 192], // 010111xxx
- [6, 192], [6, 192], [6, 192], [6, 192],
- [6, 1664], [6, 1664], [6, 1664], [6, 1664], // 011000xxx
- [6, 1664], [6, 1664], [6, 1664], [6, 1664],
- [8, 448], [8, 448], // 01100100x
- [8, 512], [8, 512], // 01100101x
- [9, 704], // 011001100
- [9, 768], // 011001101
- [8, 640], [8, 640], // 01100111x
- [8, 576], [8, 576], // 01101000x
- [9, 832], // 011010010
- [9, 896], // 011010011
- [9, 960], // 011010100
- [9, 1024], // 011010101
- [9, 1088], // 011010110
- [9, 1152], // 011010111
- [9, 1216], // 011011000
- [9, 1280], // 011011001
- [9, 1344], // 011011010
- [9, 1408], // 011011011
- [7, 256], [7, 256], [7, 256], [7, 256], // 0110111xx
- [4, 2], [4, 2], [4, 2], [4, 2], // 0111xxxxx
- [4, 2], [4, 2], [4, 2], [4, 2],
- [4, 2], [4, 2], [4, 2], [4, 2],
- [4, 2], [4, 2], [4, 2], [4, 2],
- [4, 2], [4, 2], [4, 2], [4, 2],
- [4, 2], [4, 2], [4, 2], [4, 2],
- [4, 2], [4, 2], [4, 2], [4, 2],
- [4, 2], [4, 2], [4, 2], [4, 2],
- [4, 3], [4, 3], [4, 3], [4, 3], // 1000xxxxx
- [4, 3], [4, 3], [4, 3], [4, 3],
- [4, 3], [4, 3], [4, 3], [4, 3],
- [4, 3], [4, 3], [4, 3], [4, 3],
- [4, 3], [4, 3], [4, 3], [4, 3],
- [4, 3], [4, 3], [4, 3], [4, 3],
- [4, 3], [4, 3], [4, 3], [4, 3],
- [4, 3], [4, 3], [4, 3], [4, 3],
- [5, 128], [5, 128], [5, 128], [5, 128], // 10010xxxx
- [5, 128], [5, 128], [5, 128], [5, 128],
- [5, 128], [5, 128], [5, 128], [5, 128],
- [5, 128], [5, 128], [5, 128], [5, 128],
- [5, 8], [5, 8], [5, 8], [5, 8], // 10011xxxx
- [5, 8], [5, 8], [5, 8], [5, 8],
- [5, 8], [5, 8], [5, 8], [5, 8],
- [5, 8], [5, 8], [5, 8], [5, 8],
- [5, 9], [5, 9], [5, 9], [5, 9], // 10100xxxx
- [5, 9], [5, 9], [5, 9], [5, 9],
- [5, 9], [5, 9], [5, 9], [5, 9],
- [5, 9], [5, 9], [5, 9], [5, 9],
- [6, 16], [6, 16], [6, 16], [6, 16], // 101010xxx
- [6, 16], [6, 16], [6, 16], [6, 16],
- [6, 17], [6, 17], [6, 17], [6, 17], // 101011xxx
- [6, 17], [6, 17], [6, 17], [6, 17],
- [4, 4], [4, 4], [4, 4], [4, 4], // 1011xxxxx
- [4, 4], [4, 4], [4, 4], [4, 4],
- [4, 4], [4, 4], [4, 4], [4, 4],
- [4, 4], [4, 4], [4, 4], [4, 4],
- [4, 4], [4, 4], [4, 4], [4, 4],
- [4, 4], [4, 4], [4, 4], [4, 4],
- [4, 4], [4, 4], [4, 4], [4, 4],
- [4, 4], [4, 4], [4, 4], [4, 4],
- [4, 5], [4, 5], [4, 5], [4, 5], // 1100xxxxx
- [4, 5], [4, 5], [4, 5], [4, 5],
- [4, 5], [4, 5], [4, 5], [4, 5],
- [4, 5], [4, 5], [4, 5], [4, 5],
- [4, 5], [4, 5], [4, 5], [4, 5],
- [4, 5], [4, 5], [4, 5], [4, 5],
- [4, 5], [4, 5], [4, 5], [4, 5],
- [4, 5], [4, 5], [4, 5], [4, 5],
- [6, 14], [6, 14], [6, 14], [6, 14], // 110100xxx
- [6, 14], [6, 14], [6, 14], [6, 14],
- [6, 15], [6, 15], [6, 15], [6, 15], // 110101xxx
- [6, 15], [6, 15], [6, 15], [6, 15],
- [5, 64], [5, 64], [5, 64], [5, 64], // 11011xxxx
- [5, 64], [5, 64], [5, 64], [5, 64],
- [5, 64], [5, 64], [5, 64], [5, 64],
- [5, 64], [5, 64], [5, 64], [5, 64],
- [4, 6], [4, 6], [4, 6], [4, 6], // 1110xxxxx
- [4, 6], [4, 6], [4, 6], [4, 6],
- [4, 6], [4, 6], [4, 6], [4, 6],
- [4, 6], [4, 6], [4, 6], [4, 6],
- [4, 6], [4, 6], [4, 6], [4, 6],
- [4, 6], [4, 6], [4, 6], [4, 6],
- [4, 6], [4, 6], [4, 6], [4, 6],
- [4, 6], [4, 6], [4, 6], [4, 6],
- [4, 7], [4, 7], [4, 7], [4, 7], // 1111xxxxx
- [4, 7], [4, 7], [4, 7], [4, 7],
- [4, 7], [4, 7], [4, 7], [4, 7],
- [4, 7], [4, 7], [4, 7], [4, 7],
- [4, 7], [4, 7], [4, 7], [4, 7],
- [4, 7], [4, 7], [4, 7], [4, 7],
- [4, 7], [4, 7], [4, 7], [4, 7],
- [4, 7], [4, 7], [4, 7], [4, 7]
- ];
-
- var blackTable1 = [
- [-1, -1], [-1, -1], // 000000000000x
- [12, ccittEOL], [12, ccittEOL], // 000000000001x
- [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000001xx
- [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000010xx
- [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000011xx
- [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000100xx
- [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000101xx
- [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000110xx
- [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000111xx
- [11, 1792], [11, 1792], [11, 1792], [11, 1792], // 00000001000xx
- [12, 1984], [12, 1984], // 000000010010x
- [12, 2048], [12, 2048], // 000000010011x
- [12, 2112], [12, 2112], // 000000010100x
- [12, 2176], [12, 2176], // 000000010101x
- [12, 2240], [12, 2240], // 000000010110x
- [12, 2304], [12, 2304], // 000000010111x
- [11, 1856], [11, 1856], [11, 1856], [11, 1856], // 00000001100xx
- [11, 1920], [11, 1920], [11, 1920], [11, 1920], // 00000001101xx
- [12, 2368], [12, 2368], // 000000011100x
- [12, 2432], [12, 2432], // 000000011101x
- [12, 2496], [12, 2496], // 000000011110x
- [12, 2560], [12, 2560], // 000000011111x
- [10, 18], [10, 18], [10, 18], [10, 18], // 0000001000xxx
- [10, 18], [10, 18], [10, 18], [10, 18],
- [12, 52], [12, 52], // 000000100100x
- [13, 640], // 0000001001010
- [13, 704], // 0000001001011
- [13, 768], // 0000001001100
- [13, 832], // 0000001001101
- [12, 55], [12, 55], // 000000100111x
- [12, 56], [12, 56], // 000000101000x
- [13, 1280], // 0000001010010
- [13, 1344], // 0000001010011
- [13, 1408], // 0000001010100
- [13, 1472], // 0000001010101
- [12, 59], [12, 59], // 000000101011x
- [12, 60], [12, 60], // 000000101100x
- [13, 1536], // 0000001011010
- [13, 1600], // 0000001011011
- [11, 24], [11, 24], [11, 24], [11, 24], // 00000010111xx
- [11, 25], [11, 25], [11, 25], [11, 25], // 00000011000xx
- [13, 1664], // 0000001100100
- [13, 1728], // 0000001100101
- [12, 320], [12, 320], // 000000110011x
- [12, 384], [12, 384], // 000000110100x
- [12, 448], [12, 448], // 000000110101x
- [13, 512], // 0000001101100
- [13, 576], // 0000001101101
- [12, 53], [12, 53], // 000000110111x
- [12, 54], [12, 54], // 000000111000x
- [13, 896], // 0000001110010
- [13, 960], // 0000001110011
- [13, 1024], // 0000001110100
- [13, 1088], // 0000001110101
- [13, 1152], // 0000001110110
- [13, 1216], // 0000001110111
- [10, 64], [10, 64], [10, 64], [10, 64], // 0000001111xxx
- [10, 64], [10, 64], [10, 64], [10, 64]
- ];
-
- var blackTable2 = [
- [8, 13], [8, 13], [8, 13], [8, 13], // 00000100xxxx
- [8, 13], [8, 13], [8, 13], [8, 13],
- [8, 13], [8, 13], [8, 13], [8, 13],
- [8, 13], [8, 13], [8, 13], [8, 13],
- [11, 23], [11, 23], // 00000101000x
- [12, 50], // 000001010010
- [12, 51], // 000001010011
- [12, 44], // 000001010100
- [12, 45], // 000001010101
- [12, 46], // 000001010110
- [12, 47], // 000001010111
- [12, 57], // 000001011000
- [12, 58], // 000001011001
- [12, 61], // 000001011010
- [12, 256], // 000001011011
- [10, 16], [10, 16], [10, 16], [10, 16], // 0000010111xx
- [10, 17], [10, 17], [10, 17], [10, 17], // 0000011000xx
- [12, 48], // 000001100100
- [12, 49], // 000001100101
- [12, 62], // 000001100110
- [12, 63], // 000001100111
- [12, 30], // 000001101000
- [12, 31], // 000001101001
- [12, 32], // 000001101010
- [12, 33], // 000001101011
- [12, 40], // 000001101100
- [12, 41], // 000001101101
- [11, 22], [11, 22], // 00000110111x
- [8, 14], [8, 14], [8, 14], [8, 14], // 00000111xxxx
- [8, 14], [8, 14], [8, 14], [8, 14],
- [8, 14], [8, 14], [8, 14], [8, 14],
- [8, 14], [8, 14], [8, 14], [8, 14],
- [7, 10], [7, 10], [7, 10], [7, 10], // 0000100xxxxx
- [7, 10], [7, 10], [7, 10], [7, 10],
- [7, 10], [7, 10], [7, 10], [7, 10],
- [7, 10], [7, 10], [7, 10], [7, 10],
- [7, 10], [7, 10], [7, 10], [7, 10],
- [7, 10], [7, 10], [7, 10], [7, 10],
- [7, 10], [7, 10], [7, 10], [7, 10],
- [7, 10], [7, 10], [7, 10], [7, 10],
- [7, 11], [7, 11], [7, 11], [7, 11], // 0000101xxxxx
- [7, 11], [7, 11], [7, 11], [7, 11],
- [7, 11], [7, 11], [7, 11], [7, 11],
- [7, 11], [7, 11], [7, 11], [7, 11],
- [7, 11], [7, 11], [7, 11], [7, 11],
- [7, 11], [7, 11], [7, 11], [7, 11],
- [7, 11], [7, 11], [7, 11], [7, 11],
- [7, 11], [7, 11], [7, 11], [7, 11],
- [9, 15], [9, 15], [9, 15], [9, 15], // 000011000xxx
- [9, 15], [9, 15], [9, 15], [9, 15],
- [12, 128], // 000011001000
- [12, 192], // 000011001001
- [12, 26], // 000011001010
- [12, 27], // 000011001011
- [12, 28], // 000011001100
- [12, 29], // 000011001101
- [11, 19], [11, 19], // 00001100111x
- [11, 20], [11, 20], // 00001101000x
- [12, 34], // 000011010010
- [12, 35], // 000011010011
- [12, 36], // 000011010100
- [12, 37], // 000011010101
- [12, 38], // 000011010110
- [12, 39], // 000011010111
- [11, 21], [11, 21], // 00001101100x
- [12, 42], // 000011011010
- [12, 43], // 000011011011
- [10, 0], [10, 0], [10, 0], [10, 0], // 0000110111xx
- [7, 12], [7, 12], [7, 12], [7, 12], // 0000111xxxxx
- [7, 12], [7, 12], [7, 12], [7, 12],
- [7, 12], [7, 12], [7, 12], [7, 12],
- [7, 12], [7, 12], [7, 12], [7, 12],
- [7, 12], [7, 12], [7, 12], [7, 12],
- [7, 12], [7, 12], [7, 12], [7, 12],
- [7, 12], [7, 12], [7, 12], [7, 12],
- [7, 12], [7, 12], [7, 12], [7, 12]
- ];
-
- var blackTable3 = [
- [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000xx
- [6, 9], // 000100
- [6, 8], // 000101
- [5, 7], [5, 7], // 00011x
- [4, 6], [4, 6], [4, 6], [4, 6], // 0010xx
- [4, 5], [4, 5], [4, 5], [4, 5], // 0011xx
- [3, 1], [3, 1], [3, 1], [3, 1], // 010xxx
- [3, 1], [3, 1], [3, 1], [3, 1],
- [3, 4], [3, 4], [3, 4], [3, 4], // 011xxx
- [3, 4], [3, 4], [3, 4], [3, 4],
- [2, 3], [2, 3], [2, 3], [2, 3], // 10xxxx
- [2, 3], [2, 3], [2, 3], [2, 3],
- [2, 3], [2, 3], [2, 3], [2, 3],
- [2, 3], [2, 3], [2, 3], [2, 3],
- [2, 2], [2, 2], [2, 2], [2, 2], // 11xxxx
- [2, 2], [2, 2], [2, 2], [2, 2],
- [2, 2], [2, 2], [2, 2], [2, 2],
- [2, 2], [2, 2], [2, 2], [2, 2]
- ];
-
- function CCITTFaxStream(str, params) {
- this.str = str;
- this.dict = str.dict;
-
- params = params || new Dict();
-
- this.encoding = params.get('K') || 0;
- this.eoline = params.get('EndOfLine') || false;
- this.byteAlign = params.get('EncodedByteAlign') || false;
- this.columns = params.get('Columns') || 1728;
- this.rows = params.get('Rows') || 0;
- var eoblock = params.get('EndOfBlock');
- if (eoblock == null)
- eoblock = true;
- this.eoblock = eoblock;
- this.black = params.get('BlackIs1') || false;
-
- this.codingLine = new Uint32Array(this.columns + 1);
- this.refLine = new Uint32Array(this.columns + 2);
-
- this.codingLine[0] = this.columns;
- this.codingPos = 0;
-
- this.row = 0;
- this.nextLine2D = this.encoding < 0;
- this.inputBits = 0;
- this.inputBuf = 0;
- this.outputBits = 0;
- this.buf = EOF;
-
- var code1;
- while ((code1 = this.lookBits(12)) == 0) {
- this.eatBits(1);
- }
- if (code1 == 1) {
- this.eatBits(12);
- }
- if (this.encoding > 0) {
- this.nextLine2D = !this.lookBits(1);
- this.eatBits(1);
- }
-
- DecodeStream.call(this);
- }
-
- CCITTFaxStream.prototype = Object.create(DecodeStream.prototype);
-
- CCITTFaxStream.prototype.readBlock = function CCITTFaxStream_readBlock() {
- while (!this.eof) {
- var c = this.lookChar();
- this.buf = EOF;
- this.ensureBuffer(this.bufferLength + 1);
- this.buffer[this.bufferLength++] = c;
- }
- };
-
- CCITTFaxStream.prototype.addPixels =
- function ccittFaxStreamAddPixels(a1, blackPixels) {
- var codingLine = this.codingLine;
- var codingPos = this.codingPos;
-
- if (a1 > codingLine[codingPos]) {
- if (a1 > this.columns) {
- info('row is wrong length');
- this.err = true;
- a1 = this.columns;
- }
- if ((codingPos & 1) ^ blackPixels) {
- ++codingPos;
- }
-
- codingLine[codingPos] = a1;
- }
- this.codingPos = codingPos;
- };
-
- CCITTFaxStream.prototype.addPixelsNeg =
- function ccittFaxStreamAddPixelsNeg(a1, blackPixels) {
- var codingLine = this.codingLine;
- var codingPos = this.codingPos;
-
- if (a1 > codingLine[codingPos]) {
- if (a1 > this.columns) {
- info('row is wrong length');
- this.err = true;
- a1 = this.columns;
- }
- if ((codingPos & 1) ^ blackPixels)
- ++codingPos;
-
- codingLine[codingPos] = a1;
- } else if (a1 < codingLine[codingPos]) {
- if (a1 < 0) {
- info('invalid code');
- this.err = true;
- a1 = 0;
- }
- while (codingPos > 0 && a1 < codingLine[codingPos - 1])
- --codingPos;
- codingLine[codingPos] = a1;
- }
-
- this.codingPos = codingPos;
- };
-
- CCITTFaxStream.prototype.lookChar = function CCITTFaxStream_lookChar() {
- if (this.buf != EOF)
- return this.buf;
-
- var refLine = this.refLine;
- var codingLine = this.codingLine;
- var columns = this.columns;
-
- var refPos, blackPixels, bits;
-
- if (this.outputBits == 0) {
- if (this.eof)
- return null;
-
- this.err = false;
-
- var code1, code2, code3;
- if (this.nextLine2D) {
- for (var i = 0; codingLine[i] < columns; ++i)
- refLine[i] = codingLine[i];
-
- refLine[i++] = columns;
- refLine[i] = columns;
- codingLine[0] = 0;
- this.codingPos = 0;
- refPos = 0;
- blackPixels = 0;
-
- while (codingLine[this.codingPos] < columns) {
- code1 = this.getTwoDimCode();
- switch (code1) {
- case twoDimPass:
- this.addPixels(refLine[refPos + 1], blackPixels);
- if (refLine[refPos + 1] < columns)
- refPos += 2;
- break;
- case twoDimHoriz:
- code1 = code2 = 0;
- if (blackPixels) {
- do {
- code1 += (code3 = this.getBlackCode());
- } while (code3 >= 64);
- do {
- code2 += (code3 = this.getWhiteCode());
- } while (code3 >= 64);
- } else {
- do {
- code1 += (code3 = this.getWhiteCode());
- } while (code3 >= 64);
- do {
- code2 += (code3 = this.getBlackCode());
- } while (code3 >= 64);
- }
- this.addPixels(codingLine[this.codingPos] +
- code1, blackPixels);
- if (codingLine[this.codingPos] < columns) {
- this.addPixels(codingLine[this.codingPos] + code2,
- blackPixels ^ 1);
- }
- while (refLine[refPos] <= codingLine[this.codingPos] &&
- refLine[refPos] < columns) {
- refPos += 2;
- }
- break;
- case twoDimVertR3:
- this.addPixels(refLine[refPos] + 3, blackPixels);
- blackPixels ^= 1;
- if (codingLine[this.codingPos] < columns) {
- ++refPos;
- while (refLine[refPos] <= codingLine[this.codingPos] &&
- refLine[refPos] < columns)
- refPos += 2;
- }
- break;
- case twoDimVertR2:
- this.addPixels(refLine[refPos] + 2, blackPixels);
- blackPixels ^= 1;
- if (codingLine[this.codingPos] < columns) {
- ++refPos;
- while (refLine[refPos] <= codingLine[this.codingPos] &&
- refLine[refPos] < columns) {
- refPos += 2;
- }
- }
- break;
- case twoDimVertR1:
- this.addPixels(refLine[refPos] + 1, blackPixels);
- blackPixels ^= 1;
- if (codingLine[this.codingPos] < columns) {
- ++refPos;
- while (refLine[refPos] <= codingLine[this.codingPos] &&
- refLine[refPos] < columns)
- refPos += 2;
- }
- break;
- case twoDimVert0:
- this.addPixels(refLine[refPos], blackPixels);
- blackPixels ^= 1;
- if (codingLine[this.codingPos] < columns) {
- ++refPos;
- while (refLine[refPos] <= codingLine[this.codingPos] &&
- refLine[refPos] < columns)
- refPos += 2;
- }
- break;
- case twoDimVertL3:
- this.addPixelsNeg(refLine[refPos] - 3, blackPixels);
- blackPixels ^= 1;
- if (codingLine[this.codingPos] < columns) {
- if (refPos > 0)
- --refPos;
- else
- ++refPos;
- while (refLine[refPos] <= codingLine[this.codingPos] &&
- refLine[refPos] < columns)
- refPos += 2;
- }
- break;
- case twoDimVertL2:
- this.addPixelsNeg(refLine[refPos] - 2, blackPixels);
- blackPixels ^= 1;
- if (codingLine[this.codingPos] < columns) {
- if (refPos > 0)
- --refPos;
- else
- ++refPos;
- while (refLine[refPos] <= codingLine[this.codingPos] &&
- refLine[refPos] < columns)
- refPos += 2;
- }
- break;
- case twoDimVertL1:
- this.addPixelsNeg(refLine[refPos] - 1, blackPixels);
- blackPixels ^= 1;
- if (codingLine[this.codingPos] < columns) {
- if (refPos > 0)
- --refPos;
- else
- ++refPos;
-
- while (refLine[refPos] <= codingLine[this.codingPos] &&
- refLine[refPos] < columns)
- refPos += 2;
- }
- break;
- case EOF:
- this.addPixels(columns, 0);
- this.eof = true;
- break;
- default:
- info('bad 2d code');
- this.addPixels(columns, 0);
- this.err = true;
- }
- }
- } else {
- codingLine[0] = 0;
- this.codingPos = 0;
- blackPixels = 0;
- while (codingLine[this.codingPos] < columns) {
- code1 = 0;
- if (blackPixels) {
- do {
- code1 += (code3 = this.getBlackCode());
- } while (code3 >= 64);
- } else {
- do {
- code1 += (code3 = this.getWhiteCode());
- } while (code3 >= 64);
- }
- this.addPixels(codingLine[this.codingPos] + code1, blackPixels);
- blackPixels ^= 1;
- }
- }
-
- if (this.byteAlign)
- this.inputBits &= ~7;
-
- var gotEOL = false;
-
- if (!this.eoblock && this.row == this.rows - 1) {
- this.eof = true;
- } else {
- code1 = this.lookBits(12);
- while (code1 == 0) {
- this.eatBits(1);
- code1 = this.lookBits(12);
- }
- if (code1 == 1) {
- this.eatBits(12);
- gotEOL = true;
- } else if (code1 == EOF) {
- this.eof = true;
- }
- }
-
- if (!this.eof && this.encoding > 0) {
- this.nextLine2D = !this.lookBits(1);
- this.eatBits(1);
- }
-
- if (this.eoblock && gotEOL) {
- code1 = this.lookBits(12);
- if (code1 == 1) {
- this.eatBits(12);
- if (this.encoding > 0) {
- this.lookBits(1);
- this.eatBits(1);
- }
- if (this.encoding >= 0) {
- for (var i = 0; i < 4; ++i) {
- code1 = this.lookBits(12);
- if (code1 != 1)
- info('bad rtc code: ' + code1);
- this.eatBits(12);
- if (this.encoding > 0) {
- this.lookBits(1);
- this.eatBits(1);
- }
- }
- }
- this.eof = true;
- }
- } else if (this.err && this.eoline) {
- while (true) {
- code1 = this.lookBits(13);
- if (code1 == EOF) {
- this.eof = true;
- return null;
- }
- if ((code1 >> 1) == 1) {
- break;
- }
- this.eatBits(1);
- }
- this.eatBits(12);
- if (this.encoding > 0) {
- this.eatBits(1);
- this.nextLine2D = !(code1 & 1);
- }
- }
-
- if (codingLine[0] > 0)
- this.outputBits = codingLine[this.codingPos = 0];
- else
- this.outputBits = codingLine[this.codingPos = 1];
- this.row++;
- }
-
- if (this.outputBits >= 8) {
- this.buf = (this.codingPos & 1) ? 0 : 0xFF;
- this.outputBits -= 8;
- if (this.outputBits == 0 && codingLine[this.codingPos] < columns) {
- this.codingPos++;
- this.outputBits = (codingLine[this.codingPos] -
- codingLine[this.codingPos - 1]);
- }
- } else {
- var bits = 8;
- this.buf = 0;
- do {
- if (this.outputBits > bits) {
- this.buf <<= bits;
- if (!(this.codingPos & 1)) {
- this.buf |= 0xFF >> (8 - bits);
- }
- this.outputBits -= bits;
- bits = 0;
- } else {
- this.buf <<= this.outputBits;
- if (!(this.codingPos & 1)) {
- this.buf |= 0xFF >> (8 - this.outputBits);
- }
- bits -= this.outputBits;
- this.outputBits = 0;
- if (codingLine[this.codingPos] < columns) {
- this.codingPos++;
- this.outputBits = (codingLine[this.codingPos] -
- codingLine[this.codingPos - 1]);
- } else if (bits > 0) {
- this.buf <<= bits;
- bits = 0;
- }
- }
- } while (bits);
- }
- if (this.black) {
- this.buf ^= 0xFF;
- }
- return this.buf;
- };
-
- // This functions returns the code found from the table.
- // The start and end parameters set the boundaries for searching the table.
- // The limit parameter is optional. Function returns an array with three
- // values. The first array element indicates whether a valid code is being
- // returned. The second array element is the actual code. The third array
- // element indicates whether EOF was reached.
- CCITTFaxStream.prototype.findTableCode =
- function ccittFaxStreamFindTableCode(start, end, table, limit) {
-
- var limitValue = limit || 0;
- for (var i = start; i <= end; ++i) {
- var code = this.lookBits(i);
- if (code == EOF)
- return [true, 1, false];
- if (i < end)
- code <<= end - i;
- if (!limitValue || code >= limitValue) {
- var p = table[code - limitValue];
- if (p[0] == i) {
- this.eatBits(i);
- return [true, p[1], true];
- }
- }
- }
- return [false, 0, false];
- };
-
- CCITTFaxStream.prototype.getTwoDimCode =
- function ccittFaxStreamGetTwoDimCode() {
-
- var code = 0;
- var p;
- if (this.eoblock) {
- code = this.lookBits(7);
- p = twoDimTable[code];
- if (p && p[0] > 0) {
- this.eatBits(p[0]);
- return p[1];
- }
- } else {
- var result = this.findTableCode(1, 7, twoDimTable);
- if (result[0] && result[2])
- return result[1];
- }
- info('Bad two dim code');
- return EOF;
- };
-
- CCITTFaxStream.prototype.getWhiteCode =
- function ccittFaxStreamGetWhiteCode() {
-
- var code = 0;
- var p;
- var n;
- if (this.eoblock) {
- code = this.lookBits(12);
- if (code == EOF)
- return 1;
-
- if ((code >> 5) == 0)
- p = whiteTable1[code];
- else
- p = whiteTable2[code >> 3];
-
- if (p[0] > 0) {
- this.eatBits(p[0]);
- return p[1];
- }
- } else {
- var result = this.findTableCode(1, 9, whiteTable2);
- if (result[0])
- return result[1];
-
- result = this.findTableCode(11, 12, whiteTable1);
- if (result[0])
- return result[1];
- }
- info('bad white code');
- this.eatBits(1);
- return 1;
- };
-
- CCITTFaxStream.prototype.getBlackCode =
- function ccittFaxStreamGetBlackCode() {
-
- var code, p;
- if (this.eoblock) {
- code = this.lookBits(13);
- if (code == EOF)
- return 1;
- if ((code >> 7) == 0)
- p = blackTable1[code];
- else if ((code >> 9) == 0 && (code >> 7) != 0)
- p = blackTable2[(code >> 1) - 64];
- else
- p = blackTable3[code >> 7];
-
- if (p[0] > 0) {
- this.eatBits(p[0]);
- return p[1];
- }
- } else {
- var result = this.findTableCode(2, 6, blackTable3);
- if (result[0])
- return result[1];
-
- result = this.findTableCode(7, 12, blackTable2, 64);
- if (result[0])
- return result[1];
-
- result = this.findTableCode(10, 13, blackTable1);
- if (result[0])
- return result[1];
- }
- info('bad black code');
- this.eatBits(1);
- return 1;
- };
-
- CCITTFaxStream.prototype.lookBits = function CCITTFaxStream_lookBits(n) {
- var c;
- while (this.inputBits < n) {
- if ((c = this.str.getByte()) == null) {
- if (this.inputBits == 0)
- return EOF;
- return ((this.inputBuf << (n - this.inputBits)) &
- (0xFFFF >> (16 - n)));
- }
- this.inputBuf = (this.inputBuf << 8) + c;
- this.inputBits += 8;
- }
- return (this.inputBuf >> (this.inputBits - n)) & (0xFFFF >> (16 - n));
- };
-
- CCITTFaxStream.prototype.eatBits = function CCITTFaxStream_eatBits(n) {
- if ((this.inputBits -= n) < 0)
- this.inputBits = 0;
- };
-
- return CCITTFaxStream;
-})();
-
-var LZWStream = (function LZWStreamClosure() {
- function LZWStream(str, earlyChange) {
- this.str = str;
- this.dict = str.dict;
- this.cachedData = 0;
- this.bitsCached = 0;
-
- var maxLzwDictionarySize = 4096;
- var lzwState = {
- earlyChange: earlyChange,
- codeLength: 9,
- nextCode: 258,
- dictionaryValues: new Uint8Array(maxLzwDictionarySize),
- dictionaryLengths: new Uint16Array(maxLzwDictionarySize),
- dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize),
- currentSequence: new Uint8Array(maxLzwDictionarySize),
- currentSequenceLength: 0
- };
- for (var i = 0; i < 256; ++i) {
- lzwState.dictionaryValues[i] = i;
- lzwState.dictionaryLengths[i] = 1;
- }
- this.lzwState = lzwState;
-
- DecodeStream.call(this);
- }
-
- LZWStream.prototype = Object.create(DecodeStream.prototype);
-
- LZWStream.prototype.readBits = function LZWStream_readBits(n) {
- var bitsCached = this.bitsCached;
- var cachedData = this.cachedData;
- while (bitsCached < n) {
- var c = this.str.getByte();
- if (c == null) {
- this.eof = true;
- return null;
- }
- cachedData = (cachedData << 8) | c;
- bitsCached += 8;
- }
- this.bitsCached = (bitsCached -= n);
- this.cachedData = cachedData;
- this.lastCode = null;
- return (cachedData >>> bitsCached) & ((1 << n) - 1);
- };
-
- LZWStream.prototype.readBlock = function LZWStream_readBlock() {
- var blockSize = 512;
- var estimatedDecodedSize = blockSize * 2, decodedSizeDelta = blockSize;
- var i, j, q;
-
- var lzwState = this.lzwState;
- if (!lzwState)
- return; // eof was found
-
- var earlyChange = lzwState.earlyChange;
- var nextCode = lzwState.nextCode;
- var dictionaryValues = lzwState.dictionaryValues;
- var dictionaryLengths = lzwState.dictionaryLengths;
- var dictionaryPrevCodes = lzwState.dictionaryPrevCodes;
- var codeLength = lzwState.codeLength;
- var prevCode = lzwState.prevCode;
- var currentSequence = lzwState.currentSequence;
- var currentSequenceLength = lzwState.currentSequenceLength;
-
- var decodedLength = 0;
- var currentBufferLength = this.bufferLength;
- var buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
-
- for (i = 0; i < blockSize; i++) {
- var code = this.readBits(codeLength);
- var hasPrev = currentSequenceLength > 0;
- if (code < 256) {
- currentSequence[0] = code;
- currentSequenceLength = 1;
- } else if (code >= 258) {
- if (code < nextCode) {
- currentSequenceLength = dictionaryLengths[code];
- for (j = currentSequenceLength - 1, q = code; j >= 0; j--) {
- currentSequence[j] = dictionaryValues[q];
- q = dictionaryPrevCodes[q];
- }
- } else {
- currentSequence[currentSequenceLength++] = currentSequence[0];
- }
- } else if (code == 256) {
- codeLength = 9;
- nextCode = 258;
- currentSequenceLength = 0;
- continue;
- } else {
- this.eof = true;
- delete this.lzwState;
- break;
- }
-
- if (hasPrev) {
- dictionaryPrevCodes[nextCode] = prevCode;
- dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1;
- dictionaryValues[nextCode] = currentSequence[0];
- nextCode++;
- codeLength = (nextCode + earlyChange) & (nextCode + earlyChange - 1) ?
- codeLength : Math.min(Math.log(nextCode + earlyChange) /
- 0.6931471805599453 + 1, 12) | 0;
- }
- prevCode = code;
-
- decodedLength += currentSequenceLength;
- if (estimatedDecodedSize < decodedLength) {
- do {
- estimatedDecodedSize += decodedSizeDelta;
- } while (estimatedDecodedSize < decodedLength);
- buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
- }
- for (j = 0; j < currentSequenceLength; j++)
- buffer[currentBufferLength++] = currentSequence[j];
- }
- lzwState.nextCode = nextCode;
- lzwState.codeLength = codeLength;
- lzwState.prevCode = prevCode;
- lzwState.currentSequenceLength = currentSequenceLength;
-
- this.bufferLength = currentBufferLength;
- };
-
- return LZWStream;
-})();
-
-
-
-function MessageHandler(name, comObj) {
- this.name = name;
- this.comObj = comObj;
- this.callbackIndex = 1;
- var callbacks = this.callbacks = {};
- var ah = this.actionHandler = {};
-
- ah['console_log'] = [function ahConsoleLog(data) {
- log.apply(null, data);
- }];
- // If there's no console available, console_error in the
- // action handler will do nothing.
- if ('console' in globalScope) {
- ah['console_error'] = [function ahConsoleError(data) {
- globalScope['console'].error.apply(null, data);
- }];
- } else {
- ah['console_error'] = [function ahConsoleError(data) {
- log.apply(null, data);
- }];
- }
- ah['_warn'] = [function ah_Warn(data) {
- warn(data);
- }];
-
- comObj.onmessage = function messageHandlerComObjOnMessage(event) {
- var data = event.data;
- if (data.isReply) {
- var callbackId = data.callbackId;
- if (data.callbackId in callbacks) {
- var callback = callbacks[callbackId];
- delete callbacks[callbackId];
- callback(data.data);
- } else {
- error('Cannot resolve callback ' + callbackId);
- }
- } else if (data.action in ah) {
- var action = ah[data.action];
- if (data.callbackId) {
- var promise = new Promise();
- promise.then(function(resolvedData) {
- comObj.postMessage({
- isReply: true,
- callbackId: data.callbackId,
- data: resolvedData
- });
- });
- action[0].call(action[1], data.data, promise);
- } else {
- action[0].call(action[1], data.data);
- }
- } else {
- error('Unkown action from worker: ' + data.action);
- }
- };
-}
-
-MessageHandler.prototype = {
- on: function messageHandlerOn(actionName, handler, scope) {
- var ah = this.actionHandler;
- if (ah[actionName]) {
- error('There is already an actionName called "' + actionName + '"');
- }
- ah[actionName] = [handler, scope];
- },
- /**
- * Sends a message to the comObj to invoke the action with the supplied data.
- * @param {String} actionName Action to call.
- * @param {JSON} data JSON data to send.
- * @param {function} [callback] Optional callback that will handle a reply.
- */
- send: function messageHandlerSend(actionName, data, callback) {
- var message = {
- action: actionName,
- data: data
- };
- if (callback) {
- var callbackId = this.callbackIndex++;
- this.callbacks[callbackId] = callback;
- message.callbackId = callbackId;
- }
- this.comObj.postMessage(message);
- }
-};
-
-var WorkerMessageHandler = {
- setup: function wphSetup(handler) {
- var pdfModel = null;
-
- function loadDocument(pdfData, pdfModelSource) {
- // Create only the model of the PDFDoc, which is enough for
- // processing the content of the pdf.
- var pdfPassword = pdfModelSource.password;
- try {
- pdfModel = new PDFDocument(new Stream(pdfData), pdfPassword);
- } catch (e) {
- if (e instanceof PasswordException) {
- if (e.code === 'needpassword') {
- handler.send('NeedPassword', {
- exception: e
- });
- } else if (e.code === 'incorrectpassword') {
- handler.send('IncorrectPassword', {
- exception: e
- });
- }
-
- return;
- } else {
- throw e;
- }
- }
- var doc = {
- numPages: pdfModel.numPages,
- fingerprint: pdfModel.getFingerprint(),
- destinations: pdfModel.catalog.destinations,
- outline: pdfModel.catalog.documentOutline,
- info: pdfModel.getDocumentInfo(),
- metadata: pdfModel.catalog.metadata,
- encrypted: !!pdfModel.xref.encrypt
- };
- handler.send('GetDoc', {pdfInfo: doc});
- }
-
- handler.on('test', function wphSetupTest(data) {
- handler.send('test', data instanceof Uint8Array);
- });
-
- handler.on('GetDocRequest', function wphSetupDoc(data) {
- var source = data.source;
- if (source.data) {
- // the data is array, instantiating directly from it
- loadDocument(source.data, source);
- return;
- }
-
- PDFJS.getPdf(
- {
- url: source.url,
- progress: function getPDFProgress(evt) {
- handler.send('DocProgress', {
- loaded: evt.loaded,
- total: evt.lengthComputable ? evt.total : void(0)
- });
- },
- error: function getPDFError(e) {
- handler.send('DocError', 'Unexpected server response of ' +
- e.target.status + '.');
- },
- headers: source.httpHeaders
- },
- function getPDFLoad(data) {
- loadDocument(data, source);
- });
- });
-
- handler.on('GetPageRequest', function wphSetupGetPage(data) {
- var pageNumber = data.pageIndex + 1;
- var pdfPage = pdfModel.getPage(pageNumber);
- var page = {
- pageIndex: data.pageIndex,
- rotate: pdfPage.rotate,
- ref: pdfPage.ref,
- view: pdfPage.view
- };
- handler.send('GetPage', {pageInfo: page});
- });
-
- handler.on('GetData', function wphSetupGetData(data, promise) {
- promise.resolve(pdfModel.stream.bytes);
- });
-
- handler.on('GetAnnotationsRequest', function wphSetupGetAnnotations(data) {
- var pdfPage = pdfModel.getPage(data.pageIndex + 1);
- handler.send('GetAnnotations', {
- pageIndex: data.pageIndex,
- annotations: pdfPage.getAnnotations()
- });
- });
-
- handler.on('RenderPageRequest', function wphSetupRenderPage(data) {
- var pageNum = data.pageIndex + 1;
-
- // The following code does quite the same as
- // Page.prototype.startRendering, but stops at one point and sends the
- // result back to the main thread.
- var gfx = new CanvasGraphics(null);
-
- var start = Date.now();
-
- var dependency = [];
- var operatorList = null;
- try {
- var page = pdfModel.getPage(pageNum);
- // Pre compile the pdf page and fetch the fonts/images.
- operatorList = page.getOperatorList(handler, dependency);
- } catch (e) {
- var minimumStackMessage =
- 'worker.js: while trying to getPage() and getOperatorList()';
-
- // Turn the error into an obj that can be serialized
- if (typeof e === 'string') {
- e = {
- message: e,
- stack: minimumStackMessage
- };
- } else if (typeof e === 'object') {
- e = {
- message: e.message || e.toString(),
- stack: e.stack || minimumStackMessage
- };
- } else {
- e = {
- message: 'Unknown exception type: ' + (typeof e),
- stack: minimumStackMessage
- };
- }
-
- handler.send('PageError', {
- pageNum: pageNum,
- error: e
- });
- return;
- }
-
- log('page=%d - getOperatorList: time=%dms, len=%d', pageNum,
- Date.now() - start, operatorList.fnArray.length);
-
- // Filter the dependecies for fonts.
- var fonts = {};
- for (var i = 0, ii = dependency.length; i < ii; i++) {
- var dep = dependency[i];
- if (dep.indexOf('font_') == 0) {
- fonts[dep] = true;
- }
- }
- handler.send('RenderPage', {
- pageIndex: data.pageIndex,
- operatorList: operatorList,
- depFonts: Object.keys(fonts)
- });
- }, this);
-
- handler.on('GetTextContent', function wphExtractText(data, promise) {
- var pageNum = data.pageIndex + 1;
- var start = Date.now();
-
- var textContent = '';
- try {
- var page = pdfModel.getPage(pageNum);
- textContent = page.extractTextContent();
- promise.resolve(textContent);
- } catch (e) {
- // Skip errored pages
- promise.reject(e);
- }
-
- log('text indexing: page=%d - time=%dms',
- pageNum, Date.now() - start);
- });
- }
-};
-
-var consoleTimer = {};
-
-var workerConsole = {
- log: function log() {
- var args = Array.prototype.slice.call(arguments);
- globalScope.postMessage({
- action: 'console_log',
- data: args
- });
- },
-
- error: function error() {
- var args = Array.prototype.slice.call(arguments);
- globalScope.postMessage({
- action: 'console_error',
- data: args
- });
- throw 'pdf.js execution error';
- },
-
- time: function time(name) {
- consoleTimer[name] = Date.now();
- },
-
- timeEnd: function timeEnd(name) {
- var time = consoleTimer[name];
- if (time == null) {
- error('Unkown timer name ' + name);
- }
- this.log('Timer:', name, Date.now() - time);
- }
-};
-
-// Worker thread?
-if (typeof window === 'undefined') {
- globalScope.console = workerConsole;
-
- // Add a logger so we can pass warnings on to the main thread, errors will
- // throw an exception which will be forwarded on automatically.
- PDFJS.LogManager.addLogger({
- warn: function(msg) {
- globalScope.postMessage({
- action: '_warn',
- data: msg
- });
- }
- });
-
- var handler = new MessageHandler('worker_processor', this);
- WorkerMessageHandler.setup(handler);
-}
-
-
-
-var JpxImage = (function JpxImageClosure() {
- // Table E.1
- var SubbandsGainLog2 = {
- 'LL': 0,
- 'LH': 1,
- 'HL': 1,
- 'HH': 2
- };
- function JpxImage() {
- this.failOnCorruptedImage = false;
- }
- JpxImage.prototype = {
- load: function JpxImage_load(url) {
- var xhr = new XMLHttpRequest();
- xhr.open('GET', url, true);
- xhr.responseType = 'arraybuffer';
- xhr.onload = (function() {
- // TODO catch parse error
- var data = new Uint8Array(xhr.response || xhr.mozResponseArrayBuffer);
- this.parse(data);
- if (this.onload)
- this.onload();
- }).bind(this);
- xhr.send(null);
- },
- parse: function JpxImage_parse(data) {
- function ReadUint(data, offset, bytes) {
- var n = 0;
- for (var i = 0; i < bytes; i++)
- n = n * 256 + (data[offset + i] & 0xFF);
- return n;
- }
- var position = 0, length = data.length;
- while (position < length) {
- var headerSize = 8;
- var lbox = ReadUint(data, position, 4);
- var tbox = ReadUint(data, position + 4, 4);
- position += headerSize;
- if (lbox == 1) {
- lbox = ReadUint(data, position, 8);
- position += 8;
- headerSize += 8;
- }
- if (lbox == 0)
- lbox = length - position + headerSize;
- if (lbox < headerSize)
- error('JPX error: Invalid box field size');
- var dataLength = lbox - headerSize;
- var jumpDataLength = true;
- switch (tbox) {
- case 0x6A501A1A: // 'jP\032\032'
- // TODO
- break;
- case 0x6A703268: // 'jp2h'
- jumpDataLength = false; // parsing child boxes
- break;
- case 0x636F6C72: // 'colr'
- // TODO
- break;
- case 0x6A703263: // 'jp2c'
- this.parseCodestream(data, position, position + dataLength);
- break;
- }
- if (jumpDataLength)
- position += dataLength;
- }
- },
- parseCodestream: function JpxImage_parseCodestream(data, start, end) {
- var context = {};
- try {
- var position = start;
- while (position < end) {
- var code = readUint16(data, position);
- position += 2;
-
- var length = 0, j;
- switch (code) {
- case 0xFF4F: // Start of codestream (SOC)
- context.mainHeader = true;
- break;
- case 0xFFD9: // End of codestream (EOC)
- break;
- case 0xFF51: // Image and tile size (SIZ)
- length = readUint16(data, position);
- var siz = {};
- siz.Xsiz = readUint32(data, position + 4);
- siz.Ysiz = readUint32(data, position + 8);
- siz.XOsiz = readUint32(data, position + 12);
- siz.YOsiz = readUint32(data, position + 16);
- siz.XTsiz = readUint32(data, position + 20);
- siz.YTsiz = readUint32(data, position + 24);
- siz.XTOsiz = readUint32(data, position + 28);
- siz.YTOsiz = readUint32(data, position + 32);
- var componentsCount = readUint16(data, position + 36);
- siz.Csiz = componentsCount;
- var components = [];
- j = position + 38;
- for (var i = 0; i < componentsCount; i++) {
- var component = {
- precision: (data[j] & 0x7F) + 1,
- isSigned: !!(data[j] & 0x80),
- XRsiz: data[j + 1],
- YRsiz: data[j + 1]
- };
- calculateComponentDimensions(component, siz);
- components.push(component);
- }
- context.SIZ = siz;
- context.components = components;
- calculateTileGrids(context, components);
- context.QCC = [];
- context.COC = [];
- break;
- case 0xFF5C: // Quantization default (QCD)
- length = readUint16(data, position);
- var qcd = {};
- j = position + 2;
- var sqcd = data[j++];
- var spqcdSize, scalarExpounded;
- switch (sqcd & 0x1F) {
- case 0:
- spqcdSize = 8;
- scalarExpounded = true;
- break;
- case 1:
- spqcdSize = 16;
- scalarExpounded = false;
- break;
- case 2:
- spqcdSize = 16;
- scalarExpounded = true;
- break;
- default:
- throw 'Invalid SQcd value ' + sqcd;
- }
- qcd.noQuantization = spqcdSize == 8;
- qcd.scalarExpounded = scalarExpounded;
- qcd.guardBits = sqcd >> 5;
- var spqcds = [];
- while (j < length + position) {
- var spqcd = {};
- if (spqcdSize == 8) {
- spqcd.epsilon = data[j++] >> 3;
- spqcd.mu = 0;
- } else {
- spqcd.epsilon = data[j] >> 3;
- spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1];
- j += 2;
- }
- spqcds.push(spqcd);
- }
- qcd.SPqcds = spqcds;
- if (context.mainHeader)
- context.QCD = qcd;
- else {
- context.currentTile.QCD = qcd;
- context.currentTile.QCC = [];
- }
- break;
- case 0xFF5D: // Quantization component (QCC)
- length = readUint16(data, position);
- var qcc = {};
- j = position + 2;
- var cqcc;
- if (context.SIZ.Csiz < 257)
- cqcc = data[j++];
- else {
- cqcc = readUint16(data, j);
- j += 2;
- }
- var sqcd = data[j++];
- var spqcdSize, scalarExpounded;
- switch (sqcd & 0x1F) {
- case 0:
- spqcdSize = 8;
- scalarExpounded = true;
- break;
- case 1:
- spqcdSize = 16;
- scalarExpounded = false;
- break;
- case 2:
- spqcdSize = 16;
- scalarExpounded = true;
- break;
- default:
- throw 'Invalid SQcd value ' + sqcd;
- }
- qcc.noQuantization = spqcdSize == 8;
- qcc.scalarExpounded = scalarExpounded;
- qcc.guardBits = sqcd >> 5;
- var spqcds = [];
- while (j < length + position) {
- var spqcd = {};
- if (spqcdSize == 8) {
- spqcd.epsilon = data[j++] >> 3;
- spqcd.mu = 0;
- } else {
- spqcd.epsilon = data[j] >> 3;
- spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1];
- j += 2;
- }
- spqcds.push(spqcd);
- }
- qcc.SPqcds = spqcds;
- if (context.mainHeader)
- context.QCC[cqcc] = qcc;
- else
- context.currentTile.QCC[cqcc] = qcc;
- break;
- case 0xFF52: // Coding style default (COD)
- length = readUint16(data, position);
- var cod = {};
- j = position + 2;
- var scod = data[j++];
- cod.entropyCoderWithCustomPrecincts = !!(scod & 1);
- cod.sopMarkerUsed = !!(scod & 2);
- cod.ephMarkerUsed = !!(scod & 4);
- var codingStyle = {};
- cod.progressionOrder = data[j++];
- cod.layersCount = readUint16(data, j);
- j += 2;
- cod.multipleComponentTransform = data[j++];
-
- cod.decompositionLevelsCount = data[j++];
- cod.xcb = (data[j++] & 0xF) + 2;
- cod.ycb = (data[j++] & 0xF) + 2;
- var blockStyle = data[j++];
- cod.selectiveArithmeticCodingBypass = !!(blockStyle & 1);
- cod.resetContextProbabilities = !!(blockStyle & 2);
- cod.terminationOnEachCodingPass = !!(blockStyle & 4);
- cod.verticalyStripe = !!(blockStyle & 8);
- cod.predictableTermination = !!(blockStyle & 16);
- cod.segmentationSymbolUsed = !!(blockStyle & 32);
- cod.transformation = data[j++];
- if (cod.entropyCoderWithCustomPrecincts) {
- var precinctsSizes = {};
- while (j < length + position) {
- var precinctsSize = data[j];
- precinctsSizes.push({
- PPx: precinctsSize & 0xF,
- PPy: precinctsSize >> 4
- });
- }
- cod.precinctsSizes = precinctsSizes;
- }
-
- if (cod.sopMarkerUsed || cod.ephMarkerUsed ||
- cod.selectiveArithmeticCodingBypass ||
- cod.resetContextProbabilities ||
- cod.terminationOnEachCodingPass ||
- cod.verticalyStripe || cod.predictableTermination)
- throw 'Unsupported COD options: ' +
- globalScope.JSON.stringify(cod);
-
- if (context.mainHeader)
- context.COD = cod;
- else {
- context.currentTile.COD = cod;
- context.currentTile.COC = [];
- }
- break;
- case 0xFF90: // Start of tile-part (SOT)
- length = readUint16(data, position);
- var tile = {};
- tile.index = readUint16(data, position + 2);
- tile.length = readUint32(data, position + 4);
- tile.dataEnd = tile.length + position - 2;
- tile.partIndex = data[position + 8];
- tile.partsCount = data[position + 9];
-
- context.mainHeader = false;
- if (tile.partIndex == 0) {
- // reset component specific settings
- tile.COD = context.COD;
- tile.COC = context.COC.slice(0); // clone of the global COC
- tile.QCD = context.QCD;
- tile.QCC = context.QCC.slice(0); // clone of the global COC
- }
- context.currentTile = tile;
- break;
- case 0xFF93: // Start of data (SOD)
- var tile = context.currentTile;
- if (tile.partIndex == 0) {
- initializeTile(context, tile.index);
- buildPackets(context);
- }
-
- // moving to the end of the data
- length = tile.dataEnd - position;
-
- parseTilePackets(context, data, position, length);
- break;
- case 0xFF64: // Comment (COM)
- length = readUint16(data, position);
- // skipping content
- break;
- default:
- throw 'Unknown codestream code: ' + code.toString(16);
- }
- position += length;
- }
- } catch (e) {
- if (this.failOnCorruptedImage)
- error('JPX error: ' + e);
- else
- warn('JPX error: ' + e + '. Trying to recover');
- }
- this.tiles = transformComponents(context);
- this.width = context.SIZ.Xsiz - context.SIZ.XOsiz;
- this.height = context.SIZ.Ysiz - context.SIZ.YOsiz;
- this.componentsCount = context.SIZ.Csiz;
- }
- };
- function readUint32(data, offset) {
- return (data[offset] << 24) | (data[offset + 1] << 16) |
- (data[offset + 2] << 8) | data[offset + 3];
- }
- function readUint16(data, offset) {
- return (data[offset] << 8) | data[offset + 1];
- }
- function log2(x) {
- var n = 1, i = 0;
- while (x > n) {
- n <<= 1;
- i++;
- }
- return i;
- }
- function calculateComponentDimensions(component, siz) {
- // Section B.2 Component mapping
- component.x0 = Math.ceil(siz.XOsiz / component.XRsiz);
- component.x1 = Math.ceil(siz.Xsiz / component.XRsiz);
- component.y0 = Math.ceil(siz.YOsiz / component.YRsiz);
- component.y1 = Math.ceil(siz.Ysiz / component.YRsiz);
- component.width = component.x1 - component.x0;
- component.height = component.y1 - component.y0;
- }
- function calculateTileGrids(context, components) {
- var siz = context.SIZ;
- // Section B.3 Division into tile and tile-components
- var tiles = [];
- var numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz);
- var numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz);
- for (var q = 0; q < numYtiles; q++) {
- for (var p = 0; p < numXtiles; p++) {
- var tile = {};
- tile.tx0 = Math.max(siz.XTOsiz + p * siz.XTsiz, siz.XOsiz);
- tile.ty0 = Math.max(siz.YTOsiz + q * siz.YTsiz, siz.YOsiz);
- tile.tx1 = Math.min(siz.XTOsiz + (p + 1) * siz.XTsiz, siz.Xsiz);
- tile.ty1 = Math.min(siz.YTOsiz + (q + 1) * siz.YTsiz, siz.Ysiz);
- tile.width = tile.tx1 - tile.tx0;
- tile.height = tile.ty1 - tile.ty0;
- tile.components = [];
- tiles.push(tile);
- }
- }
- context.tiles = tiles;
-
- var componentsCount = siz.Csiz;
- for (var i = 0, ii = componentsCount; i < ii; i++) {
- var component = components[i];
- var tileComponents = [];
- for (var j = 0, jj = tiles.length; j < jj; j++) {
- var tileComponent = {}, tile = tiles[j];
- tileComponent.tcx0 = Math.ceil(tile.tx0 / component.XRsiz);
- tileComponent.tcy0 = Math.ceil(tile.ty0 / component.YRsiz);
- tileComponent.tcx1 = Math.ceil(tile.tx1 / component.XRsiz);
- tileComponent.tcy1 = Math.ceil(tile.ty1 / component.YRsiz);
- tileComponent.width = tileComponent.tcx1 - tileComponent.tcx0;
- tileComponent.height = tileComponent.tcy1 - tileComponent.tcy0;
- tile.components[i] = tileComponent;
- }
- }
- }
- function getBlocksDimensions(context, component, r) {
- var codOrCoc = component.codingStyleParameters;
- var result = {};
- if (!codOrCoc.entropyCoderWithCustomPrecincts) {
- result.PPx = 15;
- result.PPy = 15;
- } else {
- result.PPx = codOrCoc.precinctsSizes[r].PPx;
- result.PPy = codOrCoc.precinctsSizes[r].PPy;
- }
- // calculate codeblock size as described in section B.7
- result.xcb_ = r > 0 ? Math.min(codOrCoc.xcb, result.PPx - 1) :
- Math.min(codOrCoc.xcb, result.PPx);
- result.ycb_ = r > 0 ? Math.min(codOrCoc.ycb, result.PPy - 1) :
- Math.min(codOrCoc.ycb, result.PPy);
- return result;
- }
- function buildPrecincts(context, resolution, dimensions) {
- // Section B.6 Division resolution to precincts
- var precinctWidth = 1 << dimensions.PPx;
- var precinctHeight = 1 << dimensions.PPy;
- var numprecinctswide = resolution.trx1 > resolution.trx0 ?
- Math.ceil(resolution.trx1 / precinctWidth) -
- Math.floor(resolution.trx0 / precinctWidth) : 0;
- var numprecinctshigh = resolution.try1 > resolution.try0 ?
- Math.ceil(resolution.try1 / precinctHeight) -
- Math.floor(resolution.try0 / precinctHeight) : 0;
- var numprecincts = numprecinctswide * numprecinctshigh;
- var precinctXOffset = Math.floor(resolution.trx0 / precinctWidth) *
- precinctWidth;
- var precinctYOffset = Math.floor(resolution.try0 / precinctHeight) *
- precinctHeight;
- resolution.precinctParameters = {
- precinctXOffset: precinctXOffset,
- precinctYOffset: precinctYOffset,
- precinctWidth: precinctWidth,
- precinctHeight: precinctHeight,
- numprecinctswide: numprecinctswide,
- numprecinctshigh: numprecinctshigh,
- numprecincts: numprecincts
- };
- }
- function buildCodeblocks(context, subband, dimensions) {
- // Section B.7 Division sub-band into code-blocks
- var xcb_ = dimensions.xcb_;
- var ycb_ = dimensions.ycb_;
- var codeblockWidth = 1 << xcb_;
- var codeblockHeight = 1 << ycb_;
- var cbx0 = Math.floor(subband.tbx0 / codeblockWidth);
- var cby0 = Math.floor(subband.tby0 / codeblockHeight);
- var cbx1 = Math.ceil(subband.tbx1 / codeblockWidth);
- var cby1 = Math.ceil(subband.tby1 / codeblockHeight);
- var precinctParameters = subband.resolution.precinctParameters;
- var codeblocks = [];
- var precincts = [];
- for (var j = cby0; j < cby1; j++) {
- for (var i = cbx0; i < cbx1; i++) {
- var codeblock = {
- cbx: i,
- cby: j,
- tbx0: codeblockWidth * i,
- tby0: codeblockHeight * j,
- tbx1: codeblockWidth * (i + 1),
- tby1: codeblockHeight * (j + 1)
- };
- // calculate precinct number
- var pi = Math.floor((codeblock.tbx0 -
- precinctParameters.precinctXOffset) /
- precinctParameters.precinctWidth);
- var pj = Math.floor((codeblock.tby0 -
- precinctParameters.precinctYOffset) /
- precinctParameters.precinctHeight);
- var precinctNumber = pj +
- pi * precinctParameters.numprecinctswide;
- codeblock.tbx0_ = Math.max(subband.tbx0, codeblock.tbx0);
- codeblock.tby0_ = Math.max(subband.tby0, codeblock.tby0);
- codeblock.tbx1_ = Math.min(subband.tbx1, codeblock.tbx1);
- codeblock.tby1_ = Math.min(subband.tby1, codeblock.tby1);
- codeblock.precinctNumber = precinctNumber;
- codeblock.subbandType = subband.type;
- var coefficientsLength = (codeblock.tbx1_ - codeblock.tbx0_) *
- (codeblock.tby1_ - codeblock.tby0_);
- codeblock.Lblock = 3;
- codeblocks.push(codeblock);
- // building precinct for the sub-band
- var precinct;
- if (precinctNumber in precincts) {
- precinct = precincts[precinctNumber];
- precinct.cbxMin = Math.min(precinct.cbxMin, i);
- precinct.cbyMin = Math.min(precinct.cbyMin, j);
- precinct.cbxMax = Math.max(precinct.cbxMax, i);
- precinct.cbyMax = Math.max(precinct.cbyMax, j);
- } else {
- precincts[precinctNumber] = precinct = {
- cbxMin: i,
- cbyMin: j,
- cbxMax: i,
- cbyMax: j
- };
- }
- codeblock.precinct = precinct;
- }
- }
- subband.codeblockParameters = {
- codeblockWidth: xcb_,
- codeblockHeight: ycb_,
- numcodeblockwide: cbx1 - cbx0 + 1,
- numcodeblockhigh: cby1 - cby1 + 1
- };
- subband.codeblocks = codeblocks;
- for (var i = 0, ii = codeblocks.length; i < ii; i++) {
- var codeblock = codeblocks[i];
- var precinctNumber = codeblock.precinctNumber;
- }
- subband.precincts = precincts;
- }
- function createPacket(resolution, precinctNumber, layerNumber) {
- var precinctCodeblocks = [];
- // Section B.10.8 Order of info in packet
- var subbands = resolution.subbands;
- // sub-bands already ordered in 'LL', 'HL', 'LH', and 'HH' sequence
- for (var i = 0, ii = subbands.length; i < ii; i++) {
- var subband = subbands[i];
- var codeblocks = subband.codeblocks;
- for (var j = 0, jj = codeblocks.length; j < jj; j++) {
- var codeblock = codeblocks[j];
- if (codeblock.precinctNumber != precinctNumber)
- continue;
- precinctCodeblocks.push(codeblock);
- }
- }
- return {
- layerNumber: layerNumber,
- codeblocks: precinctCodeblocks
- };
- }
- function LayerResolutionComponentPositionIterator(context) {
- var siz = context.SIZ;
- var tileIndex = context.currentTile.index;
- var tile = context.tiles[tileIndex];
- var layersCount = tile.codingStyleDefaultParameters.layersCount;
- var componentsCount = siz.Csiz;
- var maxDecompositionLevelsCount = 0;
- for (var q = 0; q < componentsCount; q++) {
- maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount,
- tile.components[q].codingStyleParameters.decompositionLevelsCount);
- }
-
- var l = 0, r = 0, i = 0, k = 0;
-
- this.nextPacket = function JpxImage_nextPacket() {
- // Section B.12.1.1 Layer-resolution-component-position
- for (; l < layersCount; l++) {
- for (; r <= maxDecompositionLevelsCount; r++) {
- for (; i < componentsCount; i++) {
- var component = tile.components[i];
- if (r > component.codingStyleParameters.decompositionLevelsCount)
- continue;
-
- var resolution = component.resolutions[r];
- var numprecincts = resolution.precinctParameters.numprecincts;
- for (; k < numprecincts;) {
- var packet = createPacket(resolution, k, l);
- k++;
- return packet;
- }
- k = 0;
- }
- i = 0;
- }
- r = 0;
- }
- throw 'Out of packets';
- };
- }
- function ResolutionLayerComponentPositionIterator(context) {
- var siz = context.SIZ;
- var tileIndex = context.currentTile.index;
- var tile = context.tiles[tileIndex];
- var layersCount = tile.codingStyleDefaultParameters.layersCount;
- var componentsCount = siz.Csiz;
- var maxDecompositionLevelsCount = 0;
- for (var q = 0; q < componentsCount; q++) {
- maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount,
- tile.components[q].codingStyleParameters.decompositionLevelsCount);
- }
-
- var r = 0, l = 0, i = 0, k = 0;
-
- this.nextPacket = function JpxImage_nextPacket() {
- // Section B.12.1.2 Resolution-layer-component-position
- for (; r <= maxDecompositionLevelsCount; r++) {
- for (; l < layersCount; l++) {
- for (; i < componentsCount; i++) {
- var component = tile.components[i];
- if (r > component.codingStyleParameters.decompositionLevelsCount)
- continue;
-
- var resolution = component.resolutions[r];
- var numprecincts = resolution.precinctParameters.numprecincts;
- for (; k < numprecincts;) {
- var packet = createPacket(resolution, k, l);
- k++;
- return packet;
- }
- k = 0;
- }
- i = 0;
- }
- l = 0;
- }
- throw 'Out of packets';
- };
- }
- function buildPackets(context) {
- var siz = context.SIZ;
- var tileIndex = context.currentTile.index;
- var tile = context.tiles[tileIndex];
- var componentsCount = siz.Csiz;
- // Creating resolutions and sub-bands for each component
- for (var c = 0; c < componentsCount; c++) {
- var component = tile.components[c];
- var decompositionLevelsCount =
- component.codingStyleParameters.decompositionLevelsCount;
- // Section B.5 Resolution levels and sub-bands
- var resolutions = [];
- var subbands = [];
- for (var r = 0; r <= decompositionLevelsCount; r++) {
- var blocksDimensions = getBlocksDimensions(context, component, r);
- var resolution = {};
- var scale = 1 << (decompositionLevelsCount - r);
- resolution.trx0 = Math.ceil(component.tcx0 / scale);
- resolution.try0 = Math.ceil(component.tcy0 / scale);
- resolution.trx1 = Math.ceil(component.tcx1 / scale);
- resolution.try1 = Math.ceil(component.tcy1 / scale);
- buildPrecincts(context, resolution, blocksDimensions);
- resolutions.push(resolution);
-
- var subband;
- if (r == 0) {
- // one sub-band (LL) with last decomposition
- subband = {};
- subband.type = 'LL';
- subband.tbx0 = Math.ceil(component.tcx0 / scale);
- subband.tby0 = Math.ceil(component.tcy0 / scale);
- subband.tbx1 = Math.ceil(component.tcx1 / scale);
- subband.tby1 = Math.ceil(component.tcy1 / scale);
- subband.resolution = resolution;
- buildCodeblocks(context, subband, blocksDimensions);
- subbands.push(subband);
- resolution.subbands = [subband];
- } else {
- var bscale = 1 << (decompositionLevelsCount - r + 1);
- var resolutionSubbands = [];
- // three sub-bands (HL, LH and HH) with rest of decompositions
- subband = {};
- subband.type = 'HL';
- subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);
- subband.tby0 = Math.ceil(component.tcy0 / bscale);
- subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);
- subband.tby1 = Math.ceil(component.tcy1 / bscale);
- subband.resolution = resolution;
- buildCodeblocks(context, subband, blocksDimensions);
- subbands.push(subband);
- resolutionSubbands.push(subband);
-
- subband = {};
- subband.type = 'LH';
- subband.tbx0 = Math.ceil(component.tcx0 / bscale);
- subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);
- subband.tbx1 = Math.ceil(component.tcx1 / bscale);
- subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);
- subband.resolution = resolution;
- buildCodeblocks(context, subband, blocksDimensions);
- subbands.push(subband);
- resolutionSubbands.push(subband);
-
- subband = {};
- subband.type = 'HH';
- subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);
- subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);
- subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);
- subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);
- subband.resolution = resolution;
- buildCodeblocks(context, subband, blocksDimensions);
- subbands.push(subband);
- resolutionSubbands.push(subband);
-
- resolution.subbands = resolutionSubbands;
- }
- }
- component.resolutions = resolutions;
- component.subbands = subbands;
- }
- // Generate the packets sequence
- var progressionOrder = tile.codingStyleDefaultParameters.progressionOrder;
- var packetsIterator;
- switch (progressionOrder) {
- case 0:
- tile.packetsIterator =
- new LayerResolutionComponentPositionIterator(context);
- break;
- case 1:
- tile.packetsIterator =
- new ResolutionLayerComponentPositionIterator(context);
- break;
- default:
- throw 'Unsupported progression order ' + progressionOrder;
- }
- }
- function parseTilePackets(context, data, offset, dataLength) {
- var position = 0;
- var buffer, bufferSize = 0, skipNextBit = false;
- function readBits(count) {
- while (bufferSize < count) {
- var b = data[offset + position];
- position++;
- if (skipNextBit) {
- buffer = (buffer << 7) | b;
- bufferSize += 7;
- skipNextBit = false;
- } else {
- buffer = (buffer << 8) | b;
- bufferSize += 8;
- }
- if (b == 0xFF) {
- skipNextBit = true;
- }
- }
- bufferSize -= count;
- return (buffer >>> bufferSize) & ((1 << count) - 1);
- }
- function alignToByte() {
- bufferSize = 0;
- if (skipNextBit) {
- position++;
- skipNextBit = false;
- }
- }
- function readCodingpasses() {
- var value = readBits(1);
- if (value == 0)
- return 1;
- value = (value << 1) | readBits(1);
- if (value == 0x02)
- return 2;
- value = (value << 2) | readBits(2);
- if (value <= 0x0E)
- return (value & 0x03) + 3;
- value = (value << 5) | readBits(5);
- if (value <= 0x1FE)
- return (value & 0x1F) + 6;
- value = (value << 7) | readBits(7);
- return (value & 0x7F) + 37;
- }
- var tileIndex = context.currentTile.index;
- var tile = context.tiles[tileIndex];
- var packetsIterator = tile.packetsIterator;
- while (position < dataLength) {
- var packet = packetsIterator.nextPacket();
- if (!readBits(1)) {
- alignToByte();
- continue;
- }
- var layerNumber = packet.layerNumber;
- var queue = [];
- for (var i = 0, ii = packet.codeblocks.length; i < ii; i++) {
- var codeblock = packet.codeblocks[i];
- var precinct = codeblock.precinct;
- var codeblockColumn = codeblock.cbx - precinct.cbxMin;
- var codeblockRow = codeblock.cby - precinct.cbyMin;
- var codeblockIncluded = false;
- var firstTimeInclusion = false;
- if ('included' in codeblock) {
- codeblockIncluded = !!readBits(1);
- } else {
- // reading inclusion tree
- var precinct = codeblock.precinct;
- var inclusionTree, zeroBitPlanesTree;
- if ('inclusionTree' in precinct) {
- inclusionTree = precinct.inclusionTree;
- } else {
- // building inclusion and zero bit-planes trees
- var width = precinct.cbxMax - precinct.cbxMin + 1;
- var height = precinct.cbyMax - precinct.cbyMin + 1;
- inclusionTree = new InclusionTree(width, height, layerNumber);
- zeroBitPlanesTree = new TagTree(width, height);
- precinct.inclusionTree = inclusionTree;
- precinct.zeroBitPlanesTree = zeroBitPlanesTree;
- }
-
- if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) {
- while (true) {
- if (readBits(1)) {
- var valueReady = !inclusionTree.nextLevel();
- if (valueReady) {
- codeblock.included = true;
- codeblockIncluded = firstTimeInclusion = true;
- break;
- }
- } else {
- inclusionTree.incrementValue(layerNumber);
- break;
- }
- }
- }
- }
- if (!codeblockIncluded)
- continue;
- if (firstTimeInclusion) {
- zeroBitPlanesTree = precinct.zeroBitPlanesTree;
- zeroBitPlanesTree.reset(codeblockColumn, codeblockRow);
- while (true) {
- if (readBits(1)) {
- var valueReady = !zeroBitPlanesTree.nextLevel();
- if (valueReady)
- break;
- } else
- zeroBitPlanesTree.incrementValue();
- }
- codeblock.zeroBitPlanes = zeroBitPlanesTree.value;
- }
- var codingpasses = readCodingpasses();
- while (readBits(1))
- codeblock.Lblock++;
- var codingpassesLog2 = log2(codingpasses);
- // rounding down log2
- var bits = ((codingpasses < (1 << codingpassesLog2)) ?
- codingpassesLog2 - 1 : codingpassesLog2) + codeblock.Lblock;
- var codedDataLength = readBits(bits);
- queue.push({
- codeblock: codeblock,
- codingpasses: codingpasses,
- dataLength: codedDataLength
- });
- }
- alignToByte();
- while (queue.length > 0) {
- var packetItem = queue.shift();
- var codeblock = packetItem.codeblock;
- if (!('data' in codeblock))
- codeblock.data = [];
- codeblock.data.push({
- data: data,
- start: offset + position,
- end: offset + position + packetItem.dataLength,
- codingpasses: packetItem.codingpasses
- });
- position += packetItem.dataLength;
- }
- }
- return position;
- }
- function copyCoefficients(coefficients, x0, y0, width, height,
- delta, mb, codeblocks, transformation,
- segmentationSymbolUsed) {
- var r = 0.5; // formula (E-6)
- for (var i = 0, ii = codeblocks.length; i < ii; ++i) {
- var codeblock = codeblocks[i];
- var blockWidth = codeblock.tbx1_ - codeblock.tbx0_;
- var blockHeight = codeblock.tby1_ - codeblock.tby0_;
- if (blockWidth == 0 || blockHeight == 0)
- continue;
- if (!('data' in codeblock))
- continue;
-
- var bitModel, currentCodingpassType;
- bitModel = new BitModel(blockWidth, blockHeight, codeblock.subbandType,
- codeblock.zeroBitPlanes);
- currentCodingpassType = 2; // first bit plane starts from cleanup
-
- // collect data
- var data = codeblock.data, totalLength = 0, codingpasses = 0;
- for (var q = 0, qq = data.length; q < qq; q++) {
- var dataItem = data[q];
- totalLength += dataItem.end - dataItem.start;
- codingpasses += dataItem.codingpasses;
- }
- var encodedData = new Uint8Array(totalLength), k = 0;
- for (var q = 0, qq = data.length; q < qq; q++) {
- var dataItem = data[q];
- var chunk = dataItem.data.subarray(dataItem.start, dataItem.end);
- encodedData.set(chunk, k);
- k += chunk.length;
- }
- // decoding the item
- var decoder = new ArithmeticDecoder(encodedData, 0, totalLength);
- bitModel.setDecoder(decoder);
-
- for (var q = 0; q < codingpasses; q++) {
- switch (currentCodingpassType) {
- case 0:
- bitModel.runSignificancePropogationPass();
- break;
- case 1:
- bitModel.runMagnitudeRefinementPass();
- break;
- case 2:
- bitModel.runCleanupPass();
- if (segmentationSymbolUsed)
- bitModel.checkSegmentationSymbol();
- break;
- }
- currentCodingpassType = (currentCodingpassType + 1) % 3;
- }
-
- var offset = (codeblock.tbx0_ - x0) + (codeblock.tby0_ - y0) * width;
- var position = 0;
- for (var j = 0; j < blockHeight; j++) {
- for (var k = 0; k < blockWidth; k++) {
- var n = (bitModel.coefficentsSign[position] ? -1 : 1) *
- bitModel.coefficentsMagnitude[position];
- var nb = bitModel.bitsDecoded[position], correction;
- if (transformation == 0 || mb > nb) {
- // use r only if transformation is irreversible or
- // not all bitplanes were decoded for reversible transformation
- n += n < 0 ? n - r : n > 0 ? n + r : 0;
- correction = 1 << (mb - nb);
- } else
- correction = 1;
- coefficients[offset++] = n * correction * delta;
- position++;
- }
- offset += width - blockWidth;
- }
- }
- }
- function transformTile(context, tile, c) {
- var component = tile.components[c];
- var codingStyleParameters = component.codingStyleParameters;
- var quantizationParameters = component.quantizationParameters;
- var decompositionLevelsCount =
- codingStyleParameters.decompositionLevelsCount;
- var spqcds = quantizationParameters.SPqcds;
- var scalarExpounded = quantizationParameters.scalarExpounded;
- var guardBits = quantizationParameters.guardBits;
- var transformation = codingStyleParameters.transformation;
- var segmentationSymbolUsed = codingStyleParameters.segmentationSymbolUsed;
- var precision = context.components[c].precision;
-
- var subbandCoefficients = [];
- var k = 0, b = 0;
- for (var i = 0; i <= decompositionLevelsCount; i++) {
- var resolution = component.resolutions[i];
-
- for (var j = 0, jj = resolution.subbands.length; j < jj; j++) {
- var mu, epsilon;
- if (!scalarExpounded) {
- // formula E-5
- mu = spqcds[0].mu;
- epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0);
- } else {
- mu = spqcds[b].mu;
- epsilon = spqcds[b].epsilon;
- }
-
- var subband = resolution.subbands[j];
- var width = subband.tbx1 - subband.tbx0;
- var height = subband.tby1 - subband.tby0;
- var gainLog2 = SubbandsGainLog2[subband.type];
-
- // calulate quantization coefficient (Section E.1.1.1)
- var delta = Math.pow(2, (precision + gainLog2) - epsilon) *
- (1 + mu / 2048);
- var mb = (guardBits + epsilon - 1);
-
- var coefficients = new Float32Array(width * height);
- copyCoefficients(coefficients, subband.tbx0, subband.tby0,
- width, height, delta, mb, subband.codeblocks, transformation,
- segmentationSymbolUsed);
-
- subbandCoefficients.push({
- width: width,
- height: height,
- items: coefficients
- });
-
- b++;
- }
- }
-
- var transformation = codingStyleParameters.transformation;
- var transform = transformation == 0 ? new IrreversibleTransform() :
- new ReversibleTransform();
- var result = transform.calculate(subbandCoefficients,
- component.tcx0, component.tcy0);
- return {
- left: component.tcx0,
- top: component.tcy0,
- width: result.width,
- height: result.height,
- items: result.items
- };
- }
- function transformComponents(context) {
- var siz = context.SIZ;
- var components = context.components;
- var componentsCount = siz.Csiz;
- var resultImages = [];
- for (var i = 0, ii = context.tiles.length; i < ii; i++) {
- var tile = context.tiles[i];
- var result = [];
- for (var c = 0; c < componentsCount; c++) {
- var image = transformTile(context, tile, c);
- result.push(image);
- }
-
- // Section G.2.2 Inverse multi component transform
- if (tile.codingStyleDefaultParameters.multipleComponentTransform) {
- var y0items = result[0].items;
- var y1items = result[1].items;
- var y2items = result[2].items;
- for (var j = 0, jj = y0items.length; j < jj; j++) {
- var y0 = y0items[j], y1 = y1items[j], y2 = y2items[j];
- var i1 = y0 - ((y2 + y1) >> 2);
- y1items[j] = i1;
- y0items[j] = y2 + i1;
- y2items[j] = y1 + i1;
- }
- }
-
- // Section G.1 DC level shifting to unsigned component values
- for (var c = 0; c < componentsCount; c++) {
- var component = components[c];
- if (component.isSigned)
- continue;
-
- var offset = 1 << (component.precision - 1);
- var tileImage = result[c];
- var items = tileImage.items;
- for (var j = 0, jj = items.length; j < jj; j++)
- items[j] += offset;
- }
-
- // To simplify things: shift and clamp output to 8 bit unsigned
- for (var c = 0; c < componentsCount; c++) {
- var component = components[c];
- var offset = component.isSigned ? 128 : 0;
- var shift = component.precision - 8;
- var tileImage = result[c];
- var items = tileImage.items;
- var data = new Uint8Array(items.length);
- for (var j = 0, jj = items.length; j < jj; j++) {
- var value = (items[j] >> shift) + offset;
- data[j] = value < 0 ? 0 : value > 255 ? 255 : value;
- }
- result[c].items = data;
- }
-
- resultImages.push(result);
- }
- return resultImages;
- }
- function initializeTile(context, tileIndex) {
- var siz = context.SIZ;
- var componentsCount = siz.Csiz;
- var tile = context.tiles[tileIndex];
- var resultTiles = [];
- for (var c = 0; c < componentsCount; c++) {
- var component = tile.components[c];
- var qcdOrQcc = c in context.currentTile.QCC ?
- context.currentTile.QCC[c] : context.currentTile.QCD;
- component.quantizationParameters = qcdOrQcc;
- var codOrCoc = c in context.currentTile.COC ?
- context.currentTile.COC[c] : context.currentTile.COD;
- component.codingStyleParameters = codOrCoc;
- }
- tile.codingStyleDefaultParameters = context.currentTile.COD;
- }
-
- // Section B.10.2 Tag trees
- var TagTree = (function TagTreeClosure() {
- function TagTree(width, height) {
- var levelsLength = log2(Math.max(width, height)) + 1;
- this.levels = [];
- for (var i = 0; i < levelsLength; i++) {
- var level = {
- width: width,
- height: height,
- items: []
- };
- this.levels.push(level);
- width = Math.ceil(width / 2);
- height = Math.ceil(height / 2);
- }
- }
- TagTree.prototype = {
- reset: function TagTree_reset(i, j) {
- var currentLevel = 0, value = 0;
- while (currentLevel < this.levels.length) {
- var level = this.levels[currentLevel];
- var index = i + j * level.width;
- if (index in level.items) {
- value = level.items[index];
- break;
- }
- level.index = index;
- i >>= 1;
- j >>= 1;
- currentLevel++;
- }
- currentLevel--;
- var level = this.levels[currentLevel];
- level.items[level.index] = value;
- this.currentLevel = currentLevel;
- delete this.value;
- },
- incrementValue: function TagTree_incrementValue() {
- var level = this.levels[this.currentLevel];
- level.items[level.index]++;
- },
- nextLevel: function TagTree_nextLevel() {
- var currentLevel = this.currentLevel;
- var level = this.levels[currentLevel];
- var value = level.items[level.index];
- currentLevel--;
- if (currentLevel < 0) {
- this.value = value;
- return false;
- }
-
- this.currentLevel = currentLevel;
- var level = this.levels[currentLevel];
- level.items[level.index] = value;
- return true;
- }
- };
- return TagTree;
- })();
-
- var InclusionTree = (function InclusionTreeClosure() {
- function InclusionTree(width, height, defaultValue) {
- var levelsLength = log2(Math.max(width, height)) + 1;
- this.levels = [];
- for (var i = 0; i < levelsLength; i++) {
- var items = new Uint8Array(width * height);
- for (var j = 0, jj = items.length; j < jj; j++)
- items[j] = defaultValue;
-
- var level = {
- width: width,
- height: height,
- items: items
- };
- this.levels.push(level);
-
- width = Math.ceil(width / 2);
- height = Math.ceil(height / 2);
- }
- }
- InclusionTree.prototype = {
- reset: function InclusionTree_reset(i, j, stopValue) {
- var currentLevel = 0;
- while (currentLevel < this.levels.length) {
- var level = this.levels[currentLevel];
- var index = i + j * level.width;
- level.index = index;
- var value = level.items[index];
-
- if (value == 0xFF)
- break;
-
- if (value > stopValue) {
- this.currentLevel = currentLevel;
- // already know about this one, propagating the value to top levels
- this.propagateValues();
- return false;
- }
-
- i >>= 1;
- j >>= 1;
- currentLevel++;
- }
- this.currentLevel = currentLevel - 1;
- return true;
- },
- incrementValue: function InclusionTree_incrementValue(stopValue) {
- var level = this.levels[this.currentLevel];
- level.items[level.index] = stopValue + 1;
- this.propagateValues();
- },
- propagateValues: function InclusionTree_propagateValues() {
- var levelIndex = this.currentLevel;
- var level = this.levels[levelIndex];
- var currentValue = level.items[level.index];
- while (--levelIndex >= 0) {
- var level = this.levels[levelIndex];
- level.items[level.index] = currentValue;
- }
- },
- nextLevel: function InclusionTree_nextLevel() {
- var currentLevel = this.currentLevel;
- var level = this.levels[currentLevel];
- var value = level.items[level.index];
- level.items[level.index] = 0xFF;
- currentLevel--;
- if (currentLevel < 0)
- return false;
-
- this.currentLevel = currentLevel;
- var level = this.levels[currentLevel];
- level.items[level.index] = value;
- return true;
- }
- };
- return InclusionTree;
- })();
-
- // Implements C.3. Arithmetic decoding procedures
- var ArithmeticDecoder = (function ArithmeticDecoderClosure() {
- var QeTable = [
- {qe: 0x5601, nmps: 1, nlps: 1, switchFlag: 1},
- {qe: 0x3401, nmps: 2, nlps: 6, switchFlag: 0},
- {qe: 0x1801, nmps: 3, nlps: 9, switchFlag: 0},
- {qe: 0x0AC1, nmps: 4, nlps: 12, switchFlag: 0},
- {qe: 0x0521, nmps: 5, nlps: 29, switchFlag: 0},
- {qe: 0x0221, nmps: 38, nlps: 33, switchFlag: 0},
- {qe: 0x5601, nmps: 7, nlps: 6, switchFlag: 1},
- {qe: 0x5401, nmps: 8, nlps: 14, switchFlag: 0},
- {qe: 0x4801, nmps: 9, nlps: 14, switchFlag: 0},
- {qe: 0x3801, nmps: 10, nlps: 14, switchFlag: 0},
- {qe: 0x3001, nmps: 11, nlps: 17, switchFlag: 0},
- {qe: 0x2401, nmps: 12, nlps: 18, switchFlag: 0},
- {qe: 0x1C01, nmps: 13, nlps: 20, switchFlag: 0},
- {qe: 0x1601, nmps: 29, nlps: 21, switchFlag: 0},
- {qe: 0x5601, nmps: 15, nlps: 14, switchFlag: 1},
- {qe: 0x5401, nmps: 16, nlps: 14, switchFlag: 0},
- {qe: 0x5101, nmps: 17, nlps: 15, switchFlag: 0},
- {qe: 0x4801, nmps: 18, nlps: 16, switchFlag: 0},
- {qe: 0x3801, nmps: 19, nlps: 17, switchFlag: 0},
- {qe: 0x3401, nmps: 20, nlps: 18, switchFlag: 0},
- {qe: 0x3001, nmps: 21, nlps: 19, switchFlag: 0},
- {qe: 0x2801, nmps: 22, nlps: 19, switchFlag: 0},
- {qe: 0x2401, nmps: 23, nlps: 20, switchFlag: 0},
- {qe: 0x2201, nmps: 24, nlps: 21, switchFlag: 0},
- {qe: 0x1C01, nmps: 25, nlps: 22, switchFlag: 0},
- {qe: 0x1801, nmps: 26, nlps: 23, switchFlag: 0},
- {qe: 0x1601, nmps: 27, nlps: 24, switchFlag: 0},
- {qe: 0x1401, nmps: 28, nlps: 25, switchFlag: 0},
- {qe: 0x1201, nmps: 29, nlps: 26, switchFlag: 0},
- {qe: 0x1101, nmps: 30, nlps: 27, switchFlag: 0},
- {qe: 0x0AC1, nmps: 31, nlps: 28, switchFlag: 0},
- {qe: 0x09C1, nmps: 32, nlps: 29, switchFlag: 0},
- {qe: 0x08A1, nmps: 33, nlps: 30, switchFlag: 0},
- {qe: 0x0521, nmps: 34, nlps: 31, switchFlag: 0},
- {qe: 0x0441, nmps: 35, nlps: 32, switchFlag: 0},
- {qe: 0x02A1, nmps: 36, nlps: 33, switchFlag: 0},
- {qe: 0x0221, nmps: 37, nlps: 34, switchFlag: 0},
- {qe: 0x0141, nmps: 38, nlps: 35, switchFlag: 0},
- {qe: 0x0111, nmps: 39, nlps: 36, switchFlag: 0},
- {qe: 0x0085, nmps: 40, nlps: 37, switchFlag: 0},
- {qe: 0x0049, nmps: 41, nlps: 38, switchFlag: 0},
- {qe: 0x0025, nmps: 42, nlps: 39, switchFlag: 0},
- {qe: 0x0015, nmps: 43, nlps: 40, switchFlag: 0},
- {qe: 0x0009, nmps: 44, nlps: 41, switchFlag: 0},
- {qe: 0x0005, nmps: 45, nlps: 42, switchFlag: 0},
- {qe: 0x0001, nmps: 45, nlps: 43, switchFlag: 0},
- {qe: 0x5601, nmps: 46, nlps: 46, switchFlag: 0}
- ];
-
- function ArithmeticDecoder(data, start, end) {
- this.data = data;
- this.bp = start;
- this.dataEnd = end;
-
- this.chigh = data[start];
- this.clow = 0;
-
- this.byteIn();
-
- this.chigh = ((this.chigh << 7) & 0xFFFF) | ((this.clow >> 9) & 0x7F);
- this.clow = (this.clow << 7) & 0xFFFF;
- this.ct -= 7;
- this.a = 0x8000;
- }
-
- ArithmeticDecoder.prototype = {
- byteIn: function ArithmeticDecoder_byteIn() {
- var data = this.data;
- var bp = this.bp;
- if (data[bp] == 0xFF) {
- var b1 = data[bp + 1];
- if (b1 > 0x8F) {
- this.clow += 0xFF00;
- this.ct = 8;
- } else {
- bp++;
- this.clow += (data[bp] << 9);
- this.ct = 7;
- this.bp = bp;
- }
- } else {
- bp++;
- this.clow += bp < this.dataEnd ? (data[bp] << 8) : 0xFF00;
- this.ct = 8;
- this.bp = bp;
- }
- if (this.clow > 0xFFFF) {
- this.chigh += (this.clow >> 16);
- this.clow &= 0xFFFF;
- }
- },
- readBit: function ArithmeticDecoder_readBit(cx) {
- var qeIcx = QeTable[cx.index].qe;
- this.a -= qeIcx;
-
- if (this.chigh < qeIcx) {
- var d = this.exchangeLps(cx);
- this.renormD();
- return d;
- } else {
- this.chigh -= qeIcx;
- if ((this.a & 0x8000) == 0) {
- var d = this.exchangeMps(cx);
- this.renormD();
- return d;
- } else {
- return cx.mps;
- }
- }
- },
- renormD: function ArithmeticDecoder_renormD() {
- do {
- if (this.ct == 0)
- this.byteIn();
-
- this.a <<= 1;
- this.chigh = ((this.chigh << 1) & 0xFFFF) | ((this.clow >> 15) & 1);
- this.clow = (this.clow << 1) & 0xFFFF;
- this.ct--;
- } while ((this.a & 0x8000) == 0);
- },
- exchangeMps: function ArithmeticDecoder_exchangeMps(cx) {
- var d;
- var qeTableIcx = QeTable[cx.index];
- if (this.a < qeTableIcx.qe) {
- d = 1 - cx.mps;
-
- if (qeTableIcx.switchFlag == 1) {
- cx.mps = 1 - cx.mps;
- }
- cx.index = qeTableIcx.nlps;
- } else {
- d = cx.mps;
- cx.index = qeTableIcx.nmps;
- }
- return d;
- },
- exchangeLps: function ArithmeticDecoder_exchangeLps(cx) {
- var d;
- var qeTableIcx = QeTable[cx.index];
- if (this.a < qeTableIcx.qe) {
- this.a = qeTableIcx.qe;
- d = cx.mps;
- cx.index = qeTableIcx.nmps;
- } else {
- this.a = qeTableIcx.qe;
- d = 1 - cx.mps;
-
- if (qeTableIcx.switchFlag == 1) {
- cx.mps = 1 - cx.mps;
- }
- cx.index = qeTableIcx.nlps;
- }
- return d;
- }
- };
-
- return ArithmeticDecoder;
- })();
-
- // Section D. Coefficient bit modeling
- var BitModel = (function BitModelClosure() {
- // Table D-1
- // The index is binary presentation: 0dddvvhh, ddd - sum of Di (0..4),
- // vv - sum of Vi (0..2), and hh - sum of Hi (0..2)
- var LLAndLHContextsLabel = new Uint8Array([
- 0, 5, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 1, 6, 8, 0, 3, 7, 8, 0, 4,
- 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6,
- 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8
- ]);
- var HLContextLabel = new Uint8Array([
- 0, 3, 4, 0, 5, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 1, 3, 4, 0, 6, 7, 7, 0, 8,
- 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3,
- 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8
- ]);
- var HHContextLabel = new Uint8Array([
- 0, 1, 2, 0, 1, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 3, 4, 5, 0, 4, 5, 5, 0, 5,
- 5, 5, 0, 0, 0, 0, 0, 6, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, 8, 8,
- 8, 0, 8, 8, 8, 0, 8, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8
- ]);
-
- // Table D-2
- function calcSignContribution(significance0, sign0, significance1, sign1) {
- if (significance1) {
- if (!sign1)
- return significance0 ? (!sign0 ? 1 : 0) : 1;
- else
- return significance0 ? (!sign0 ? 0 : -1) : -1;
- } else
- return significance0 ? (!sign0 ? 1 : -1) : 0;
- }
- // Table D-3
- var SignContextLabels = [
- {contextLabel: 13, xorBit: 0},
- {contextLabel: 12, xorBit: 0},
- {contextLabel: 11, xorBit: 0},
- {contextLabel: 10, xorBit: 0},
- {contextLabel: 9, xorBit: 0},
- {contextLabel: 10, xorBit: 1},
- {contextLabel: 11, xorBit: 1},
- {contextLabel: 12, xorBit: 1},
- {contextLabel: 13, xorBit: 1}
- ];
-
- function BitModel(width, height, subband, zeroBitPlanes) {
- this.width = width;
- this.height = height;
-
- this.contextLabelTable = subband == 'HH' ? HHContextLabel :
- subband == 'HL' ? HLContextLabel : LLAndLHContextsLabel;
-
- var coefficientCount = width * height;
-
- // coefficients outside the encoding region treated as insignificant
- // add border state cells for significanceState
- this.neighborsSignificance = new Uint8Array(coefficientCount);
- this.coefficentsSign = new Uint8Array(coefficientCount);
- this.coefficentsMagnitude = new Uint32Array(coefficientCount);
- this.processingFlags = new Uint8Array(coefficientCount);
-
- var bitsDecoded = new Uint8Array(this.width * this.height);
- for (var i = 0, ii = bitsDecoded.length; i < ii; i++)
- bitsDecoded[i] = zeroBitPlanes;
- this.bitsDecoded = bitsDecoded;
-
- this.reset();
- }
-
- BitModel.prototype = {
- setDecoder: function BitModel_setDecoder(decoder) {
- this.decoder = decoder;
- },
- reset: function BitModel_reset() {
- this.uniformContext = {index: 46, mps: 0};
- this.runLengthContext = {index: 3, mps: 0};
- this.contexts = [];
- this.contexts.push({index: 4, mps: 0});
- for (var i = 1; i <= 16; i++)
- this.contexts.push({index: 0, mps: 0});
- },
- setNeighborsSignificance:
- function BitModel_setNeighborsSignificance(row, column) {
- var neighborsSignificance = this.neighborsSignificance;
- var width = this.width, height = this.height;
- var index = row * width + column;
- if (row > 0) {
- if (column > 0)
- neighborsSignificance[index - width - 1] += 0x10;
- if (column + 1 < width)
- neighborsSignificance[index - width + 1] += 0x10;
- neighborsSignificance[index - width] += 0x04;
- }
- if (row + 1 < height) {
- if (column > 0)
- neighborsSignificance[index + width - 1] += 0x10;
- if (column + 1 < width)
- neighborsSignificance[index + width + 1] += 0x10;
- neighborsSignificance[index + width] += 0x04;
- }
- if (column > 0)
- neighborsSignificance[index - 1] += 0x01;
- if (column + 1 < width)
- neighborsSignificance[index + 1] += 0x01;
- neighborsSignificance[index] |= 0x80;
- },
- runSignificancePropogationPass:
- function BitModel_runSignificancePropogationPass() {
- var decoder = this.decoder;
- var width = this.width, height = this.height;
- var coefficentsMagnitude = this.coefficentsMagnitude;
- var coefficentsSign = this.coefficentsSign;
- var contextLabels = this.contextLabels;
- var neighborsSignificance = this.neighborsSignificance;
- var processingFlags = this.processingFlags;
- var contexts = this.contexts;
- var labels = this.contextLabelTable;
- var bitsDecoded = this.bitsDecoded;
- // clear processed flag
- var processedInverseMask = ~1;
- var processedMask = 1;
- var firstMagnitudeBitMask = 2;
- for (var q = 0, qq = width * height; q < qq; q++)
- processingFlags[q] &= processedInverseMask;
-
- for (var i0 = 0; i0 < height; i0 += 4) {
- for (var j = 0; j < width; j++) {
- var index = i0 * width + j;
- for (var i1 = 0; i1 < 4; i1++, index += width) {
- var i = i0 + i1;
- if (i >= height)
- break;
-
- if (coefficentsMagnitude[index] || !neighborsSignificance[index])
- continue;
-
- var contextLabel = labels[neighborsSignificance[index]];
- var cx = contexts[contextLabel];
- var decision = decoder.readBit(cx);
- if (decision) {
- var sign = this.decodeSignBit(i, j);
- coefficentsSign[index] = sign;
- coefficentsMagnitude[index] = 1;
- this.setNeighborsSignificance(i, j);
- processingFlags[index] |= firstMagnitudeBitMask;
- }
- bitsDecoded[index]++;
- processingFlags[index] |= processedMask;
- }
- }
- }
- },
- decodeSignBit: function BitModel_decodeSignBit(row, column) {
- var width = this.width, height = this.height;
- var index = row * width + column;
- var coefficentsMagnitude = this.coefficentsMagnitude;
- var coefficentsSign = this.coefficentsSign;
- var horizontalContribution = calcSignContribution(
- column > 0 && coefficentsMagnitude[index - 1],
- coefficentsSign[index - 1],
- column + 1 < width && coefficentsMagnitude[index + 1],
- coefficentsSign[index + 1]);
- var verticalContribution = calcSignContribution(
- row > 0 && coefficentsMagnitude[index - width],
- coefficentsSign[index - width],
- row + 1 < height && coefficentsMagnitude[index + width],
- coefficentsSign[index + width]);
-
- var contextLabelAndXor = SignContextLabels[
- 3 * (1 - horizontalContribution) + (1 - verticalContribution)];
- var contextLabel = contextLabelAndXor.contextLabel;
- var cx = this.contexts[contextLabel];
- var decoded = this.decoder.readBit(cx);
- return decoded ^ contextLabelAndXor.xorBit;
- },
- runMagnitudeRefinementPass:
- function BitModel_runMagnitudeRefinementPass() {
- var decoder = this.decoder;
- var width = this.width, height = this.height;
- var coefficentsMagnitude = this.coefficentsMagnitude;
- var neighborsSignificance = this.neighborsSignificance;
- var contexts = this.contexts;
- var bitsDecoded = this.bitsDecoded;
- var processingFlags = this.processingFlags;
- var processedMask = 1;
- var firstMagnitudeBitMask = 2;
- for (var i0 = 0; i0 < height; i0 += 4) {
- for (var j = 0; j < width; j++) {
- for (var i1 = 0; i1 < 4; i1++) {
- var i = i0 + i1;
- if (i >= height)
- break;
- var index = i * width + j;
-
- // significant but not those that have just become
- if (!coefficentsMagnitude[index] ||
- (processingFlags[index] & processedMask) != 0)
- continue;
-
- var contextLabel = 16;
- if ((processingFlags[index] &
- firstMagnitudeBitMask) != 0) {
- processingFlags[i * width + j] ^= firstMagnitudeBitMask;
- // first refinement
- var significance = neighborsSignificance[index];
- var sumOfSignificance = (significance & 3) +
- ((significance >> 2) & 3) + ((significance >> 4) & 7);
- contextLabel = sumOfSignificance >= 1 ? 15 : 14;
- }
-
- var cx = contexts[contextLabel];
- var bit = decoder.readBit(cx);
- coefficentsMagnitude[index] =
- (coefficentsMagnitude[index] << 1) | bit;
- bitsDecoded[index]++;
- processingFlags[index] |= processedMask;
- }
- }
- }
- },
- runCleanupPass: function BitModel_runCleanupPass() {
- var decoder = this.decoder;
- var width = this.width, height = this.height;
- var neighborsSignificance = this.neighborsSignificance;
- var significanceState = this.significanceState;
- var coefficentsMagnitude = this.coefficentsMagnitude;
- var coefficentsSign = this.coefficentsSign;
- var contexts = this.contexts;
- var labels = this.contextLabelTable;
- var bitsDecoded = this.bitsDecoded;
- var processingFlags = this.processingFlags;
- var processedMask = 1;
- var firstMagnitudeBitMask = 2;
- var oneRowDown = width;
- var twoRowsDown = width * 2;
- var threeRowsDown = width * 3;
- for (var i0 = 0; i0 < height; i0 += 4) {
- for (var j = 0; j < width; j++) {
- var index0 = i0 * width + j;
- // using the property: labels[neighborsSignificance[index]] == 0
- // when neighborsSignificance[index] == 0
- var allEmpty = i0 + 3 < height &&
- processingFlags[index0] == 0 &&
- processingFlags[index0 + oneRowDown] == 0 &&
- processingFlags[index0 + twoRowsDown] == 0 &&
- processingFlags[index0 + threeRowsDown] == 0 &&
- neighborsSignificance[index0] == 0 &&
- neighborsSignificance[index0 + oneRowDown] == 0 &&
- neighborsSignificance[index0 + twoRowsDown] == 0 &&
- neighborsSignificance[index0 + threeRowsDown] == 0;
- var i1 = 0, index = index0;
- var cx, i;
- if (allEmpty) {
- cx = this.runLengthContext;
- var hasSignificantCoefficent = decoder.readBit(cx);
- if (!hasSignificantCoefficent) {
- bitsDecoded[index0]++;
- bitsDecoded[index0 + oneRowDown]++;
- bitsDecoded[index0 + twoRowsDown]++;
- bitsDecoded[index0 + threeRowsDown]++;
- continue; // next column
- }
- cx = this.uniformContext;
- i1 = (decoder.readBit(cx) << 1) | decoder.readBit(cx);
- i = i0 + i1;
- index += i1 * width;
-
- var sign = this.decodeSignBit(i, j);
- coefficentsSign[index] = sign;
- coefficentsMagnitude[index] = 1;
- this.setNeighborsSignificance(i, j);
- processingFlags[index] |= firstMagnitudeBitMask;
-
- index = index0;
- for (var i2 = i0; i2 <= i; i2++, index += width)
- bitsDecoded[index]++;
-
- i1++;
- }
- for (; i1 < 4; i1++, index += width) {
- i = i0 + i1;
- if (i >= height)
- break;
-
- if (coefficentsMagnitude[index] ||
- (processingFlags[index] & processedMask) != 0)
- continue;
-
- var contextLabel = labels[neighborsSignificance[index]];
- cx = contexts[contextLabel];
- var decision = decoder.readBit(cx);
- if (decision == 1) {
- var sign = this.decodeSignBit(i, j);
- coefficentsSign[index] = sign;
- coefficentsMagnitude[index] = 1;
- this.setNeighborsSignificance(i, j);
- processingFlags[index] |= firstMagnitudeBitMask;
- }
- bitsDecoded[index]++;
- }
- }
- }
- },
- checkSegmentationSymbol: function BitModel_checkSegmentationSymbol() {
- var decoder = this.decoder;
- var cx = this.uniformContext;
- var symbol = (decoder.readBit(cx) << 3) | (decoder.readBit(cx) << 2) |
- (decoder.readBit(cx) << 1) | decoder.readBit(cx);
- if (symbol != 0xA)
- throw 'Invalid segmentation symbol';
- }
- };
-
- return BitModel;
- })();
-
- // Section F, Discrete wavelet transofrmation
- var Transform = (function TransformClosure() {
- function Transform() {
- }
- Transform.prototype.calculate =
- function transformCalculate(subbands, u0, v0) {
- var ll = subbands[0];
- for (var i = 1, ii = subbands.length, j = 1; i < ii; i += 3, j++) {
- ll = this.iterate(ll, subbands[i], subbands[i + 1],
- subbands[i + 2], u0, v0);
- }
- return ll;
- };
- Transform.prototype.iterate = function Transform_iterate(ll, hl, lh, hh,
- u0, v0) {
- var llWidth = ll.width, llHeight = ll.height, llItems = ll.items;
- var hlWidth = hl.width, hlHeight = hl.height, hlItems = hl.items;
- var lhWidth = lh.width, lhHeight = lh.height, lhItems = lh.items;
- var hhWidth = hh.width, hhHeight = hh.height, hhItems = hh.items;
-
- // Section F.3.3 interleave
- var width = llWidth + hlWidth;
- var height = llHeight + lhHeight;
- var items = new Float32Array(width * height);
- for (var i = 0, ii = llHeight; i < ii; i++) {
- var k = i * llWidth, l = i * 2 * width;
- for (var j = 0, jj = llWidth; j < jj; j++, k++, l += 2)
- items[l] = llItems[k];
- }
- for (var i = 0, ii = hlHeight; i < ii; i++) {
- var k = i * hlWidth, l = i * 2 * width + 1;
- for (var j = 0, jj = hlWidth; j < jj; j++, k++, l += 2)
- items[l] = hlItems[k];
- }
- for (var i = 0, ii = lhHeight; i < ii; i++) {
- var k = i * lhWidth, l = (i * 2 + 1) * width;
- for (var j = 0, jj = lhWidth; j < jj; j++, k++, l += 2)
- items[l] = lhItems[k];
- }
- for (var i = 0, ii = hhHeight; i < ii; i++) {
- var k = i * hhWidth, l = (i * 2 + 1) * width + 1;
- for (var j = 0, jj = hhWidth; j < jj; j++, k++, l += 2)
- items[l] = hhItems[k];
- }
-
- var bufferPadding = 4;
- var bufferLength = new Float32Array(Math.max(width, height) +
- 2 * bufferPadding);
- var buffer = new Float32Array(bufferLength);
- var bufferOut = new Float32Array(bufferLength);
-
- // Section F.3.4 HOR_SR
- for (var v = 0; v < height; v++) {
- if (width == 1) {
- // if width = 1, when u0 even keep items as is, when odd divide by 2
- if ((u0 % 1) != 0) {
- items[v * width] /= 2;
- }
- continue;
- }
-
- var k = v * width;
- var l = bufferPadding;
- for (var u = 0; u < width; u++, k++, l++)
- buffer[l] = items[k];
-
- // Section F.3.7 extending... using max extension of 4
- var i1 = bufferPadding - 1, j1 = bufferPadding + 1;
- var i2 = bufferPadding + width - 2, j2 = bufferPadding + width;
- buffer[i1--] = buffer[j1++];
- buffer[j2++] = buffer[i2--];
- buffer[i1--] = buffer[j1++];
- buffer[j2++] = buffer[i2--];
- buffer[i1--] = buffer[j1++];
- buffer[j2++] = buffer[i2--];
- buffer[i1--] = buffer[j1++];
- buffer[j2++] = buffer[i2--];
-
- this.filter(buffer, bufferPadding, width, u0, bufferOut);
-
- k = v * width;
- l = bufferPadding;
- for (var u = 0; u < width; u++, k++, l++)
- items[k] = bufferOut[l];
- }
-
- // Section F.3.5 VER_SR
- for (var u = 0; u < width; u++) {
- if (height == 1) {
- // if height = 1, when v0 even keep items as is, when odd divide by 2
- if ((v0 % 1) != 0) {
- items[u] /= 2;
- }
- continue;
- }
-
- var k = u;
- var l = bufferPadding;
- for (var v = 0; v < height; v++, k += width, l++)
- buffer[l] = items[k];
-
- // Section F.3.7 extending... using max extension of 4
- var i1 = bufferPadding - 1, j1 = bufferPadding + 1;
- var i2 = bufferPadding + height - 2, j2 = bufferPadding + height;
- buffer[i1--] = buffer[j1++];
- buffer[j2++] = buffer[i2--];
- buffer[i1--] = buffer[j1++];
- buffer[j2++] = buffer[i2--];
- buffer[i1--] = buffer[j1++];
- buffer[j2++] = buffer[i2--];
- buffer[i1--] = buffer[j1++];
- buffer[j2++] = buffer[i2--];
-
- this.filter(buffer, bufferPadding, height, v0, bufferOut);
-
- k = u;
- l = bufferPadding;
- for (var v = 0; v < height; v++, k += width, l++)
- items[k] = bufferOut[l];
- }
- return {
- width: width,
- height: height,
- items: items
- };
- };
- return Transform;
- })();
-
- // Section 3.8.2 Irreversible 9-7 filter
- var IrreversibleTransform = (function IrreversibleTransformClosure() {
- function IrreversibleTransform() {
- Transform.call(this);
- }
-
- IrreversibleTransform.prototype = Object.create(Transform.prototype);
- IrreversibleTransform.prototype.filter =
- function irreversibleTransformFilter(y, offset, length, i0, x) {
- var i0_ = Math.floor(i0 / 2);
- var i1_ = Math.floor((i0 + length) / 2);
- var offset_ = offset - (i0 % 1);
-
- var alpha = -1.586134342059924;
- var beta = -0.052980118572961;
- var gamma = 0.882911075530934;
- var delta = 0.443506852043971;
- var K = 1.230174104914001;
- var K_ = 1 / K;
-
- // step 1
- var j = offset_ - 2;
- for (var n = i0_ - 1, nn = i1_ + 2; n < nn; n++, j += 2)
- x[j] = K * y[j];
-
- // step 2
- var j = offset_ - 3;
- for (var n = i0_ - 2, nn = i1_ + 2; n < nn; n++, j += 2)
- x[j] = K_ * y[j];
-
- // step 3
- var j = offset_ - 2;
- for (var n = i0_ - 1, nn = i1_ + 2; n < nn; n++, j += 2)
- x[j] -= delta * (x[j - 1] + x[j + 1]);
-
- // step 4
- var j = offset_ - 1;
- for (var n = i0_ - 1, nn = i1_ + 1; n < nn; n++, j += 2)
- x[j] -= gamma * (x[j - 1] + x[j + 1]);
-
- // step 5
- var j = offset_;
- for (var n = i0_, nn = i1_ + 1; n < nn; n++, j += 2)
- x[j] -= beta * (x[j - 1] + x[j + 1]);
-
- // step 6
- var j = offset_ + 1;
- for (var n = i0_, nn = i1_; n < nn; n++, j += 2)
- x[j] -= alpha * (x[j - 1] + x[j + 1]);
- };
-
- return IrreversibleTransform;
- })();
-
- // Section 3.8.1 Reversible 5-3 filter
- var ReversibleTransform = (function ReversibleTransformClosure() {
- function ReversibleTransform() {
- Transform.call(this);
- }
-
- ReversibleTransform.prototype = Object.create(Transform.prototype);
- ReversibleTransform.prototype.filter =
- function reversibleTransformFilter(y, offset, length, i0, x) {
- var i0_ = Math.floor(i0 / 2);
- var i1_ = Math.floor((i0 + length) / 2);
- var offset_ = offset - (i0 % 1);
-
- for (var n = i0_, nn = i1_ + 1, j = offset_; n < nn; n++, j += 2)
- x[j] = y[j] - Math.floor((y[j - 1] + y[j + 1] + 2) / 4);
-
- for (var n = i0_, nn = i1_, j = offset_ + 1; n < nn; n++, j += 2)
- x[j] = y[j] + Math.floor((x[j - 1] + x[j + 1]) / 2);
- };
-
- return ReversibleTransform;
- })();
-
- return JpxImage;
-})();
-
-
-
-var Jbig2Image = (function Jbig2ImageClosure() {
-
- // Annex E. Arithmetic Coding
- var ArithmeticDecoder = (function ArithmeticDecoderClosure() {
- var QeTable = [
- {qe: 0x5601, nmps: 1, nlps: 1, switchFlag: 1},
- {qe: 0x3401, nmps: 2, nlps: 6, switchFlag: 0},
- {qe: 0x1801, nmps: 3, nlps: 9, switchFlag: 0},
- {qe: 0x0AC1, nmps: 4, nlps: 12, switchFlag: 0},
- {qe: 0x0521, nmps: 5, nlps: 29, switchFlag: 0},
- {qe: 0x0221, nmps: 38, nlps: 33, switchFlag: 0},
- {qe: 0x5601, nmps: 7, nlps: 6, switchFlag: 1},
- {qe: 0x5401, nmps: 8, nlps: 14, switchFlag: 0},
- {qe: 0x4801, nmps: 9, nlps: 14, switchFlag: 0},
- {qe: 0x3801, nmps: 10, nlps: 14, switchFlag: 0},
- {qe: 0x3001, nmps: 11, nlps: 17, switchFlag: 0},
- {qe: 0x2401, nmps: 12, nlps: 18, switchFlag: 0},
- {qe: 0x1C01, nmps: 13, nlps: 20, switchFlag: 0},
- {qe: 0x1601, nmps: 29, nlps: 21, switchFlag: 0},
- {qe: 0x5601, nmps: 15, nlps: 14, switchFlag: 1},
- {qe: 0x5401, nmps: 16, nlps: 14, switchFlag: 0},
- {qe: 0x5101, nmps: 17, nlps: 15, switchFlag: 0},
- {qe: 0x4801, nmps: 18, nlps: 16, switchFlag: 0},
- {qe: 0x3801, nmps: 19, nlps: 17, switchFlag: 0},
- {qe: 0x3401, nmps: 20, nlps: 18, switchFlag: 0},
- {qe: 0x3001, nmps: 21, nlps: 19, switchFlag: 0},
- {qe: 0x2801, nmps: 22, nlps: 19, switchFlag: 0},
- {qe: 0x2401, nmps: 23, nlps: 20, switchFlag: 0},
- {qe: 0x2201, nmps: 24, nlps: 21, switchFlag: 0},
- {qe: 0x1C01, nmps: 25, nlps: 22, switchFlag: 0},
- {qe: 0x1801, nmps: 26, nlps: 23, switchFlag: 0},
- {qe: 0x1601, nmps: 27, nlps: 24, switchFlag: 0},
- {qe: 0x1401, nmps: 28, nlps: 25, switchFlag: 0},
- {qe: 0x1201, nmps: 29, nlps: 26, switchFlag: 0},
- {qe: 0x1101, nmps: 30, nlps: 27, switchFlag: 0},
- {qe: 0x0AC1, nmps: 31, nlps: 28, switchFlag: 0},
- {qe: 0x09C1, nmps: 32, nlps: 29, switchFlag: 0},
- {qe: 0x08A1, nmps: 33, nlps: 30, switchFlag: 0},
- {qe: 0x0521, nmps: 34, nlps: 31, switchFlag: 0},
- {qe: 0x0441, nmps: 35, nlps: 32, switchFlag: 0},
- {qe: 0x02A1, nmps: 36, nlps: 33, switchFlag: 0},
- {qe: 0x0221, nmps: 37, nlps: 34, switchFlag: 0},
- {qe: 0x0141, nmps: 38, nlps: 35, switchFlag: 0},
- {qe: 0x0111, nmps: 39, nlps: 36, switchFlag: 0},
- {qe: 0x0085, nmps: 40, nlps: 37, switchFlag: 0},
- {qe: 0x0049, nmps: 41, nlps: 38, switchFlag: 0},
- {qe: 0x0025, nmps: 42, nlps: 39, switchFlag: 0},
- {qe: 0x0015, nmps: 43, nlps: 40, switchFlag: 0},
- {qe: 0x0009, nmps: 44, nlps: 41, switchFlag: 0},
- {qe: 0x0005, nmps: 45, nlps: 42, switchFlag: 0},
- {qe: 0x0001, nmps: 45, nlps: 43, switchFlag: 0},
- {qe: 0x5601, nmps: 46, nlps: 46, switchFlag: 0}
- ];
-
- function ArithmeticDecoder(data, start, end) {
- this.data = data;
- this.bp = start;
- this.dataEnd = end;
-
- this.chigh = data[start];
- this.clow = 0;
-
- this.byteIn();
-
- this.chigh = ((this.chigh << 7) & 0xFFFF) | ((this.clow >> 9) & 0x7F);
- this.clow = (this.clow << 7) & 0xFFFF;
- this.ct -= 7;
- this.a = 0x8000;
- }
-
- ArithmeticDecoder.prototype = {
- byteIn: function ArithmeticDecoder_byteIn() {
- var data = this.data;
- var bp = this.bp;
- if (data[bp] == 0xFF) {
- var b1 = data[bp + 1];
- if (b1 > 0x8F) {
- this.clow += 0xFF00;
- this.ct = 8;
- } else {
- bp++;
- this.clow += (data[bp] << 9);
- this.ct = 7;
- this.bp = bp;
- }
- } else {
- bp++;
- this.clow += bp < this.dataEnd ? (data[bp] << 8) : 0xFF00;
- this.ct = 8;
- this.bp = bp;
- }
- if (this.clow > 0xFFFF) {
- this.chigh += (this.clow >> 16);
- this.clow &= 0xFFFF;
- }
- },
- readBit: function ArithmeticDecoder_readBit(cx) {
- var qeIcx = QeTable[cx.index].qe;
- this.a -= qeIcx;
-
- if (this.chigh < qeIcx) {
- var d = this.exchangeLps(cx);
- this.renormD();
- return d;
- } else {
- this.chigh -= qeIcx;
- if ((this.a & 0x8000) == 0) {
- var d = this.exchangeMps(cx);
- this.renormD();
- return d;
- } else {
- return cx.mps;
- }
- }
- },
- renormD: function ArithmeticDecoder_renormD() {
- do {
- if (this.ct == 0)
- this.byteIn();
-
- this.a <<= 1;
- this.chigh = ((this.chigh << 1) & 0xFFFF) | ((this.clow >> 15) & 1);
- this.clow = (this.clow << 1) & 0xFFFF;
- this.ct--;
- } while ((this.a & 0x8000) == 0);
- },
- exchangeMps: function ArithmeticDecoder_exchangeMps(cx) {
- var d;
- var qeTableIcx = QeTable[cx.index];
- if (this.a < qeTableIcx.qe) {
- d = 1 - cx.mps;
-
- if (qeTableIcx.switchFlag == 1) {
- cx.mps = 1 - cx.mps;
- }
- cx.index = qeTableIcx.nlps;
- } else {
- d = cx.mps;
- cx.index = qeTableIcx.nmps;
- }
- return d;
- },
- exchangeLps: function ArithmeticDecoder_exchangeLps(cx) {
- var d;
- var qeTableIcx = QeTable[cx.index];
- if (this.a < qeTableIcx.qe) {
- this.a = qeTableIcx.qe;
- d = cx.mps;
- cx.index = qeTableIcx.nmps;
- } else {
- this.a = qeTableIcx.qe;
- d = 1 - cx.mps;
-
- if (qeTableIcx.switchFlag == 1) {
- cx.mps = 1 - cx.mps;
- }
- cx.index = qeTableIcx.nlps;
- }
- return d;
- }
- };
-
- return ArithmeticDecoder;
- })();
-
- // Utility data structures
- function ContextCache() {}
-
- ContextCache.prototype = {
- getContexts: function(id) {
- if (id in this)
- return this[id];
- return (this[id] = []);
- }
- };
-
- function DecodingContext(data, start, end) {
- this.data = data;
- this.start = start;
- this.end = end;
- }
-
- DecodingContext.prototype = {
- get decoder() {
- var decoder = new ArithmeticDecoder(this.data, this.start, this.end);
- return shadow(this, 'decoder', decoder);
- },
- get contextCache() {
- var cache = new ContextCache();
- return shadow(this, 'contextCache', cache);
- }
- };
-
- // Annex A. Arithmetic Integer Decoding Procedure
- // A.2 Procedure for decoding values
- function decodeInteger(contextCache, procedure, decoder) {
- var contexts = contextCache.getContexts(procedure);
-
- var prev = 1;
- var state = 1, v = 0, s;
- var toRead = 32, offset = 4436; // defaults for state 7
- while (state) {
- var cx = contexts[prev];
- if (!cx)
- contexts[prev] = cx = {index: 0, mps: 0};
- var bit = decoder.readBit(cx);
- prev = prev < 256 ? (prev << 1) | bit :
- (((prev << 1) | bit) & 511) | 256;
- switch (state) {
- case 1:
- s = !!bit;
- break;
- case 2:
- if (bit) break;
- state = 7;
- toRead = 2;
- offset = 0;
- break;
- case 3:
- if (bit) break;
- state = 7;
- toRead = 4;
- offset = 4;
- break;
- case 4:
- if (bit) break;
- state = 7;
- toRead = 6;
- offset = 20;
- break;
- case 5:
- if (bit) break;
- state = 7;
- toRead = 8;
- offset = 84;
- break;
- case 6:
- if (bit) break;
- state = 7;
- toRead = 12;
- offset = 340;
- break;
- default:
- v = v * 2 + bit;
- if (--toRead == 0)
- state = 0;
- continue;
- }
- state++;
- }
- v += offset;
- return !s ? v : v > 0 ? -v : null;
- }
-
- // A.3 The IAID decoding procedure
- function decodeIAID(contextCache, decoder, codeLength) {
- var contexts = contextCache.getContexts('IAID');
-
- var prev = 1;
- for (var i = 0; i < codeLength; i++) {
- var cx = contexts[prev];
- if (!cx)
- contexts[prev] = cx = {index: 0, mps: 0};
- var bit = decoder.readBit(cx);
- prev = (prev * 2) + bit;
- }
- if (codeLength < 31)
- return prev & ((1 << codeLength) - 1);
- else
- return prev - Math.pow(2, codeLength);
- }
-
- // 7.3 Segment types
- var SegmentTypes = [
- 'SymbolDictionary', null, null, null, 'IntermediateTextRegion', null,
- 'ImmediateTextRegion', 'ImmediateLosslessTextRegion', null, null, null,
- null, null, null, null, null, 'patternDictionary', null, null, null,
- 'IntermediateHalftoneRegion', null, 'ImmediateHalftoneRegion',
- 'ImmediateLosslessHalftoneRegion', null, null, null, null, null, null, null,
- null, null, null, null, null, 'IntermediateGenericRegion', null,
- 'ImmediateGenericRegion', 'ImmediateLosslessGenericRegion',
- 'IntermediateGenericRefinementRegion', null,
- 'ImmediateGenericRefinementRegion',
- 'ImmediateLosslessGenericRefinementRegion', null, null, null, null,
- 'PageInformation', 'EndOfPage', 'EndOfStripe', 'EndOfFile', 'Profiles',
- 'Tables', null, null, null, null, null, null, null, null,
- 'Extension'
- ];
-
- var CodingTemplates = [
- [{x: -1, y: -2}, {x: 0, y: -2}, {x: 1, y: -2}, {x: -2, y: -1},
- {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: 2, y: -1},
- {x: -4, y: 0}, {x: -3, y: 0}, {x: -2, y: 0}, {x: -1, y: 0}],
- [{x: -1, y: -2}, {x: 0, y: -2}, {x: 1, y: -2}, {x: -2, y: -1},
- {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: 2, y: -1},
- {x: -3, y: 0}, {x: -2, y: 0}, {x: -1, y: 0}],
- [{x: -1, y: -2}, {x: 0, y: -2}, {x: 1, y: -2}, {x: -2, y: -1},
- {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: -2, y: 0},
- {x: -1, y: 0}],
- [{x: -3, y: -1}, {x: -2, y: -1}, {x: -1, y: -1}, {x: 0, y: -1},
- {x: 1, y: -1}, {x: -4, y: 0}, {x: -3, y: 0}, {x: -2, y: 0}, {x: -1, y: 0}]
- ];
-
- var RefinementTemplates = [
- {
- coding: [{x: 0, y: -1}, {x: 1, y: -1}, {x: -1, y: 0}],
- reference: [{x: 0, y: -1}, {x: 1, y: -1}, {x: -1, y: 0}, {x: 0, y: 0},
- {x: 1, y: 0}, {x: -1, y: 1}, {x: 0, y: 1}, {x: 1, y: 1}]
- },
- {
- coding: [{x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: -1, y: 0}],
- reference: [{x: 0, y: -1}, {x: -1, y: 0}, {x: 0, y: 0}, {x: 1, y: 0},
- {x: 0, y: 1}, {x: 1, y: 1}]
- }
- ];
-
- var ReusedContexts = [
- 0x1CD3, // '00111001101' (template) + '0011' (at),
- 0x079A, // '001111001101' + '0',
- 0x00E3, // '001110001' + '1',
- 0x018B // '011000101' + '1'
- ];
-
- var RefinementReusedContexts = [
- 0x0020, // '000' + '0' (coding) + '00010000' + '0' (reference)
- 0x0008 // '0000' + '001000'
- ];
-
- function log2(x) {
- var n = 1, i = 0;
- while (x > n) {
- n <<= 1;
- i++;
- }
- return i;
- }
-
- function readInt32(data, start) {
- return (data[start] << 24) | (data[start + 1] << 16) |
- (data[start + 2] << 8) | data[start + 3];
- }
-
- function readUint32(data, start) {
- var value = readInt32(data, start);
- return value & 0x80000000 ? (value + 4294967296) : value;
- }
-
- function readUint16(data, start) {
- return (data[start] << 8) | data[start + 1];
- }
-
- function readInt8(data, start) {
- return (data[start] << 24) >> 24;
- }
-
- // 6.2 Generic Region Decoding Procedure
- function decodeBitmap(mmr, width, height, templateIndex, prediction, skip, at,
- decodingContext) {
- if (mmr)
- error('JBIG2 error: MMR encoding is not supported');
-
- var useskip = !!skip;
- var template = CodingTemplates[templateIndex].concat(at);
- var templateLength = template.length;
- var templateX = new Int32Array(templateLength);
- var templateY = new Int32Array(templateLength);
- for (var k = 0; k < templateLength; k++) {
- templateX[k] = template[k].x;
- templateY[k] = template[k].y;
- }
-
- var pseudoPixelContext = ReusedContexts[templateIndex];
- var bitmap = [];
-
- var decoder = decodingContext.decoder;
- var contexts = decodingContext.contextCache.getContexts('GB');
-
- var ltp = 0;
- for (var i = 0; i < height; i++) {
- if (prediction) {
- var cx = contexts[pseudoPixelContext];
- if (!cx)
- contexts[pseudoPixelContext] = cx = {index: 0, mps: 0};
- var sltp = decoder.readBit(cx);
- ltp ^= sltp;
- }
- if (ltp) {
- bitmap.push(bitmap[bitmap.length - 1]); // duplicate previous row
- continue;
- }
- var row = new Uint8Array(width);
- bitmap.push(row);
- for (var j = 0; j < width; j++) {
- if (useskip && skip[i][j]) {
- row[j] = 0;
- continue;
- }
- var contextLabel = 0;
- for (var k = 0; k < templateLength; k++) {
- var i0 = i + templateY[k], j0 = j + templateX[k];
- if (i0 < 0 || j0 < 0 || j0 >= width)
- contextLabel <<= 1; // out of bound pixel
- else
- contextLabel = (contextLabel << 1) | bitmap[i0][j0];
- }
- var cx = contexts[contextLabel];
- if (!cx)
- contexts[contextLabel] = cx = {index: 0, mps: 0};
- var pixel = decoder.readBit(cx);
- row[j] = pixel;
- }
- }
- return bitmap;
- }
-
- // 6.3.2 Generic Refinement Region Decoding Procedure
- function decodeRefinement(width, height, templateIndex, referenceBitmap,
- offsetX, offsetY, prediction, at,
- decodingContext) {
- var codingTemplate = RefinementTemplates[templateIndex].coding;
- if (templateIndex == 0)
- codingTemplate = codingTemplate.concat([at[0]]);
- var codingTemplateLength = codingTemplate.length;
- var codingTemplateX = new Int32Array(codingTemplateLength);
- var codingTemplateY = new Int32Array(codingTemplateLength);
- for (var k = 0; k < codingTemplateLength; k++) {
- codingTemplateX[k] = codingTemplate[k].x;
- codingTemplateY[k] = codingTemplate[k].y;
- }
- var referenceTemplate = RefinementTemplates[templateIndex].reference;
- if (templateIndex == 0)
- referenceTemplate = referenceTemplate.concat([at[1]]);
- var referenceTemplateLength = referenceTemplate.length;
- var referenceTemplateX = new Int32Array(referenceTemplateLength);
- var referenceTemplateY = new Int32Array(referenceTemplateLength);
- for (var k = 0; k < referenceTemplateLength; k++) {
- referenceTemplateX[k] = referenceTemplate[k].x;
- referenceTemplateY[k] = referenceTemplate[k].y;
- }
- var referenceWidth = referenceBitmap[0].length;
- var referenceHeight = referenceBitmap.length;
-
- var pseudoPixelContext = RefinementReusedContexts[templateIndex];
- var bitmap = [];
-
- var decoder = decodingContext.decoder;
- var contexts = decodingContext.contextCache.getContexts('GR');
-
- var ltp = 0;
- for (var i = 0; i < height; i++) {
- if (prediction) {
- var cx = contexts[pseudoPixelContext];
- if (!cx)
- contexts[pseudoPixelContext] = cx = {index: 0, mps: 0};
- var sltp = decoder.readBit(cx);
- ltp ^= sltp;
- }
- var row = new Uint8Array(width);
- bitmap.push(row);
- for (var j = 0; j < width; j++) {
- if (ltp)
- error('JBIG2 error: prediction is not supported');
-
- var contextLabel = 0;
- for (var k = 0; k < codingTemplateLength; k++) {
- var i0 = i + codingTemplateY[k], j0 = j + codingTemplateX[k];
- if (i0 < 0 || j0 < 0 || j0 >= width)
- contextLabel <<= 1; // out of bound pixel
- else
- contextLabel = (contextLabel << 1) | bitmap[i0][j0];
- }
- for (var k = 0; k < referenceTemplateLength; k++) {
- var i0 = i + referenceTemplateY[k] + offsetY;
- var j0 = j + referenceTemplateX[k] + offsetX;
- if (i0 < 0 || i0 >= referenceHeight || j0 < 0 || j0 >= referenceWidth)
- contextLabel <<= 1; // out of bound pixel
- else
- contextLabel = (contextLabel << 1) | referenceBitmap[i0][j0];
- }
- var cx = contexts[contextLabel];
- if (!cx)
- contexts[contextLabel] = cx = {index: 0, mps: 0};
- var pixel = decoder.readBit(cx);
- row[j] = pixel;
- }
- }
-
- return bitmap;
- }
-
- // 6.5.5 Decoding the symbol dictionary
- function decodeSymbolDictionary(huffman, refinement, symbols,
- numberOfNewSymbols, numberOfExportedSymbols,
- huffmanTables, templateIndex, at,
- refinementTemplateIndex, refinementAt,
- decodingContext) {
- if (huffman)
- error('JBIG2 error: huffman is not supported');
-
- var newSymbols = [];
- var currentHeight = 0;
- var symbolCodeLength = log2(symbols.length + numberOfNewSymbols);
-
- var decoder = decodingContext.decoder;
- var contextCache = decodingContext.contextCache;
-
- while (newSymbols.length < numberOfNewSymbols) {
- var deltaHeight = decodeInteger(contextCache, 'IADH', decoder); // 6.5.6
- currentHeight += deltaHeight;
- var currentWidth = 0;
- var totalWidth = 0;
- while (true) {
- var deltaWidth = decodeInteger(contextCache, 'IADW', decoder); // 6.5.7
- if (deltaWidth == null)
- break; // OOB
- currentWidth += deltaWidth;
- totalWidth += currentWidth;
- var bitmap;
- if (refinement) {
- // 6.5.8.2 Refinement/aggregate-coded symbol bitmap
- var numberOfInstances = decodeInteger(contextCache, 'IAAI', decoder);
- if (numberOfInstances > 1)
- error('JBIG2 error: number of instances > 1 is not supported');
- var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength);
- var rdx = decodeInteger(contextCache, 'IARDX', decoder); // 6.4.11.3
- var rdy = decodeInteger(contextCache, 'IARDY', decoder); // 6.4.11.4
- var symbol = symbolId < symbols.length ? symbols[symbolId] :
- newSymbols[symbolId - symbols.length];
- bitmap = decodeRefinement(currentWidth, currentHeight,
- refinementTemplateIndex, symbol, rdx, rdy, false, refinementAt,
- decodingContext);
- } else {
- // 6.5.8.1 Direct-coded symbol bitmap
- bitmap = decodeBitmap(false, currentWidth, currentHeight,
- templateIndex, false, null, at, decodingContext);
- }
- newSymbols.push(bitmap);
- }
- }
- // 6.5.10 Exported symbols
- var exportedSymbols = [];
- var flags = [], currentFlag = false;
- var totalSymbolsLength = symbols.length + numberOfNewSymbols;
- while (flags.length < totalSymbolsLength) {
- var runLength = decodeInteger(contextCache, 'IAEX', decoder);
- while (runLength--)
- flags.push(currentFlag);
- currentFlag = !currentFlag;
- }
- for (var i = 0, ii = symbols.length; i < ii; i++)
- if (flags[i]) exportedSymbols.push(symbols[i]);
- for (var j = 0; j < numberOfNewSymbols; i++, j++)
- if (flags[i]) exportedSymbols.push(newSymbols[j]);
- return exportedSymbols;
- }
-
- function decodeTextRegion(huffman, refinement, width, height,
- defaultPixelValue, numberOfSymbolInstances,
- stripSize, inputSymbols, symbolCodeLength,
- transposed, dsOffset, referenceCorner,
- combinationOperator, huffmanTables,
- refinementTemplateIndex, refinementAt,
- decodingContext) {
- if (huffman)
- error('JBIG2 error: huffman is not supported');
-
- // Prepare bitmap
- var bitmap = [];
- for (var i = 0; i < height; i++) {
- var row = new Uint8Array(width);
- if (defaultPixelValue) {
- for (var j = 0; j < width; j++)
- row[j] = defaultPixelValue;
- }
- bitmap.push(row);
- }
-
- var decoder = decodingContext.decoder;
- var contextCache = decodingContext.contextCache;
-
- if (transposed)
- error('JBIG2 error: transposed is not supported');
-
- var stripT = -decodeInteger(contextCache, 'IADT', decoder); // 6.4.6
- var firstS = 0;
- var i = 0;
- while (i < numberOfSymbolInstances) {
- var deltaT = decodeInteger(contextCache, 'IADT', decoder); // 6.4.6
- stripT += deltaT;
-
- var deltaFirstS = decodeInteger(contextCache, 'IAFS', decoder); // 6.4.7
- firstS += deltaFirstS;
- var currentS = firstS;
- do {
- var currentT = stripSize == 1 ? 0 :
- decodeInteger(contextCache, 'IAIT', decoder); // 6.4.9
- var t = stripSize * stripT + currentT;
- var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength);
- var applyRefinement = refinement &&
- decodeInteger(contextCache, 'IARI', decoder);
- var symbolBitmap = inputSymbols[symbolId];
- var symbolWidth = symbolBitmap[0].length;
- var symbolHeight = symbolBitmap.length;
- if (applyRefinement) {
- var rdw = decodeInteger(contextCache, 'IARDW', decoder); // 6.4.11.1
- var rdh = decodeInteger(contextCache, 'IARDH', decoder); // 6.4.11.2
- var rdx = decodeInteger(contextCache, 'IARDX', decoder); // 6.4.11.3
- var rdy = decodeInteger(contextCache, 'IARDY', decoder); // 6.4.11.4
- symbolWidth += rdw;
- symbolHeight += rdh;
- symbolBitmap = decodeRefinement(symbolWidth, symbolHeight,
- refinementTemplateIndex, symbolBitmap, (rdw >> 1) + rdx,
- (rdh >> 1) + rdy, false, refinementAt,
- decodingContext);
- }
- var offsetT = t - ((referenceCorner & 1) ? 0 : symbolHeight);
- var offsetS = currentS - ((referenceCorner & 2) ? symbolWidth : 0);
- for (var t2 = 0; t2 < symbolHeight; t2++) {
- var row = bitmap[offsetT + t2];
- if (!row) continue;
- var symbolRow = symbolBitmap[t2];
- switch (combinationOperator) {
- case 0: // OR
- for (var s2 = 0; s2 < symbolWidth; s2++)
- row[offsetS + s2] |= symbolRow[s2];
- break;
- case 2: // XOR
- for (var s2 = 0; s2 < symbolWidth; s2++)
- row[offsetS + s2] ^= symbolRow[s2];
- break;
- default:
- error('JBIG2 error: operator ' + combinationOperator +
- ' is not supported');
- }
- }
-
- currentS += symbolWidth - 1;
- i++;
-
- var deltaS = decodeInteger(contextCache, 'IADS', decoder); // 6.4.8
- if (deltaS == null)
- break; // OOB
- currentS += deltaS + dsOffset;
- } while (true);
- }
- return bitmap;
- }
-
- function readSegmentHeader(data, start) {
- var segmentHeader = {};
- segmentHeader.number = readUint32(data, start);
- var flags = data[start + 4];
- var segmentType = flags & 0x3F;
- if (!SegmentTypes[segmentType])
- error('JBIG2 error: invalid segment type: ' + segmentType);
- segmentHeader.type = segmentType;
- segmentHeader.typeName = SegmentTypes[segmentType];
- segmentHeader.deferredNonRetain = !!(flags & 0x80);
- var pageAssociationFieldSize = !!(flags & 0x40);
- var referredFlags = data[start + 5];
- var referredToCount = (referredFlags >> 5) & 7;
- var retainBits = [referredFlags & 31];
- var position = start + 6;
- if (referredFlags == 7) {
- referredToCount = readInt32(data, position - 1) & 0x1FFFFFFF;
- position += 3;
- var bytes = (referredToCount + 7) >> 3;
- retainBits[0] = data[position++];
- while (--bytes > 0) {
- retainBits.push(data[position++]);
- }
- } else if (referredFlags == 5 || referredFlags == 6)
- error('JBIG2 error: invalid referred-to flags');
- segmentHeader.retainBits = retainBits;
- var referredToSegmentNumberSize = segmentHeader.number <= 256 ? 1 :
- segmentHeader.number <= 65536 ? 2 : 4;
- var referredTo = [];
- for (var i = 0; i < referredToCount; i++) {
- var number = referredToSegmentNumberSize == 1 ? data[position] :
- referredToSegmentNumberSize == 2 ? readUint16(data, position) :
- readUint32(data, position);
- referredTo.push(number);
- position += referredToSegmentNumberSize;
- }
- segmentHeader.referredTo = referredTo;
- if (!pageAssociationFieldSize)
- segmentHeader.pageAssociation = data[position++];
- else {
- segmentHeader.pageAssociation = readUint32(data, position);
- position += 4;
- }
- segmentHeader.length = readUint32(data, position);
- if (segmentHeader.length == 0xFFFFFFFF)
- error('JBIG2 error: unknown segment length is not supported');
- position += 4;
- segmentHeader.headerEnd = position;
- return segmentHeader;
- }
-
- function readSegments(header, data, start, end) {
- var segments = [];
- var position = start;
- while (position < end) {
- var segmentHeader = readSegmentHeader(data, position);
- position = segmentHeader.headerEnd;
- var segment = {
- header: segmentHeader,
- data: data
- };
- if (!header.randomAccess) {
- segment.start = position;
- position += segmentHeader.length;
- segment.end = position;
- }
- segments.push(segment);
- if (segmentHeader.type == 51)
- break; // end of file is found
- }
- if (header.randomAccess) {
- for (var i = 0, ii = segments.length; i < ii; i++) {
- segments[i].start = position;
- position += segments[i].header.length;
- segments[i].end = position;
- }
- }
- return segments;
- }
-
- // 7.4.1 Region segment information field
- function readRegionSegmentInformation(data, start) {
- return {
- width: readUint32(data, start),
- height: readUint32(data, start + 4),
- x: readUint32(data, start + 8),
- y: readUint32(data, start + 12),
- combinationOperator: data[start + 16] & 7
- };
- }
- var RegionSegmentInformationFieldLength = 17;
-
- function processSegment(segment, visitor) {
- var header = segment.header;
-
- var data = segment.data, position = segment.start, end = segment.end;
- var args;
- switch (header.type) {
- case 0: // SymbolDictionary
- // 7.4.2 Symbol dictionary segment syntax
- var dictionary = {};
- var dictionaryFlags = readUint16(data, position); // 7.4.2.1.1
- dictionary.huffman = !!(dictionaryFlags & 1);
- dictionary.refinement = !!(dictionaryFlags & 2);
- dictionary.huffmanDHSelector = (dictionaryFlags >> 2) & 3;
- dictionary.huffmanDWSelector = (dictionaryFlags >> 4) & 3;
- dictionary.bitmapSizeSelector = (dictionaryFlags >> 6) & 1;
- dictionary.aggregationInstancesSelector = (dictionaryFlags >> 7) & 1;
- dictionary.bitmapCodingContextUsed = !!(dictionaryFlags & 256);
- dictionary.bitmapCodingContextRetained = !!(dictionaryFlags & 512);
- dictionary.template = (dictionaryFlags >> 10) & 3;
- dictionary.refinementTemplate = (dictionaryFlags >> 12) & 1;
- position += 2;
- if (!dictionary.huffman) {
- var atLength = dictionary.template == 0 ? 4 : 1;
- var at = [];
- for (var i = 0; i < atLength; i++) {
- at.push({
- x: readInt8(data, position),
- y: readInt8(data, position + 1)
- });
- position += 2;
- }
- dictionary.at = at;
- }
- if (dictionary.refinement && !dictionary.refinementTemplate) {
- var at = [];
- for (var i = 0; i < 2; i++) {
- at.push({
- x: readInt8(data, position),
- y: readInt8(data, position + 1)
- });
- position += 2;
- }
- dictionary.refinementAt = at;
- }
- dictionary.numberOfExportedSymbols = readUint32(data, position);
- position += 4;
- dictionary.numberOfNewSymbols = readUint32(data, position);
- position += 4;
- args = [dictionary, header.number, header.referredTo,
- data, position, end];
- break;
- case 6: // ImmediateTextRegion
- case 7: // ImmediateLosslessTextRegion
- var textRegion = {};
- textRegion.info = readRegionSegmentInformation(data, position);
- position += RegionSegmentInformationFieldLength;
- var textRegionSegmentFlags = readUint16(data, position);
- position += 2;
- textRegion.huffman = !!(textRegionSegmentFlags & 1);
- textRegion.refinement = !!(textRegionSegmentFlags & 2);
- textRegion.stripSize = 1 << ((textRegionSegmentFlags >> 2) & 3);
- textRegion.referenceCorner = (textRegionSegmentFlags >> 4) & 3;
- textRegion.transposed = !!(textRegionSegmentFlags & 64);
- textRegion.combinationOperator = (textRegionSegmentFlags >> 7) & 3;
- textRegion.defaultPixelValue = (textRegionSegmentFlags >> 9) & 1;
- textRegion.dsOffset = (textRegionSegmentFlags >> 10) & 31;
- textRegion.refinementTemplate = (textRegionSegmentFlags >> 15) & 1;
- if (textRegion.huffman) {
- var textRegionHuffmanFlags = readUint16(data, position);
- position += 2;
- textRegion.huffmanFS = (textRegionHuffmanFlags) & 3;
- textRegion.huffmanDS = (textRegionHuffmanFlags >> 2) & 3;
- textRegion.huffmanDT = (textRegionHuffmanFlags >> 4) & 3;
- textRegion.huffmanRefinementDW = (textRegionHuffmanFlags >> 6) & 3;
- textRegion.huffmanRefinementDH = (textRegionHuffmanFlags >> 8) & 3;
- textRegion.huffmanRefinementDX = (textRegionHuffmanFlags >> 10) & 3;
- textRegion.huffmanRefinementDY = (textRegionHuffmanFlags >> 12) & 3;
- textRegion.huffmanRefinementSizeSelector =
- !!(textRegionHuffmanFlags & 14);
- }
- if (textRegion.refinement && !textRegion.refinementTemplate) {
- var at = [];
- for (var i = 0; i < 2; i++) {
- at.push({
- x: readInt8(data, position),
- y: readInt8(data, position + 1)
- });
- position += 2;
- }
- textRegion.refinementAt = at;
- }
- textRegion.numberOfSymbolInstances = readUint32(data, position);
- position += 4;
- // TODO 7.4.3.1.7 Symbol ID Huffman table decoding
- if (textRegion.huffman)
- error('JBIG2 error: huffman is not supported');
- args = [textRegion, header.referredTo, data, position, end];
- break;
- case 38: // ImmediateGenericRegion
- case 39: // ImmediateLosslessGenericRegion
- var genericRegion = {};
- genericRegion.info = readRegionSegmentInformation(data, position);
- position += RegionSegmentInformationFieldLength;
- var genericRegionSegmentFlags = data[position++];
- genericRegion.mmr = !!(genericRegionSegmentFlags & 1);
- genericRegion.template = (genericRegionSegmentFlags >> 1) & 3;
- genericRegion.prediction = !!(genericRegionSegmentFlags & 8);
- if (!genericRegion.mmr) {
- var atLength = genericRegion.template == 0 ? 4 : 1;
- var at = [];
- for (var i = 0; i < atLength; i++) {
- at.push({
- x: readInt8(data, position),
- y: readInt8(data, position + 1)
- });
- position += 2;
- }
- genericRegion.at = at;
- }
- args = [genericRegion, data, position, end];
- break;
- case 48: // PageInformation
- var pageInfo = {
- width: readUint32(data, position),
- height: readUint32(data, position + 4),
- resolutionX: readUint32(data, position + 8),
- resolutionY: readUint32(data, position + 12)
- };
- if (pageInfo.height == 0xFFFFFFFF)
- delete pageInfo.height;
- var pageSegmentFlags = data[position + 16];
- var pageStripingInformatiom = readUint16(data, position + 17);
- pageInfo.lossless = !!(pageSegmentFlags & 1);
- pageInfo.refinement = !!(pageSegmentFlags & 2);
- pageInfo.defaultPixelValue = (pageSegmentFlags >> 2) & 1;
- pageInfo.combinationOperator = (pageSegmentFlags >> 3) & 3;
- pageInfo.requiresBuffer = !!(pageSegmentFlags & 32);
- pageInfo.combinationOperatorOverride = !!(pageSegmentFlags & 64);
- args = [pageInfo];
- break;
- case 50: // EndOfStripe
- break;
- case 51: // EndOfFile
- break;
- default:
- error('JBIG2 error: segment type ' + header.typeName + '(' +
- header.type + ') is not implemented');
- }
- var callbackName = 'on' + header.typeName;
- if (callbackName in visitor)
- visitor[callbackName].apply(visitor, args);
- }
-
- function processSegments(segments, visitor) {
- for (var i = 0, ii = segments.length; i < ii; i++)
- processSegment(segments[i], visitor);
- }
-
- function parseJbig2(data, start, end) {
- var position = start;
- if (data[position] != 0x97 || data[position + 1] != 0x4A ||
- data[position + 2] != 0x42 || data[position + 3] != 0x32 ||
- data[position + 4] != 0x0D || data[position + 5] != 0x0A ||
- data[position + 6] != 0x1A || data[position + 7] != 0x0A)
- error('JBIG2 error: invalid header');
- var header = {};
- position += 8;
- var flags = data[position++];
- header.randomAccess = !(flags & 1);
- if (!(flags & 2)) {
- header.numberOfPages = readUint32(data, position);
- position += 4;
- }
- var segments = readSegments(header, data, position, end);
- error('Not implemented');
- // processSegments(segments, new SimpleSegmentVisitor());
- }
-
- function parseJbig2Chunks(chunks) {
- var visitor = new SimpleSegmentVisitor();
- for (var i = 0, ii = chunks.length; i < ii; i++) {
- var chunk = chunks[i];
- var segments = readSegments({}, chunk.data, chunk.start, chunk.end);
- processSegments(segments, visitor);
- }
- return visitor.buffer;
- }
-
- function SimpleSegmentVisitor() {}
-
- SimpleSegmentVisitor.prototype = {
- onPageInformation: function SimpleSegmentVisitor_onPageInformation(info) {
- this.currentPageInfo = info;
- var rowSize = (info.width + 7) >> 3;
- var buffer = new Uint8Array(rowSize * info.height);
- var fill = info.defaultPixelValue ? 0xFF : 0;
- for (var i = 0, ii = buffer.length; i < ii; i++)
- buffer[i] = fill;
- this.buffer = buffer;
- },
- drawBitmap: function SimpleSegmentVisitor_drawBitmap(regionInfo, bitmap) {
- var pageInfo = this.currentPageInfo;
- var width = regionInfo.width, height = regionInfo.height;
- var rowSize = (pageInfo.width + 7) >> 3;
- var combinationOperator = pageInfo.combinationOperatorOverride ?
- regionInfo.combinationOperator : pageInfo.combinationOperator;
- var buffer = this.buffer;
- for (var i = 0; i < height; i++) {
- var mask = 128 >> (regionInfo.x & 7);
- var offset = (i + regionInfo.y) * rowSize + (regionInfo.x >> 3);
- switch (combinationOperator) {
- case 0: // OR
- for (var j = 0; j < width; j++) {
- buffer[offset] |= bitmap[i][j] ? mask : 0;
- mask >>= 1;
- if (!mask) {
- mask = 128;
- offset++;
- }
- }
- break;
- case 2: // XOR
- for (var j = 0; j < width; j++) {
- buffer[offset] ^= bitmap[i][j] ? mask : 0;
- mask >>= 1;
- if (!mask) {
- mask = 128;
- offset++;
- }
- }
- break;
- default:
- error('JBIG2 error: operator ' + combinationOperator +
- ' is not supported');
- }
- }
- },
- onImmediateGenericRegion:
- function SimpleSegmentVisitor_onImmediateGenericRegion(region, data,
- start, end) {
- var regionInfo = region.info;
- var decodingContext = new DecodingContext(data, start, end);
- var bitmap = decodeBitmap(region.mmr, regionInfo.width, regionInfo.height,
- region.template, region.prediction, null,
- region.at, decodingContext);
- this.drawBitmap(regionInfo, bitmap);
- },
- onImmediateLosslessGenericRegion:
- function SimpleSegmentVisitor_onImmediateLosslessGenericRegion() {
- this.onImmediateGenericRegion.apply(this, arguments);
- },
- onSymbolDictionary:
- function SimpleSegmentVisitor_onSymbolDictionary(dictionary,
- currentSegment,
- referredSegments,
- data, start, end) {
- var huffmanTables;
- if (dictionary.huffman)
- error('JBIG2 error: huffman is not supported');
-
- // Combines exported symbols from all referred segments
- var symbols = this.symbols;
- if (!symbols)
- this.symbols = symbols = {};
-
- var inputSymbols = [];
- for (var i = 0, ii = referredSegments.length; i < ii; i++)
- inputSymbols = inputSymbols.concat(symbols[referredSegments[i]]);
-
- var decodingContext = new DecodingContext(data, start, end);
- symbols[currentSegment] = decodeSymbolDictionary(dictionary.huffman,
- dictionary.refinement, inputSymbols, dictionary.numberOfNewSymbols,
- dictionary.numberOfExportedSymbols, huffmanTables,
- dictionary.template, dictionary.at,
- dictionary.refinementTemplate, dictionary.refinementAt,
- decodingContext);
- },
- onImmediateTextRegion:
- function SimpleSegmentVisitor_onImmediateTextRegion(region,
- referredSegments,
- data, start, end) {
- var regionInfo = region.info;
- var huffmanTables;
-
- // Combines exported symbols from all referred segments
- var symbols = this.symbols;
- var inputSymbols = [];
- for (var i = 0, ii = referredSegments.length; i < ii; i++)
- inputSymbols = inputSymbols.concat(symbols[referredSegments[i]]);
- var symbolCodeLength = log2(inputSymbols.length);
-
- var decodingContext = new DecodingContext(data, start, end);
- var bitmap = decodeTextRegion(region.huffman, region.refinement,
- regionInfo.width, regionInfo.height, region.defaultPixelValue,
- region.numberOfSymbolInstances, region.stripSize, inputSymbols,
- symbolCodeLength, region.transposed, region.dsOffset,
- region.referenceCorner, region.combinationOperator, huffmanTables,
- region.refinementTemplate, region.refinementAt, decodingContext);
- this.drawBitmap(regionInfo, bitmap);
- },
- onImmediateLosslessTextRegion:
- function SimpleSegmentVisitor_onImmediateLosslessTextRegion() {
- this.onImmediateTextRegion.apply(this, arguments);
- }
- };
-
- function Jbig2Image() {}
-
- Jbig2Image.prototype = {
- parseChunks: function Jbig2Image_parseChunks(chunks) {
- return parseJbig2Chunks(chunks);
- }
- };
-
- return Jbig2Image;
-})();
-
-
-var bidi = PDFJS.bidi = (function bidiClosure() {
- // Character types for symbols from 0000 to 00FF.
- var baseTypes = [
- 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'S', 'B', 'S', 'WS',
- 'B', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',
- 'BN', 'BN', 'B', 'B', 'B', 'S', 'WS', 'ON', 'ON', 'ET', 'ET', 'ET', 'ON',
- 'ON', 'ON', 'ON', 'ON', 'ON', 'CS', 'ON', 'CS', 'ON', 'EN', 'EN', 'EN',
- 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'ON', 'ON', 'ON', 'ON', 'ON',
- 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
- 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON',
- 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
- 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
- 'L', 'ON', 'ON', 'ON', 'ON', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'B', 'BN',
- 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',
- 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',
- 'BN', 'CS', 'ON', 'ET', 'ET', 'ET', 'ET', 'ON', 'ON', 'ON', 'ON', 'L', 'ON',
- 'ON', 'ON', 'ON', 'ON', 'ET', 'ET', 'EN', 'EN', 'ON', 'L', 'ON', 'ON', 'ON',
- 'EN', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
- 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
- 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
- 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
- 'L', 'L', 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L'
- ];
-
- // Character types for symbols from 0600 to 06FF
- var arabicTypes = [
- 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
- 'CS', 'AL', 'ON', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL',
- 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
- 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
- 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
- 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
- 'AL', 'AL', 'AL', 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM',
- 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL',
- 'AL', 'AL', 'AL', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN',
- 'AN', 'ET', 'AN', 'AN', 'AL', 'AL', 'AL', 'NSM', 'AL', 'AL', 'AL', 'AL',
- 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
- 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
- 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
- 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
- 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
- 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
- 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
- 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
- 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM',
- 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'ON', 'NSM',
- 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
- 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL'
- ];
-
- function isOdd(i) {
- return (i & 1) != 0;
- }
-
- function isEven(i) {
- return (i & 1) == 0;
- }
-
- function findUnequal(arr, start, value) {
- var j;
- for (var j = start, jj = arr.length; j < jj; ++j) {
- if (arr[j] != value)
- return j;
- }
- return j;
- }
-
- function setValues(arr, start, end, value) {
- for (var j = start; j < end; ++j) {
- arr[j] = value;
- }
- }
-
- function reverseValues(arr, start, end) {
- for (var i = start, j = end - 1; i < j; ++i, --j) {
- var temp = arr[i];
- arr[i] = arr[j];
- arr[j] = temp;
- }
- }
-
- function mirrorGlyphs(c) {
- /*
- # BidiMirroring-1.txt
- 0028; 0029 # LEFT PARENTHESIS
- 0029; 0028 # RIGHT PARENTHESIS
- 003C; 003E # LESS-THAN SIGN
- 003E; 003C # GREATER-THAN SIGN
- 005B; 005D # LEFT SQUARE BRACKET
- 005D; 005B # RIGHT SQUARE BRACKET
- 007B; 007D # LEFT CURLY BRACKET
- 007D; 007B # RIGHT CURLY BRACKET
- 00AB; 00BB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
- 00BB; 00AB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
- */
- switch (c) {
- case '(':
- return ')';
- case ')':
- return '(';
- case '<':
- return '>';
- case '>':
- return '<';
- case ']':
- return '[';
- case '[':
- return ']';
- case '}':
- return '{';
- case '{':
- return '}';
- case '\u00AB':
- return '\u00BB';
- case '\u00BB':
- return '\u00AB';
- default:
- return c;
- }
- }
-
- function BidiResult(str, isLTR) {
- this.str = str;
- this.ltr = isLTR;
- }
-
- function bidi(str, startLevel) {
- var isLTR = true;
- var strLength = str.length;
- if (strLength == 0)
- return new BidiResult(str, ltr);
-
- // get types, fill arrays
-
- var chars = [];
- var types = [];
- var oldtypes = [];
- var numBidi = 0;
-
- for (var i = 0; i < strLength; ++i) {
- chars[i] = str.charAt(i);
-
- var charCode = str.charCodeAt(i);
- var charType = 'L';
- if (charCode <= 0x00ff)
- charType = baseTypes[charCode];
- else if (0x0590 <= charCode && charCode <= 0x05f4)
- charType = 'R';
- else if (0x0600 <= charCode && charCode <= 0x06ff)
- charType = arabicTypes[charCode & 0xff];
- else if (0x0700 <= charCode && charCode <= 0x08AC)
- charType = 'AL';
-
- if (charType == 'R' || charType == 'AL' || charType == 'AN')
- numBidi++;
-
- oldtypes[i] = types[i] = charType;
- }
-
- // detect the bidi method
- // if there are no rtl characters then no bidi needed
- // if less than 30% chars are rtl then string is primarily ltr
- // if more than 30% chars are rtl then string is primarily rtl
- if (numBidi == 0) {
- isLTR = true;
- return new BidiResult(str, isLTR);
- }
-
- if (startLevel == -1) {
- if ((strLength / numBidi) < 0.3) {
- isLTR = true;
- startLevel = 0;
- } else {
- isLTR = false;
- startLevel = 1;
- }
- }
-
- var levels = [];
-
- for (var i = 0; i < strLength; ++i) {
- levels[i] = startLevel;
- }
-
- /*
- X1-X10: skip most of this, since we are NOT doing the embeddings.
- */
-
- var e = isOdd(startLevel) ? 'R' : 'L';
- var sor = e;
- var eor = sor;
-
- /*
- W1. Examine each non-spacing mark (NSM) in the level run, and change the
- type of the NSM to the type of the previous character. If the NSM is at the
- start of the level run, it will get the type of sor.
- */
-
- var lastType = sor;
- for (var i = 0; i < strLength; ++i) {
- if (types[i] == 'NSM')
- types[i] = lastType;
- else
- lastType = types[i];
- }
-
- /*
- W2. Search backwards from each instance of a European number until the
- first strong type (R, L, AL, or sor) is found. If an AL is found, change
- the type of the European number to Arabic number.
- */
-
- var lastType = sor;
- for (var i = 0; i < strLength; ++i) {
- var t = types[i];
- if (t == 'EN')
- types[i] = (lastType == 'AL') ? 'AN' : 'EN';
- else if (t == 'R' || t == 'L' || t == 'AL')
- lastType = t;
- }
-
- /*
- W3. Change all ALs to R.
- */
-
- for (var i = 0; i < strLength; ++i) {
- var t = types[i];
- if (t == 'AL')
- types[i] = 'R';
- }
-
- /*
- W4. A single European separator between two European numbers changes to a
- European number. A single common separator between two numbers of the same
- type changes to that type:
- */
-
- for (var i = 1; i < strLength - 1; ++i) {
- if (types[i] == 'ES' && types[i - 1] == 'EN' && types[i + 1] == 'EN')
- types[i] = 'EN';
- if (types[i] == 'CS' && (types[i - 1] == 'EN' || types[i - 1] == 'AN') &&
- types[i + 1] == types[i - 1])
- types[i] = types[i - 1];
- }
-
- /*
- W5. A sequence of European terminators adjacent to European numbers changes
- to all European numbers:
- */
-
- for (var i = 0; i < strLength; ++i) {
- if (types[i] == 'EN') {
- // do before
- for (var j = i - 1; j >= 0; --j) {
- if (types[j] != 'ET')
- break;
- types[j] = 'EN';
- }
- // do after
- for (var j = i + 1; j < strLength; --j) {
- if (types[j] != 'ET')
- break;
- types[j] = 'EN';
- }
- }
- }
-
- /*
- W6. Otherwise, separators and terminators change to Other Neutral:
- */
-
- for (var i = 0; i < strLength; ++i) {
- var t = types[i];
- if (t == 'WS' || t == 'ES' || t == 'ET' || t == 'CS')
- types[i] = 'ON';
- }
-
- /*
- W7. Search backwards from each instance of a European number until the
- first strong type (R, L, or sor) is found. If an L is found, then change
- the type of the European number to L.
- */
-
- var lastType = sor;
- for (var i = 0; i < strLength; ++i) {
- var t = types[i];
- if (t == 'EN')
- types[i] = (lastType == 'L') ? 'L' : 'EN';
- else if (t == 'R' || t == 'L')
- lastType = t;
- }
-
- /*
- N1. A sequence of neutrals takes the direction of the surrounding strong
- text if the text on both sides has the same direction. European and Arabic
- numbers are treated as though they were R. Start-of-level-run (sor) and
- end-of-level-run (eor) are used at level run boundaries.
- */
-
- for (var i = 0; i < strLength; ++i) {
- if (types[i] == 'ON') {
- var end = findUnequal(types, i + 1, 'ON');
- var before = sor;
- if (i > 0)
- before = types[i - 1];
- var after = eor;
- if (end + 1 < strLength)
- after = types[end + 1];
- if (before != 'L')
- before = 'R';
- if (after != 'L')
- after = 'R';
- if (before == after)
- setValues(types, i, end, before);
- i = end - 1; // reset to end (-1 so next iteration is ok)
- }
- }
-
- /*
- N2. Any remaining neutrals take the embedding direction.
- */
-
- for (var i = 0; i < strLength; ++i) {
- if (types[i] == 'ON')
- types[i] = e;
- }
-
- /*
- I1. For all characters with an even (left-to-right) embedding direction,
- those of type R go up one level and those of type AN or EN go up two
- levels.
- I2. For all characters with an odd (right-to-left) embedding direction,
- those of type L, EN or AN go up one level.
- */
-
- for (var i = 0; i < strLength; ++i) {
- var t = types[i];
- if (isEven(levels[i])) {
- if (t == 'R') {
- levels[i] += 1;
- } else if (t == 'AN' || t == 'EN') {
- levels[i] += 2;
- }
- } else { // isOdd, so
- if (t == 'L' || t == 'AN' || t == 'EN') {
- levels[i] += 1;
- }
- }
- }
-
- /*
- L1. On each line, reset the embedding level of the following characters to
- the paragraph embedding level:
-
- segment separators,
- paragraph separators,
- any sequence of whitespace characters preceding a segment separator or
- paragraph separator, and any sequence of white space characters at the end
- of the line.
- */
-
- // don't bother as text is only single line
-
- /*
- L2. From the highest level found in the text to the lowest odd level on
- each line, reverse any contiguous sequence of characters that are at that
- level or higher.
- */
-
- // find highest level & lowest odd level
-
- var highestLevel = -1;
- var lowestOddLevel = 99;
- for (var i = 0, ii = levels.length; i < ii; ++i) {
- var level = levels[i];
- if (highestLevel < level)
- highestLevel = level;
- if (lowestOddLevel > level && isOdd(level))
- lowestOddLevel = level;
- }
-
- // now reverse between those limits
-
- for (var level = highestLevel; level >= lowestOddLevel; --level) {
- // find segments to reverse
- var start = -1;
- for (var i = 0, ii = levels.length; i < ii; ++i) {
- if (levels[i] < level) {
- if (start >= 0) {
- reverseValues(chars, start, i);
- start = -1;
- }
- } else if (start < 0) {
- start = i;
- }
- }
- if (start >= 0) {
- reverseValues(chars, start, levels.length);
- }
- }
-
- /*
- L3. Combining marks applied to a right-to-left base character will at this
- point precede their base character. If the rendering engine expects them to
- follow the base characters in the final display process, then the ordering
- of the marks and the base character must be reversed.
- */
-
- // don't bother for now
-
- /*
- L4. A character that possesses the mirrored property as specified by
- Section 4.7, Mirrored, must be depicted by a mirrored glyph if the resolved
- directionality of that character is R.
- */
-
- // don't mirror as characters are already mirrored in the pdf
-
- // Finally, return string
-
- var result = '';
- for (var i = 0, ii = chars.length; i < ii; ++i) {
- var ch = chars[i];
- if (ch != '<' && ch != '>')
- result += ch;
- }
-
- return new BidiResult(result, isLTR);
- }
-
- return bidi;
-})();
-
-
-
-var Metadata = PDFJS.Metadata = (function MetadataClosure() {
- function fixMetadata(meta) {
- return meta.replace(/>\\376\\377([^<]+)/g, function(all, codes) {
- var bytes = codes.replace(/\\([0-3])([0-7])([0-7])/g,
- function(code, d1, d2, d3) {
- return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1);
- });
- var chars = '';
- for (var i = 0; i < bytes.length; i += 2) {
- var code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1);
- chars += code >= 32 && code < 127 && code != 60 && code != 62 &&
- code != 38 && false ? String.fromCharCode(code) :
- '&#x' + (0x10000 + code).toString(16).substring(1) + ';';
- }
- return '>' + chars;
- });
- }
-
- function Metadata(meta) {
- if (typeof meta === 'string') {
- // Ghostscript produces invalid metadata
- meta = fixMetadata(meta);
-
- var parser = new DOMParser();
- meta = parser.parseFromString(meta, 'application/xml');
- } else if (!(meta instanceof Document)) {
- error('Metadata: Invalid metadata object');
- }
-
- this.metaDocument = meta;
- this.metadata = {};
- this.parse();
- }
-
- Metadata.prototype = {
- parse: function Metadata_parse() {
- var doc = this.metaDocument;
- var rdf = doc.documentElement;
-
- if (rdf.nodeName.toLowerCase() !== 'rdf:rdf') { // Wrapped in <xmpmeta>
- rdf = rdf.firstChild;
- while (rdf && rdf.nodeName.toLowerCase() !== 'rdf:rdf')
- rdf = rdf.nextSibling;
- }
-
- var nodeName = (rdf) ? rdf.nodeName.toLowerCase() : null;
- if (!rdf || nodeName !== 'rdf:rdf' || !rdf.hasChildNodes())
- return;
-
- var children = rdf.childNodes, desc, entry, name, i, ii, length, iLength;
-
- for (i = 0, length = children.length; i < length; i++) {
- desc = children[i];
- if (desc.nodeName.toLowerCase() !== 'rdf:description')
- continue;
-
- for (ii = 0, iLength = desc.childNodes.length; ii < iLength; ii++) {
- if (desc.childNodes[ii].nodeName.toLowerCase() !== '#text') {
- entry = desc.childNodes[ii];
- name = entry.nodeName.toLowerCase();
- this.metadata[name] = entry.textContent.trim();
- }
- }
- }
- },
-
- get: function Metadata_get(name) {
- return this.metadata[name] || null;
- },
-
- has: function Metadata_has(name) {
- return typeof this.metadata[name] !== 'undefined';
- }
- };
-
- return Metadata;
-})();
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- /
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-/*
- Copyright 2011 notmasteryet
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-// - The JPEG specification can be found in the ITU CCITT Recommendation T.81
-// (www.w3.org/Graphics/JPEG/itu-t81.pdf)
-// - The JFIF specification can be found in the JPEG File Interchange Format
-// (www.w3.org/Graphics/JPEG/jfif3.pdf)
-// - The Adobe Application-Specific JPEG markers in the Supporting the DCT Filters
-// in PostScript Level 2, Technical Note #5116
-// (partners.adobe.com/public/developer/en/ps/sdk/5116.DCT_Filter.pdf)
-
-var JpegImage = (function jpegImage() {
- "use strict";
- var dctZigZag = new Int32Array([
- 0,
- 1, 8,
- 16, 9, 2,
- 3, 10, 17, 24,
- 32, 25, 18, 11, 4,
- 5, 12, 19, 26, 33, 40,
- 48, 41, 34, 27, 20, 13, 6,
- 7, 14, 21, 28, 35, 42, 49, 56,
- 57, 50, 43, 36, 29, 22, 15,
- 23, 30, 37, 44, 51, 58,
- 59, 52, 45, 38, 31,
- 39, 46, 53, 60,
- 61, 54, 47,
- 55, 62,
- 63
- ]);
-
- var dctCos1 = 4017 // cos(pi/16)
- var dctSin1 = 799 // sin(pi/16)
- var dctCos3 = 3406 // cos(3*pi/16)
- var dctSin3 = 2276 // sin(3*pi/16)
- var dctCos6 = 1567 // cos(6*pi/16)
- var dctSin6 = 3784 // sin(6*pi/16)
- var dctSqrt2 = 5793 // sqrt(2)
- var dctSqrt1d2 = 2896 // sqrt(2) / 2
-
- function constructor() {
- }
-
- function buildHuffmanTable(codeLengths, values) {
- var k = 0, code = [], i, j, length = 16;
- while (length > 0 && !codeLengths[length - 1])
- length--;
- code.push({children: [], index: 0});
- var p = code[0], q;
- for (i = 0; i < length; i++) {
- for (j = 0; j < codeLengths[i]; j++) {
- p = code.pop();
- p.children[p.index] = values[k];
- while (p.index > 0) {
- p = code.pop();
- }
- p.index++;
- code.push(p);
- while (code.length <= i) {
- code.push(q = {children: [], index: 0});
- p.children[p.index] = q.children;
- p = q;
- }
- k++;
- }
- if (i + 1 < length) {
- // p here points to last code
- code.push(q = {children: [], index: 0});
- p.children[p.index] = q.children;
- p = q;
- }
- }
- return code[0].children;
- }
-
- function decodeScan(data, offset,
- frame, components, resetInterval,
- spectralStart, spectralEnd,
- successivePrev, successive) {
- var precision = frame.precision;
- var samplesPerLine = frame.samplesPerLine;
- var scanLines = frame.scanLines;
- var mcusPerLine = frame.mcusPerLine;
- var progressive = frame.progressive;
- var maxH = frame.maxH, maxV = frame.maxV;
-
- var startOffset = offset, bitsData = 0, bitsCount = 0;
- function readBit() {
- if (bitsCount > 0) {
- bitsCount--;
- return (bitsData >> bitsCount) & 1;
- }
- bitsData = data[offset++];
- if (bitsData == 0xFF) {
- var nextByte = data[offset++];
- if (nextByte) {
- throw "unexpected marker: " + ((bitsData << 8) | nextByte).toString(16);
- }
- // unstuff 0
- }
- bitsCount = 7;
- return bitsData >>> 7;
- }
- function decodeHuffman(tree) {
- var node = tree, bit;
- while ((bit = readBit()) !== null) {
- node = node[bit];
- if (typeof node === 'number')
- return node;
- if (typeof node !== 'object')
- throw "invalid huffman sequence";
- }
- return null;
- }
- function receive(length) {
- var n = 0;
- while (length > 0) {
- var bit = readBit();
- if (bit === null) return;
- n = (n << 1) | bit;
- length--;
- }
- return n;
- }
- function receiveAndExtend(length) {
- var n = receive(length);
- if (n >= 1 << (length - 1))
- return n;
- return n + (-1 << length) + 1;
- }
- function decodeBaseline(component, zz) {
- var t = decodeHuffman(component.huffmanTableDC);
- var diff = t === 0 ? 0 : receiveAndExtend(t);
- zz[0]= (component.pred += diff);
- var k = 1;
- while (k < 64) {
- var rs = decodeHuffman(component.huffmanTableAC);
- var s = rs & 15, r = rs >> 4;
- if (s === 0) {
- if (r < 15)
- break;
- k += 16;
- continue;
- }
- k += r;
- var z = dctZigZag[k];
- zz[z] = receiveAndExtend(s);
- k++;
- }
- }
- function decodeDCFirst(component, zz) {
- var t = decodeHuffman(component.huffmanTableDC);
- var diff = t === 0 ? 0 : (receiveAndExtend(t) << successive);
- zz[0] = (component.pred += diff);
- }
- function decodeDCSuccessive(component, zz) {
- zz[0] |= readBit() << successive;
- }
- var eobrun = 0;
- function decodeACFirst(component, zz) {
- if (eobrun > 0) {
- eobrun--;
- return;
- }
- var k = spectralStart, e = spectralEnd;
- while (k <= e) {
- var rs = decodeHuffman(component.huffmanTableAC);
- var s = rs & 15, r = rs >> 4;
- if (s === 0) {
- if (r < 15) {
- eobrun = receive(r) + (1 << r) - 1;
- break;
- }
- k += 16;
- continue;
- }
- k += r;
- var z = dctZigZag[k];
- zz[z] = receiveAndExtend(s) * (1 << successive);
- k++;
- }
- }
- var successiveACState = 0, successiveACNextValue;
- function decodeACSuccessive(component, zz) {
- var k = spectralStart, e = spectralEnd, r = 0;
- while (k <= e) {
- var z = dctZigZag[k];
- switch (successiveACState) {
- case 0: // initial state
- var rs = decodeHuffman(component.huffmanTableAC);
- var s = rs & 15, r = rs >> 4;
- if (s === 0) {
- if (r < 15) {
- eobrun = receive(r) + (1 << r);
- successiveACState = 4;
- } else {
- r = 16;
- successiveACState = 1;
- }
- } else {
- if (s !== 1)
- throw "invalid ACn encoding";
- successiveACNextValue = receiveAndExtend(s);
- successiveACState = r ? 2 : 3;
- }
- continue;
- case 1: // skipping r zero items
- case 2:
- if (zz[z])
- zz[z] += (readBit() << successive);
- else {
- r--;
- if (r === 0)
- successiveACState = successiveACState == 2 ? 3 : 0;
- }
- break;
- case 3: // set value for a zero item
- if (zz[z])
- zz[z] += (readBit() << successive);
- else {
- zz[z] = successiveACNextValue << successive;
- successiveACState = 0;
- }
- break;
- case 4: // eob
- if (zz[z])
- zz[z] += (readBit() << successive);
- break;
- }
- k++;
- }
- if (successiveACState === 4) {
- eobrun--;
- if (eobrun === 0)
- successiveACState = 0;
- }
- }
- function decodeMcu(component, decode, mcu, row, col) {
- var mcuRow = (mcu / mcusPerLine) | 0;
- var mcuCol = mcu % mcusPerLine;
- var blockRow = mcuRow * component.v + row;
- var blockCol = mcuCol * component.h + col;
- decode(component, component.blocks[blockRow][blockCol]);
- }
- function decodeBlock(component, decode, mcu) {
- var blockRow = (mcu / component.blocksPerLine) | 0;
- var blockCol = mcu % component.blocksPerLine;
- decode(component, component.blocks[blockRow][blockCol]);
- }
-
- var componentsLength = components.length;
- var component, i, j, k, n;
- var decodeFn;
- if (progressive) {
- if (spectralStart === 0)
- decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;
- else
- decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;
- } else {
- decodeFn = decodeBaseline;
- }
-
- var mcu = 0, marker;
- var mcuExpected;
- if (componentsLength == 1) {
- mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn;
- } else {
- mcuExpected = mcusPerLine * frame.mcusPerColumn;
- }
- if (!resetInterval) resetInterval = mcuExpected;
-
- var h, v;
- while (mcu < mcuExpected) {
- // reset interval stuff
- for (i = 0; i < componentsLength; i++)
- components[i].pred = 0;
- eobrun = 0;
-
- if (componentsLength == 1) {
- component = components[0];
- for (n = 0; n < resetInterval; n++) {
- decodeBlock(component, decodeFn, mcu);
- mcu++;
- }
- } else {
- for (n = 0; n < resetInterval; n++) {
- for (i = 0; i < componentsLength; i++) {
- component = components[i];
- h = component.h;
- v = component.v;
- for (j = 0; j < v; j++) {
- for (k = 0; k < h; k++) {
- decodeMcu(component, decodeFn, mcu, j, k);
- }
- }
- }
- mcu++;
- }
- }
-
- // find marker
- bitsCount = 0;
- marker = (data[offset] << 8) | data[offset + 1];
- if (marker <= 0xFF00) {
- throw "marker was not found";
- }
-
- if (marker >= 0xFFD0 && marker <= 0xFFD7) { // RSTx
- offset += 2;
- }
- else
- break;
- }
-
- return offset - startOffset;
- }
-
- function buildComponentData(frame, component) {
- var lines = [];
- var blocksPerLine = component.blocksPerLine;
- var blocksPerColumn = component.blocksPerColumn;
- var samplesPerLine = blocksPerLine << 3;
- var R = new Int32Array(64), r = new Uint8Array(64);
-
- // A port of poppler's IDCT method which in turn is taken from:
- // Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz,
- // "Practical Fast 1-D DCT Algorithms with 11 Multiplications",
- // IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989,
- // 988-991.
- function quantizeAndInverse(zz, dataOut, dataIn) {
- var qt = component.quantizationTable;
- var v0, v1, v2, v3, v4, v5, v6, v7, t;
- var p = dataIn;
- var i;
-
- // dequant
- for (i = 0; i < 64; i++)
- p[i] = zz[i] * qt[i];
-
- // inverse DCT on rows
- for (i = 0; i < 8; ++i) {
- var row = 8 * i;
-
- // check for all-zero AC coefficients
- if (p[1 + row] == 0 && p[2 + row] == 0 && p[3 + row] == 0 &&
- p[4 + row] == 0 && p[5 + row] == 0 && p[6 + row] == 0 &&
- p[7 + row] == 0) {
- t = (dctSqrt2 * p[0 + row] + 512) >> 10;
- p[0 + row] = t;
- p[1 + row] = t;
- p[2 + row] = t;
- p[3 + row] = t;
- p[4 + row] = t;
- p[5 + row] = t;
- p[6 + row] = t;
- p[7 + row] = t;
- continue;
- }
-
- // stage 4
- v0 = (dctSqrt2 * p[0 + row] + 128) >> 8;
- v1 = (dctSqrt2 * p[4 + row] + 128) >> 8;
- v2 = p[2 + row];
- v3 = p[6 + row];
- v4 = (dctSqrt1d2 * (p[1 + row] - p[7 + row]) + 128) >> 8;
- v7 = (dctSqrt1d2 * (p[1 + row] + p[7 + row]) + 128) >> 8;
- v5 = p[3 + row] << 4;
- v6 = p[5 + row] << 4;
-
- // stage 3
- t = (v0 - v1+ 1) >> 1;
- v0 = (v0 + v1 + 1) >> 1;
- v1 = t;
- t = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8;
- v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8;
- v3 = t;
- t = (v4 - v6 + 1) >> 1;
- v4 = (v4 + v6 + 1) >> 1;
- v6 = t;
- t = (v7 + v5 + 1) >> 1;
- v5 = (v7 - v5 + 1) >> 1;
- v7 = t;
-
- // stage 2
- t = (v0 - v3 + 1) >> 1;
- v0 = (v0 + v3 + 1) >> 1;
- v3 = t;
- t = (v1 - v2 + 1) >> 1;
- v1 = (v1 + v2 + 1) >> 1;
- v2 = t;
- t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;
- v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;
- v7 = t;
- t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;
- v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;
- v6 = t;
-
- // stage 1
- p[0 + row] = v0 + v7;
- p[7 + row] = v0 - v7;
- p[1 + row] = v1 + v6;
- p[6 + row] = v1 - v6;
- p[2 + row] = v2 + v5;
- p[5 + row] = v2 - v5;
- p[3 + row] = v3 + v4;
- p[4 + row] = v3 - v4;
- }
-
- // inverse DCT on columns
- for (i = 0; i < 8; ++i) {
- var col = i;
-
- // check for all-zero AC coefficients
- if (p[1*8 + col] == 0 && p[2*8 + col] == 0 && p[3*8 + col] == 0 &&
- p[4*8 + col] == 0 && p[5*8 + col] == 0 && p[6*8 + col] == 0 &&
- p[7*8 + col] == 0) {
- t = (dctSqrt2 * dataIn[i+0] + 8192) >> 14;
- p[0*8 + col] = t;
- p[1*8 + col] = t;
- p[2*8 + col] = t;
- p[3*8 + col] = t;
- p[4*8 + col] = t;
- p[5*8 + col] = t;
- p[6*8 + col] = t;
- p[7*8 + col] = t;
- continue;
- }
-
- // stage 4
- v0 = (dctSqrt2 * p[0*8 + col] + 2048) >> 12;
- v1 = (dctSqrt2 * p[4*8 + col] + 2048) >> 12;
- v2 = p[2*8 + col];
- v3 = p[6*8 + col];
- v4 = (dctSqrt1d2 * (p[1*8 + col] - p[7*8 + col]) + 2048) >> 12;
- v7 = (dctSqrt1d2 * (p[1*8 + col] + p[7*8 + col]) + 2048) >> 12;
- v5 = p[3*8 + col];
- v6 = p[5*8 + col];
-
- // stage 3
- t = (v0 - v1 + 1) >> 1;
- v0 = (v0 + v1 + 1) >> 1;
- v1 = t;
- t = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12;
- v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12;
- v3 = t;
- t = (v4 - v6 + 1) >> 1;
- v4 = (v4 + v6 + 1) >> 1;
- v6 = t;
- t = (v7 + v5 + 1) >> 1;
- v5 = (v7 - v5 + 1) >> 1;
- v7 = t;
-
- // stage 2
- t = (v0 - v3 + 1) >> 1;
- v0 = (v0 + v3 + 1) >> 1;
- v3 = t;
- t = (v1 - v2 + 1) >> 1;
- v1 = (v1 + v2 + 1) >> 1;
- v2 = t;
- t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;
- v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;
- v7 = t;
- t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;
- v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;
- v6 = t;
-
- // stage 1
- p[0*8 + col] = v0 + v7;
- p[7*8 + col] = v0 - v7;
- p[1*8 + col] = v1 + v6;
- p[6*8 + col] = v1 - v6;
- p[2*8 + col] = v2 + v5;
- p[5*8 + col] = v2 - v5;
- p[3*8 + col] = v3 + v4;
- p[4*8 + col] = v3 - v4;
- }
-
- // convert to 8-bit integers
- for (i = 0; i < 64; ++i) {
- var sample = 128 + ((p[i] + 8) >> 4);
- dataOut[i] = sample < 0 ? 0 : sample > 0xFF ? 0xFF : sample;
- }
- }
-
- var i, j;
- for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {
- var scanLine = blockRow << 3;
- for (i = 0; i < 8; i++)
- lines.push(new Uint8Array(samplesPerLine));
- for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {
- quantizeAndInverse(component.blocks[blockRow][blockCol], r, R);
-
- var offset = 0, sample = blockCol << 3;
- for (j = 0; j < 8; j++) {
- var line = lines[scanLine + j];
- for (i = 0; i < 8; i++)
- line[sample + i] = r[offset++];
- }
- }
- }
- return lines;
- }
-
- function clampTo8bit(a) {
- return a < 0 ? 0 : a > 255 ? 255 : a;
- }
-
- constructor.prototype = {
- load: function load(path) {
- var xhr = new XMLHttpRequest();
- xhr.open("GET", path, true);
- xhr.responseType = "arraybuffer";
- xhr.onload = (function() {
- // TODO catch parse error
- var data = new Uint8Array(xhr.response || xhr.mozResponseArrayBuffer);
- this.parse(data);
- if (this.onload)
- this.onload();
- }).bind(this);
- xhr.send(null);
- },
- parse: function parse(data) {
- var offset = 0, length = data.length;
- function readUint16() {
- var value = (data[offset] << 8) | data[offset + 1];
- offset += 2;
- return value;
- }
- function readDataBlock() {
- var length = readUint16();
- var array = data.subarray(offset, offset + length - 2);
- offset += array.length;
- return array;
- }
- function prepareComponents(frame) {
- var maxH = 0, maxV = 0;
- var component, componentId;
- for (componentId in frame.components) {
- if (frame.components.hasOwnProperty(componentId)) {
- component = frame.components[componentId];
- if (maxH < component.h) maxH = component.h;
- if (maxV < component.v) maxV = component.v;
- }
- }
- var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / maxH);
- var mcusPerColumn = Math.ceil(frame.scanLines / 8 / maxV);
- for (componentId in frame.components) {
- if (frame.components.hasOwnProperty(componentId)) {
- component = frame.components[componentId];
- var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / maxH);
- var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / maxV);
- var blocksPerLineForMcu = mcusPerLine * component.h;
- var blocksPerColumnForMcu = mcusPerColumn * component.v;
- var blocks = [];
- for (var i = 0; i < blocksPerColumnForMcu; i++) {
- var row = [];
- for (var j = 0; j < blocksPerLineForMcu; j++)
- row.push(new Int32Array(64));
- blocks.push(row);
- }
- component.blocksPerLine = blocksPerLine;
- component.blocksPerColumn = blocksPerColumn;
- component.blocks = blocks;
- }
- }
- frame.maxH = maxH;
- frame.maxV = maxV;
- frame.mcusPerLine = mcusPerLine;
- frame.mcusPerColumn = mcusPerColumn;
- }
- var jfif = null;
- var adobe = null;
- var pixels = null;
- var frame, resetInterval;
- var quantizationTables = [], frames = [];
- var huffmanTablesAC = [], huffmanTablesDC = [];
- var fileMarker = readUint16();
- if (fileMarker != 0xFFD8) { // SOI (Start of Image)
- throw "SOI not found";
- }
-
- fileMarker = readUint16();
- while (fileMarker != 0xFFD9) { // EOI (End of image)
- var i, j, l;
- switch(fileMarker) {
- case 0xFFE0: // APP0 (Application Specific)
- case 0xFFE1: // APP1
- case 0xFFE2: // APP2
- case 0xFFE3: // APP3
- case 0xFFE4: // APP4
- case 0xFFE5: // APP5
- case 0xFFE6: // APP6
- case 0xFFE7: // APP7
- case 0xFFE8: // APP8
- case 0xFFE9: // APP9
- case 0xFFEA: // APP10
- case 0xFFEB: // APP11
- case 0xFFEC: // APP12
- case 0xFFED: // APP13
- case 0xFFEE: // APP14
- case 0xFFEF: // APP15
- case 0xFFFE: // COM (Comment)
- var appData = readDataBlock();
-
- if (fileMarker === 0xFFE0) {
- if (appData[0] === 0x4A && appData[1] === 0x46 && appData[2] === 0x49 &&
- appData[3] === 0x46 && appData[4] === 0) { // 'JFIF\x00'
- jfif = {
- version: { major: appData[5], minor: appData[6] },
- densityUnits: appData[7],
- xDensity: (appData[8] << 8) | appData[9],
- yDensity: (appData[10] << 8) | appData[11],
- thumbWidth: appData[12],
- thumbHeight: appData[13],
- thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13])
- };
- }
- }
- // TODO APP1 - Exif
- if (fileMarker === 0xFFEE) {
- if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6F &&
- appData[3] === 0x62 && appData[4] === 0x65 && appData[5] === 0) { // 'Adobe\x00'
- adobe = {
- version: appData[6],
- flags0: (appData[7] << 8) | appData[8],
- flags1: (appData[9] << 8) | appData[10],
- transformCode: appData[11]
- };
- }
- }
- break;
-
- case 0xFFDB: // DQT (Define Quantization Tables)
- var quantizationTablesLength = readUint16();
- var quantizationTablesEnd = quantizationTablesLength + offset - 2;
- while (offset < quantizationTablesEnd) {
- var quantizationTableSpec = data[offset++];
- var tableData = new Int32Array(64);
- if ((quantizationTableSpec >> 4) === 0) { // 8 bit values
- for (j = 0; j < 64; j++) {
- var z = dctZigZag[j];
- tableData[z] = data[offset++];
- }
- } else if ((quantizationTableSpec >> 4) === 1) { //16 bit
- for (j = 0; j < 64; j++) {
- var z = dctZigZag[j];
- tableData[z] = readUint16();
- }
- } else
- throw "DQT: invalid table spec";
- quantizationTables[quantizationTableSpec & 15] = tableData;
- }
- break;
-
- case 0xFFC0: // SOF0 (Start of Frame, Baseline DCT)
- case 0xFFC2: // SOF2 (Start of Frame, Progressive DCT)
- readUint16(); // skip data length
- frame = {};
- frame.progressive = (fileMarker === 0xFFC2);
- frame.precision = data[offset++];
- frame.scanLines = readUint16();
- frame.samplesPerLine = readUint16();
- frame.components = {};
- frame.componentsOrder = [];
- var componentsCount = data[offset++], componentId;
- var maxH = 0, maxV = 0;
- for (i = 0; i < componentsCount; i++) {
- componentId = data[offset];
- var h = data[offset + 1] >> 4;
- var v = data[offset + 1] & 15;
- var qId = data[offset + 2];
- frame.componentsOrder.push(componentId);
- frame.components[componentId] = {
- h: h,
- v: v,
- quantizationTable: quantizationTables[qId]
- };
- offset += 3;
- }
- prepareComponents(frame);
- frames.push(frame);
- break;
-
- case 0xFFC4: // DHT (Define Huffman Tables)
- var huffmanLength = readUint16();
- for (i = 2; i < huffmanLength;) {
- var huffmanTableSpec = data[offset++];
- var codeLengths = new Uint8Array(16);
- var codeLengthSum = 0;
- for (j = 0; j < 16; j++, offset++)
- codeLengthSum += (codeLengths[j] = data[offset]);
- var huffmanValues = new Uint8Array(codeLengthSum);
- for (j = 0; j < codeLengthSum; j++, offset++)
- huffmanValues[j] = data[offset];
- i += 17 + codeLengthSum;
-
- ((huffmanTableSpec >> 4) === 0 ?
- huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] =
- buildHuffmanTable(codeLengths, huffmanValues);
- }
- break;
-
- case 0xFFDD: // DRI (Define Restart Interval)
- readUint16(); // skip data length
- resetInterval = readUint16();
- break;
-
- case 0xFFDA: // SOS (Start of Scan)
- var scanLength = readUint16();
- var selectorsCount = data[offset++];
- var components = [], component;
- for (i = 0; i < selectorsCount; i++) {
- component = frame.components[data[offset++]];
- var tableSpec = data[offset++];
- component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];
- component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];
- components.push(component);
- }
- var spectralStart = data[offset++];
- var spectralEnd = data[offset++];
- var successiveApproximation = data[offset++];
- var processed = decodeScan(data, offset,
- frame, components, resetInterval,
- spectralStart, spectralEnd,
- successiveApproximation >> 4, successiveApproximation & 15);
- offset += processed;
- break;
- default:
- if (data[offset - 3] == 0xFF &&
- data[offset - 2] >= 0xC0 && data[offset - 2] <= 0xFE) {
- // could be incorrect encoding -- last 0xFF byte of the previous
- // block was eaten by the encoder
- offset -= 3;
- break;
- }
- throw "unknown JPEG marker " + fileMarker.toString(16);
- }
- fileMarker = readUint16();
- }
- if (frames.length != 1)
- throw "only single frame JPEGs supported";
-
- this.width = frame.samplesPerLine;
- this.height = frame.scanLines;
- this.jfif = jfif;
- this.adobe = adobe;
- this.components = [];
- for (var i = 0; i < frame.componentsOrder.length; i++) {
- var component = frame.components[frame.componentsOrder[i]];
- this.components.push({
- lines: buildComponentData(frame, component),
- scaleX: component.h / frame.maxH,
- scaleY: component.v / frame.maxV
- });
- }
- },
- getData: function getData(width, height) {
- var scaleX = this.width / width, scaleY = this.height / height;
-
- var component1, component2, component3, component4;
- var component1Line, component2Line, component3Line, component4Line;
- var x, y;
- var offset = 0;
- var Y, Cb, Cr, K, C, M, Ye, R, G, B;
- var colorTransform;
- var dataLength = width * height * this.components.length;
- var data = new Uint8Array(dataLength);
- switch (this.components.length) {
- case 1:
- component1 = this.components[0];
- for (y = 0; y < height; y++) {
- component1Line = component1.lines[0 | (y * component1.scaleY * scaleY)];
- for (x = 0; x < width; x++) {
- Y = component1Line[0 | (x * component1.scaleX * scaleX)];
-
- data[offset++] = Y;
- }
- }
- break;
- case 3:
- // The default transform for three components is true
- colorTransform = true;
- // The adobe transform marker overrides any previous setting
- if (this.adobe && this.adobe.transformCode)
- colorTransform = true;
- else if (typeof this.colorTransform !== 'undefined')
- colorTransform = !!this.colorTransform;
-
- component1 = this.components[0];
- component2 = this.components[1];
- component3 = this.components[2];
- for (y = 0; y < height; y++) {
- component1Line = component1.lines[0 | (y * component1.scaleY * scaleY)];
- component2Line = component2.lines[0 | (y * component2.scaleY * scaleY)];
- component3Line = component3.lines[0 | (y * component3.scaleY * scaleY)];
- for (x = 0; x < width; x++) {
- if (!colorTransform) {
- R = component1Line[0 | (x * component1.scaleX * scaleX)];
- G = component2Line[0 | (x * component2.scaleX * scaleX)];
- B = component3Line[0 | (x * component3.scaleX * scaleX)];
- } else {
- Y = component1Line[0 | (x * component1.scaleX * scaleX)];
- Cb = component2Line[0 | (x * component2.scaleX * scaleX)];
- Cr = component3Line[0 | (x * component3.scaleX * scaleX)];
-
- R = clampTo8bit(Y + 1.402 * (Cr - 128));
- G = clampTo8bit(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128));
- B = clampTo8bit(Y + 1.772 * (Cb - 128));
- }
-
- data[offset++] = R;
- data[offset++] = G;
- data[offset++] = B;
- }
- }
- break;
- case 4:
- if (!this.adobe)
- throw 'Unsupported color mode (4 components)';
- // The default transform for four components is false
- colorTransform = false;
- // The adobe transform marker overrides any previous setting
- if (this.adobe && this.adobe.transformCode)
- colorTransform = true;
- else if (typeof this.colorTransform !== 'undefined')
- colorTransform = !!this.colorTransform;
-
- component1 = this.components[0];
- component2 = this.components[1];
- component3 = this.components[2];
- component4 = this.components[3];
- for (y = 0; y < height; y++) {
- component1Line = component1.lines[0 | (y * component1.scaleY * scaleY)];
- component2Line = component2.lines[0 | (y * component2.scaleY * scaleY)];
- component3Line = component3.lines[0 | (y * component3.scaleY * scaleY)];
- component4Line = component4.lines[0 | (y * component4.scaleY * scaleY)];
- for (x = 0; x < width; x++) {
- if (!colorTransform) {
- C = component1Line[0 | (x * component1.scaleX * scaleX)];
- M = component2Line[0 | (x * component2.scaleX * scaleX)];
- Ye = component3Line[0 | (x * component3.scaleX * scaleX)];
- K = component4Line[0 | (x * component4.scaleX * scaleX)];
- } else {
- Y = component1Line[0 | (x * component1.scaleX * scaleX)];
- Cb = component2Line[0 | (x * component2.scaleX * scaleX)];
- Cr = component3Line[0 | (x * component3.scaleX * scaleX)];
- K = component4Line[0 | (x * component4.scaleX * scaleX)];
-
- C = 255 - clampTo8bit(Y + 1.402 * (Cr - 128));
- M = 255 - clampTo8bit(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128));
- Ye = 255 - clampTo8bit(Y + 1.772 * (Cb - 128));
- }
- data[offset++] = C;
- data[offset++] = M;
- data[offset++] = Ye;
- data[offset++] = K;
- }
- }
- break;
- default:
- throw 'Unsupported color mode';
- }
- return data;
- },
- copyToImageData: function copyToImageData(imageData) {
- var width = imageData.width, height = imageData.height;
- var imageDataArray = imageData.data;
- var data = this.getData(width, height);
- var i = 0, j = 0, x, y;
- var Y, K, C, M, R, G, B;
- switch (this.components.length) {
- case 1:
- for (y = 0; y < height; y++) {
- for (x = 0; x < width; x++) {
- Y = data[i++];
-
- imageDataArray[j++] = Y;
- imageDataArray[j++] = Y;
- imageDataArray[j++] = Y;
- imageDataArray[j++] = 255;
- }
- }
- break;
- case 3:
- for (y = 0; y < height; y++) {
- for (x = 0; x < width; x++) {
- R = data[i++];
- G = data[i++];
- B = data[i++];
-
- imageDataArray[j++] = R;
- imageDataArray[j++] = G;
- imageDataArray[j++] = B;
- imageDataArray[j++] = 255;
- }
- }
- break;
- case 4:
- for (y = 0; y < height; y++) {
- for (x = 0; x < width; x++) {
- C = data[i++];
- M = data[i++];
- Y = data[i++];
- K = data[i++];
-
- R = 255 - clampTo8bit(C * (1 - K / 255) + K);
- G = 255 - clampTo8bit(M * (1 - K / 255) + K);
- B = 255 - clampTo8bit(Y * (1 - K / 255) + K);
-
- imageDataArray[j++] = R;
- imageDataArray[j++] = G;
- imageDataArray[j++] = B;
- imageDataArray[j++] = 255;
- }
- }
- break;
- default:
- throw 'Unsupported color mode';
- }
- }
- };
-
- return constructor;
-})();
-
-
-}).call((typeof window === 'undefined') ? this : window);
-
-
diff --git a/reader/lib/dir.php b/reader/lib/dir.php
deleted file mode 100755
index 261ba7444..000000000
--- a/reader/lib/dir.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
- function explore($current_dir,$sub_dirs,$num_of_results) {
- $return = array();
- // Search for pdfs in sub directories.
- foreach ($sub_dirs as $dir) {
- $pdfs = \OC_FileCache::searchByMime('application', 'pdf', '/'.\OCP\USER::getUser().'/files'.$current_dir.$dir.'/');
- sort($pdfs);
- $max_count = min(count($pdfs),$num_of_results);
- $thumbs = array();
- for ($i = $max_count - 1; $i >= 0; $i--) {
- if (!in_array($pdfs[$i],$thumbs))
- $thumbs[] = $pdfs[$i];
- }
- $return[] = array($dir,$thumbs);
- }
- return $return;
- }
-
-?>
diff --git a/reader/lib/library_display.php b/reader/lib/library_display.php
deleted file mode 100755
index 6383211fd..000000000
--- a/reader/lib/library_display.php
+++ /dev/null
@@ -1,95 +0,0 @@
-<?php
-function display_each_ebook($directory,$name) {
- $check_thumb = check_thumb_exists(urldecode($directory.$name));
- echo '<td id = "thumbnail_container" width = "14%">
- <img rel ="images" id = "'.$directory.$name.'" src = "'.\OCP\Util::linkTo('reader', 'ajax/thumbnail.php').'&filepath='.$directory.rtrim($name,'pdf').'png'.'" value = "'.$check_thumb.'">
- </td>';
- echo '<td class = "filename svg" width = "86%">
- <a class="name" href="http://localhost'.\OCP\Util::linkTo('files', 'download.php').'?file='.$directory.$name.'" title="'.urldecode($name).'" dir = "'.urldecode($directory.$name).'">
- <span class = "nametext">'.
- htmlspecialchars(urldecode($name)).
- '</span>
- </a>';
- $each_row = find_tags_for_ebook(urldecode($directory).urldecode($name));
- $tags = explode(",",$each_row);
- if (count($tags) < 5) {
- echo '<form action = "apps/reader/ajax/tags.php" id="TagForm">
- <input type="text" name="tag" placeholder="Add Tag..." />
- <input type="submit" value="Add Tag" />
- </form>';
- }
-
- if (count($tags) >= 1) {
- echo '<div id="result">';
- foreach ($tags as $tag) {
- if ($tag != '' ) {
- echo '<div class = "each_result">';
- echo '<a id = "each_tag" href = "'.\OCP\Util::linkTo('reader', 'fetch_tags.php').'?tag='.$tag.'">'
- .ucwords($tag).
- '</a>';
- echo '<a id = "close" value = "'.$tag.'">x</a></div>';
- }
- }
- echo '</div>';
- }
- echo '</td>';
-}
-
-function display_sub_dirs($current_dir,$sub_dirs) {
- $results = explore($current_dir,$sub_dirs,1);
- foreach ($results as $r) {
- echo '<tr id = "row" data-file="'.$r[0].'" data-type="dir">
- <td id = "thumbnail_container" width = "14%"><div id = "thumbs">';
- $is_dir = check_dir_exists($current_dir,$r[0]);
- $margin = 10;
- $img_id = 1;
- foreach ($r[1] as $thumbs) {
- $thumb_exists = false;
- $thumb_exists = check_thumb_exists($current_dir.$r[0].'/'.$thumbs);
-
- $img_path = \OCP\Util::linkTo('reader', 'ajax/thumbnail.php').'&filepath='.urlencode($current_dir.$r[0].'/'.rtrim($thumbs,'pdf').'png');
- $counter = 3;
- for ($i = 1; $i <= $counter; $i++) {
- echo '<img id = "'.$current_dir.$r[0].'/'.$thumbs.'" src = "'.$img_path.'" value = "'.$thumb_exists.'" style = "position:absolute;top:-55px;left:10px;margin-left:'.$margin.'px; z-index:'.(50-$margin).';"/>';
- $margin = $margin + 5;
- $img_id = $img_id + 1;
- }
- }
- echo '</div></td>';
- echo '<td class = "filename svg" width = "86%">
- <a class = "dirs" id = "'.$r[0].'" href = "'.OCP\Util::linkTo('reader', 'index.php').'&dir='.$current_dir.$r[0].'/'.'">
- <span class = "nametext">'
- .htmlspecialchars($r[0])
- .'</span>
- </a>
- <div id = "more_info" style = "color:#666;margin-left:15px;margin-top:35px; vertical-align:bottom">';
- echo "Browse in for";
- echo '<br>';
- $dir_browse_results = explore($current_dir,array($r[0]),5);
- foreach($dir_browse_results as $browse_result) {
- foreach($browse_result[1] as $each) {
- $each_sub_dir = explode("/",$each);
- if (count($each_sub_dir) > 1) {
- foreach($each_sub_dir as $element) { echo '<span style = "color:#DDD;">>></span>'.$element; }
- }
- else
- echo '<span style = "color:#DDD;"> >></span>'.$each;echo '<br>';
- }
- }
- echo '</div>
- </td>
- </tr>';
- }
-}
-
-function display_ebooks($filename,$current_dir) {
- $name = str_replace('+','%20',urlencode($filename));
- $name = str_replace('%2F','/', $name);
- $directory = str_replace('+','%20',urlencode($current_dir));
- $directory = str_replace('%2F','/', $directory);
-
- echo '<tr id = "row" data-file="'.$name.'" data-type="file" data-mime="application/pdf" data-size="3462755" data-write="true">';
- display_each_ebook($directory,$name);
- echo '</tr>';
- echo '<br>';
-}
diff --git a/reader/lib/search.php b/reader/lib/search.php
deleted file mode 100755
index c8bef5bbd..000000000
--- a/reader/lib/search.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-class OC_ReaderSearchProvider extends OC_Search_Provider{
- function search($query){
- $files=OC_FileCache::search($query,true);
- $results=array();
- foreach($files as $fileData){
- $file=$fileData['path'];
- $mime=$fileData['mimetype'];
- if($mime=='application/pdf'){
- $results[]=new OC_Search_Result(basename($file),'',OC_Helper::linkTo( 'reader', 'results.php' ).'?file='.$file,'eBook', dirname($file));
- }
- }
- return $results;
- }
-}
-?>
diff --git a/reader/lib/tag_utils.php b/reader/lib/tag_utils.php
deleted file mode 100755
index dd6aa474b..000000000
--- a/reader/lib/tag_utils.php
+++ /dev/null
@@ -1,56 +0,0 @@
-<?php
-function find_tags_for_ebook($path_of_ebook) {
- $sql = 'SELECT `tags` FROM `*PREFIX*eBook_library` WHERE `filepath` = ?';
- $stmt = OCP\DB::prepare($sql);
- $res = $stmt->execute(array($path_of_ebook));
- $tags = NULL;
- while($r = $res->fetchRow()) {
- $tags = $r['tags'];
- }
- return $tags;
-}
-
-function update_tag_for_ebook($new_tag,$path_of_ebook) {
- $tags = find_tags_for_ebook($path_of_ebook);
- $each_tag = explode(",",$tags);
- if (count($each_tag) < 5) {
- $stmt = OCP\DB::prepare("UPDATE `*PREFIX*eBook_library` SET `tags` = ? WHERE `filepath` = ?");
- $stmt->execute(array($new_tag,$path_of_ebook));
- }
- else
- return;
-}
-
-function insert_new_tag($new_tag,$path_of_ebook) {
- $stmt = OCP\DB::prepare('INSERT INTO `*PREFIX*eBook_library` (`filepath`,`tags`) VALUES (?, ?)');
- $stmt->execute(array($path_of_ebook,$new_tag));
-}
-
-function find_results_with_tag_like($tag) {
- $sql = 'SELECT * FROM `*PREFIX*eBook_library` WHERE `tags` LIKE ?';
- $stmt = OCP\DB::prepare($sql);
- $res = $stmt->execute(array($tag));
- return $res;
-}
-
-function check_consistency_with_database($root,$pdfs) {
- $new_array_pdfs = array();
- foreach ($pdfs as $pdf) {
- $new_array_pdfs[] = $root.$pdf;
- }
- $sql = 'SELECT `filepath` from `*PREFIX*ebook_library`';
- $stmt = OCP\DB::prepare($sql);
- $res = $stmt->execute();
- while ($r = $res->fetchRow()) {
- if (!in_array($r['filepath'],$new_array_pdfs))
- delete_entry($r['filepath']);
- }
-}
-
-function delete_entry($filepath) {
- $sql = 'DELETE FROM `*PREFIX*eBook_library` WHERE filepath = ?';
- $stmt = OCP\DB::prepare($sql);
- $res = $stmt->execute(array($filepath));
-}
-
-?>
diff --git a/reader/lib/thumbnail.php b/reader/lib/thumbnail.php
deleted file mode 100755
index cfb133a35..000000000
--- a/reader/lib/thumbnail.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-
- function check_thumb_exists($location) {
- $image_path = rtrim($location,'pdf').'png';
- if(!file_exists('/opt/lampp/htdocs/owncloud/data/priyanka/reader'.$image_path)) {
- $check = "false";
- }
- else
- $check = "true";
- return $check;
- }
-
- function thumb($path) {
- $thumb_path = \OCP\Config::getSystemValue( 'datadirectory' ).'/'.\OC_User::getUser().'/reader';
- if (file_exists($thumb_path.$path)) {
- return new \OC_Image($thumb_path.$path);
- }
- if (!\OC\Files\Filesystem::file_exists($path)) {
- return false;
- }
- }
-
- function check_dir_exists($current_dir,$dir) {
- $owner = OCP\USER::getUser();
- $path = OCP\Config::getSystemValue("datadirectory").'/'. $owner .'/reader';
- $path .= $current_dir.$dir;
- if (!is_dir($path)) {
- mkdir($path, 0777, true);
- return true;
- }
- else
- return true;
- }
-
-?>
diff --git a/reader/results.php b/reader/results.php
deleted file mode 100755
index ec6418aeb..000000000
--- a/reader/results.php
+++ /dev/null
@@ -1,18 +0,0 @@
-<?php
-
-OCP\Util::addscript( 'reader', 'integrate' );
-OCP\Util::addscript( 'reader', 'pdf' );
-OCP\Util::addStyle('reader','reader');
-OCP\Util::addStyle('files','files');
-
-$file = $_GET['file'];
-$path = dirname($file);
-$filename = basename($file);
-
-$tmpl = new OCP\Template( 'reader', 'results', 'user' );
-$tmpl->assign('file', $file);
-$tmpl->assign('path', $path);
-$tmpl->assign('filename', $filename);
-$tmpl->printPage();
-
-?>
diff --git a/reader/templates/index.php b/reader/templates/index.php
deleted file mode 100755
index 8421f25fe..000000000
--- a/reader/templates/index.php
+++ /dev/null
@@ -1,99 +0,0 @@
-<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
-<META HTTP-EQUIV="Expires" CONTENT="-1">
-<script type="text/javascript">
- // Specify the main script used to create a new PDF.JS web worker.
- PDFJS.workerSrc = 'apps/reader/js/pdf.js';
-</script>
-
-<div id = "controls">
-<?
- include('reader/lib/dir.php');
- include('reader/lib/thumbnail.php');
- include('reader/lib/library_display.php');
- include('reader/lib/tag_utils.php');
-
- // Get the current directory.
- $current_dir = empty($_['dir'])?'/':$_['dir'];
- $base_url = OCP\Util::linkTo('reader', 'index.php').'&dir=';
- $curr_path = '';
- $path = explode( '/', trim($current_dir,'/'));
-
- // Navaigation Tab.
- if( $path != '' ){
- for($i=0; $i<count($path); $i++){
- $curr_path .= '/'.str_replace('+','%20', urlencode($path[$i]));?>
- <div class="crumb <?php if($i == count($path)-1) p('last');?> svg" data-dir='<?php p($curr_path);?>' style='background-image:url("<?php print_unescaped(OCP\image_path('core','breadcrumb.png'));?>")'>
- <a href="<?php print_unescaped($base_url.$curr_path.'/'); ?>"><?php p($path[$i]); ?></a>
- </div>
-<? }
- }
-?>
-
- <div id="file_action_panel"></div>
- <!-- Set dir value to be passed to integrate.js -->
- <input type="hidden" name="dir" value="<?php p(empty($_['dir'])?'':rtrim($_['dir'],'/')) ?>" id="dir">
-
-</div>
-
-<div class="actions"></div>
-
-<?php
-
- // Search for pdf files in current directory.
- $view = new \OC\Files\View('/'.\OCP\USER::getUser().'/files'.$current_dir);
- $pdfs = $view->searchByMime('application/pdf');
- sort($pdfs);
-
- // Cleans the eBooks table of files that have been deleted from the files app.
- if ($current_dir == '/')
- check_consistency_with_database($current_dir,$pdfs);
-
- // Construct an array, to store pdf files and directory names, in which pdf files reside.
- $files = array();
-
- // Store file info in the file array.
- foreach ($pdfs as $pdf) {
- $file_info = pathinfo($pdf);
- $file = array();
- $file['dirname'] = $file_info['dirname'];
- $file['basename'] = $file_info['filename'];
- $file['filename'] = $file_info['basename'];
- $file['extension'] = '.'.$file_info['extension'];
- $files[] = $file;
- }
-?>
-
-<table id = "readerContent">
- <tbody id = "fileList">
-<?php
- // Array to store directory entries, which contain pdfs.
- $sub_dirs = array();
- $ebooks = array();
-
- foreach ($files as $file) {
- if ($file['dirname'] == '.') {
- $ebooks[] = $file['filename'];
- }
- else {
- // Trim the extra slash that we don't need.
- $dir_name = ltrim($current_dir, '/');
-
- // Explode the variable to check if the pdf file is contained in a directory.
- $dir_array = explode('/', $file['dirname']);
-
- // Get the directory name in which the pdf resides.
- $sub_dir = $dir_array[0];
- if (!in_array($sub_dir, $sub_dirs)) {
- $sub_dirs[] = $sub_dir;
- }
- }
- }
- display_sub_dirs($current_dir,$sub_dirs);
-
- foreach ($ebooks as $ebook) {
- display_ebooks($ebook,$current_dir);
- }
-?>
- </tbody>
-</table>
-
diff --git a/reader/templates/results.php b/reader/templates/results.php
deleted file mode 100755
index 6b23aac18..000000000
--- a/reader/templates/results.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
-<META HTTP-EQUIV="Expires" CONTENT="-1">
-<script type="text/javascript">
- PDFJS.workerSrc = 'apps/reader/js/pdf.js';
-</script>
-
-<div id = "controls">
- <?php
- $current_dir = empty($_['path'])?'/':$_['path'];
- $base_url = OCP\Util::linkTo('reader', 'index.php').'?dir=';
-
- $curr_path = '';
- $path = explode( '/', trim($current_dir,'/'));
- // Navaigation Tab.
- if( $path != '' ){
- for($i=0; $i<count($path); $i++){
- $curr_path .= '/'.str_replace('+','%20', urlencode($path[$i]));?>
- <div class="crumb <?php if($i == count($path)-1) p('last');?> svg" data-dir='<?php p($curr_path);?>' style='background-image:url("<?php print_unescaped(OCP\image_path('core','breadcrumb.png'));?>")'>
- <a href="<?php print_unescaped($base_url.$curr_path.'/'); ?>"><?php p($path[$i]) ?></a>
- </div>
- <?php }
- }
- ?>
- <div id="file_action_panel"></div>
- <input type="hidden" name="dir" value="<?php p(empty($_['path'])?'':rtrim($_['path'],'/')) ?>" id="dir">
-</div>
-
-<div class="actions"></div>
-
-<table id = "readerContent">
- <tbody id = "fileList">
- <?php
-
- include('reader/lib/thumbnail.php');
- include('reader/lib/library_display.php');
- include('reader/lib/tag_utils.php');
- $file = $_['file'];
- $path = $_['path'];
- $filename = $_['filename'];
- display_ebooks($filename,$path.'/');
- ?>
- </tbody>
-</table>
-
diff --git a/reader/templates/tagged.php b/reader/templates/tagged.php
deleted file mode 100755
index 01ede82b5..000000000
--- a/reader/templates/tagged.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<div id = "controls">
-</div>
-
-<div class="actions"></div>
-
-<?php
- include('reader/lib/dir.php');
- include('reader/lib/thumbnail.php');
- include('reader/lib/library_display.php');
- include('reader/lib/tag_utils.php');
- $tag = "%".$_['tag']."%";
- $res = find_results_with_tag_like($tag);
-?>
-<table id = "readerContent">
- <tbody id = "fileList">
- <?php
- while($r = $res->fetchRow()) {
- $dirname = dirname($r['filepath']);
- if ($dirname != '/') {
- $dirname = $dirname.'/';
- }
- display_ebooks(basename($r['filepath']),$dirname);
- }
- ?>
-</tbody>
-</table>
diff --git a/search/appinfo/app.php b/search/appinfo/app.php
deleted file mode 100644
index dd8779c75..000000000
--- a/search/appinfo/app.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-OCP\App::addNavigationEntry(array(
- 'id' => 'search',
- 'href' => OCP\Util::linkTo('search', 'index.php'),
- 'icon' => OCP\Util::imagePath('', 'actions/search.svg'),
- 'name' => 'Adv. Search',
- 'order' => 50
-));
diff --git a/search/appinfo/info.xml b/search/appinfo/info.xml
deleted file mode 100644
index 6380d005b..000000000
--- a/search/appinfo/info.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0"?>
-<info>
- <id>search</id>
- <name>Advanced Search</name>
- <description>Allows users to interact with search results (e.g. delete, share) using the same view available in the Files app. Much like iTunes, you can interact with your search results in a file list. It uses the current search providers available ownCloud (i.e. they only search by file name) but I plan to start building more search providers soon. This project is still in beta testing; please submit all bugs or feature requests to https://github.com/andrewsbrown/owncloud-core/issues.</description>
- <licence>AGPL</licence>
- <author>Andrew Brown</author>
- <requiremin>4.93</requiremin>
- <shipped>false</shipped>
- <standalone/>
- <types>
- <filesystem/>
- </types>
-</info>
diff --git a/search/appinfo/version b/search/appinfo/version
deleted file mode 100644
index ea2303bc0..000000000
--- a/search/appinfo/version
+++ /dev/null
@@ -1 +0,0 @@
-0.5 \ No newline at end of file
diff --git a/search/css/search.css b/search/css/search.css
deleted file mode 100644
index dbdaaf27f..000000000
--- a/search/css/search.css
+++ /dev/null
@@ -1,6 +0,0 @@
-.search_button, .search_button:hover{
- background-image: url('%webroot%/core/img/actions/search.svg');
- background-repeat: no-repeat;
- background-position: .4em center;
- text-indent: 1.4em;
-} \ No newline at end of file
diff --git a/search/index.php b/search/index.php
deleted file mode 100644
index ce0416c40..000000000
--- a/search/index.php
+++ /dev/null
@@ -1,76 +0,0 @@
-<?php
-
-// check if we are a user
-OCP\User::checkLoggedIn();
-
-// load files
-OCP\Util::addStyle('files', 'files');
-OCP\Util::addStyle('search', 'search');
-OCP\Util::addscript('files', 'jquery.iframe-transport');
-OCP\Util::addscript('files', 'jquery.fileupload');
-OCP\Util::addscript('files', 'files');
-OCP\Util::addscript('files', 'filelist');
-OCP\Util::addscript('files', 'fileactions');
-OCP\Util::addscript('files', 'keyboardshortcuts');
-
-// activate link
-OCP\App::setActiveNavigationEntry('search');
-
-// get results
-$query = (isset($_GET['query'])) ? $_GET['query'] : '';
-$results = null;
-if ($query) {
- $results = OC_Search::search($query);
-}
-
-// create HTML table
-$files = array();
-if (is_array($results)) {
- foreach ($results as $result) {
- // create file
- $_file = $result->fileData;
- // discard versions
- if (strpos($_file['path'], '_versions') === 0) {
- continue;
- }
- // get basename and extension
- $fileinfo = pathinfo($_file['name']);
- $_file['basename'] = $fileinfo['filename'];
- if (!empty($fileinfo['extension'])) {
- $_file['extension'] = '.' . $fileinfo['extension'];
- } else {
- $_file['extension'] = '';
- }
- // get date
- $_file['date'] = OCP\Util::formatDate($_file['mtime']);
- // get directory
- $_file['directory'] = str_replace('/' . $_file['name'], '', $_file['path']);
- // get permissions
- $_file['type'] = ($_file['mimetype'] == 'httpd/unix-directory') ? 'dir' : 'file';
- $permissions = OCP\PERMISSION_READ;
- if (!$_file['encrypted']) {
- $permissions |= OCP\PERMISSION_SHARE;
- }
- if ($_file['type'] == 'dir' && $_file['writable']) {
- $permissions |= OCP\PERMISSION_CREATE;
- }
- if ($_file['writable']) {
- $permissions |= OCP\PERMISSION_UPDATE | OCP\PERMISSION_DELETE;
- }
- $_file['permissions'] = $permissions;
- // add file
- $files[] = $_file;
- }
-}
-$list = new OCP\Template('files', 'part.list', '');
-$list->assign('files', $files);
-$list->assign('baseURL', OCP\Util::linkTo('files', 'index.php') . '?dir=');
-$list->assign('downloadURL', OCP\Util::linkTo('files', 'download.php') . '?file=');
-
-// populate main template
-$tmpl = new OCP\Template('search', 'index', 'user');
-$tmpl->assign('files', $files);
-$tmpl->assign('fileList', $list->fetchPage());
-$tmpl->assign('breadcrumb', $query);
-$tmpl->assign('allowZipDownload', intval(OCP\Config::getSystemValue('allowZipDownload', true)));
-$tmpl->printPage(); \ No newline at end of file
diff --git a/search/templates/index.php b/search/templates/index.php
deleted file mode 100644
index 713e8d0a5..000000000
--- a/search/templates/index.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<!--[if IE 8]><style>input[type="checkbox"]{padding:0;}table td{position:static !important;}</style><![endif]-->
-
-<!-- search form -->
-<div id="controls">
- <form id="search-form" action="<?php print_unescaped(OCP\Util::linkTo('search', 'index.php')); ?>" method="get">
- <input type="text" name="query" id="search_query" value="<?php p($_['breadcrumb']); ?>">
- <button class="button search_button">Search</button>
- </form>
-</div>
-<div id="file_action_panel"></div>
-<div id='notification'></div>
-
-<?php if (empty($_['files'])): ?>
- <div id="emptyfolder"><?php p($l->t('Nothing found.')) ?></div>
-<?php endif; ?>
-
-<!-- results list -->
-<table class="resultsList">
- <thead>
- <tr>
- <th id='headerName'>
- <input type="checkbox" id="select_all" />
- <span class='name'><?php p($l->t('Name')); ?></span>
- <span class='selectedActions'>
- <?php if ($_['allowZipDownload']) : ?>
- <a href="" class="download"><img class='svg' alt="Download" src="<?php print_unescaped(OCP\image_path("core", "actions/download.svg")); ?>" /> <?php p($l->t('Download')) ?></a>
- <?php endif; ?>
- </span>
- </th>
- <th id="headerSize"><?php p($l->t('Size')); ?></th>
- <th id="headerDate">
- <span id="modified"><?php p($l->t('Modified')); ?></span>
- </th>
- </tr>
- </thead>
- <tbody id="fileList">
- <?php print_unescaped($_['fileList']); ?>
- </tbody>
-</table>
-<div id="editor"></div>
-
-<!-- config hints for javascript -->
-<input type="hidden" name="allowZipDownload" id="allowZipDownload" value="<?php p($_['allowZipDownload']); ?>" />
diff --git a/tattoo/ajax/bg.php b/tattoo/ajax/bg.php
deleted file mode 100644
index c06b387d3..000000000
--- a/tattoo/ajax/bg.php
+++ /dev/null
@@ -1,6 +0,0 @@
-<?php
-
-// Check if we are a user
-OCP\JSON::checkLoggedIn();
-
-OCP\JSON::success(array('data' => OCP\Config::getUserValue(OCP\User::getUser(),'tattoo','wallpaper','none')));
diff --git a/tattoo/appinfo/app.php b/tattoo/appinfo/app.php
deleted file mode 100644
index cf45a67ff..000000000
--- a/tattoo/appinfo/app.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-
-/**
-* ownCloud - Tattoo
-*
-* @author Arthur Schiwon
-* @copyright 2012 Arthur Schiwon blizzz@owncloud.com
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the License, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library. If not, see <http://www.gnu.org/licenses/>.
-*
-*/
-
-OCP\App::registerPersonal('tattoo','settings');
-
-$wallpaper=OCP\Config::getUserValue(OCP\User::getUser(),'tattoo','wallpaper','none');
-if($wallpaper != 'none') {
- OCP\Util::addStyle('tattoo', 'tattoo');
- OCP\Util::addScript('tattoo', 'tattoo');
-}
diff --git a/tattoo/appinfo/info.xml b/tattoo/appinfo/info.xml
deleted file mode 100644
index 7e283e27f..000000000
--- a/tattoo/appinfo/info.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0"?>
-<info>
- <id>tattoo</id>
- <name>Personal Wall Tattoo</name>
- <description>Puts a background picture in the content area</description>
- <licence>AGPL</licence>
- <author>Arthur Schiwon (contributor: Luc Didry)</author>
- <requiremin>5</requiremin>
-</info>
diff --git a/tattoo/appinfo/version b/tattoo/appinfo/version
deleted file mode 100644
index 3b04cfb60..000000000
--- a/tattoo/appinfo/version
+++ /dev/null
@@ -1 +0,0 @@
-0.2
diff --git a/tattoo/css/settings.css b/tattoo/css/settings.css
deleted file mode 100644
index 2666f61b9..000000000
--- a/tattoo/css/settings.css
+++ /dev/null
@@ -1,3 +0,0 @@
-.tattooTile { margin: 2px; display:inline-block; width:75px; height: 90px; text-align: center; }
-.tattooTilePicture { width: 100%; height: 75px; }
-.tattooTileChooser { width: 100%; } \ No newline at end of file
diff --git a/tattoo/css/tattoo.css b/tattoo/css/tattoo.css
deleted file mode 100644
index 63d2f0cf2..000000000
--- a/tattoo/css/tattoo.css
+++ /dev/null
@@ -1 +0,0 @@
-#tattoobg{position:fixed;bottom:5px;right:5px;z-index:1;opacity:0.3;filter:alpha(opacity=30);}
diff --git a/tattoo/img/tattoo-cat.png b/tattoo/img/tattoo-cat.png
deleted file mode 100644
index 857e4420f..000000000
--- a/tattoo/img/tattoo-cat.png
+++ /dev/null
Binary files differ
diff --git a/tattoo/img/tattoo-clouds.png b/tattoo/img/tattoo-clouds.png
deleted file mode 100644
index 224c9c201..000000000
--- a/tattoo/img/tattoo-clouds.png
+++ /dev/null
Binary files differ
diff --git a/tattoo/img/tattoo-sun.png b/tattoo/img/tattoo-sun.png
deleted file mode 100644
index edd21c6b1..000000000
--- a/tattoo/img/tattoo-sun.png
+++ /dev/null
Binary files differ
diff --git a/tattoo/img/tattoo-tattoo.png b/tattoo/img/tattoo-tattoo.png
deleted file mode 100644
index abf09eb25..000000000
--- a/tattoo/img/tattoo-tattoo.png
+++ /dev/null
Binary files differ
diff --git a/tattoo/js/tattoo.js b/tattoo/js/tattoo.js
deleted file mode 100644
index 15168e3ae..000000000
--- a/tattoo/js/tattoo.js
+++ /dev/null
@@ -1,8 +0,0 @@
-$(document).ready(function() {
- $.ajax({
- url: OC.filePath('tattoo', 'ajax', 'bg.php'),
- success: function(response){
- $('#content-wrapper').prepend('<img alt="background" src="'+OC.filePath('tattoo', 'img', response.data)+'" id="tattoobg"/>');
- }
- });
-});
diff --git a/tattoo/settings.php b/tattoo/settings.php
deleted file mode 100644
index 2cbd41809..000000000
--- a/tattoo/settings.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-OCP\Util::addStyle('tattoo', 'settings');
-
-// die($_POST['tattooWallpaper']);
-if(isset($_POST['tattooSetWallpaper']) && isset($_POST['tattooWallpaper'])) {
- OCP\Config::setUserValue(OCP\User::getUser(),'tattoo','wallpaper',$_POST['tattooWallpaper']);
- OCP\Config::setUserValue(OCP\User::getUser(),'tattoo','lastModified',gmdate('D, d M Y H:i:s') . ' GMT');
-}
-$wallpaper=OCP\Config::getUserValue(OCP\User::getUser(),'tattoo','wallpaper','none');
-
-$tmpl = new OCP\Template( 'tattoo', 'settings');
-$tmpl->assign('tattooSelectedWallpaper',$wallpaper);
-
-return $tmpl->fetchPage();
diff --git a/tattoo/templates/settings.php b/tattoo/templates/settings.php
deleted file mode 100644
index 464cd752a..000000000
--- a/tattoo/templates/settings.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<form id="tattoo" method="post">
- <fieldset class="personalblock">
- <strong><?php p($l->t('Tattoo Wallpaper')); ?></strong><br />
- <div class="tattooTile">
- <div class="tattooTilePicture"></div>
- <input type="radio" name="tattooWallpaper" value="none"<?php if ($_['tattooSelectedWallpaper']=='none') print_unescaped(' checked="checked"'); ?>/>
- </div>
- <div class="tattooTile">
- <div class="tattooTilePicture"><img src="<?php print_unescaped(OCP\image_path('tattoo', 'tattoo-tattoo.png')); ?>" width="71" height="71"></div>
- <input type="radio" name="tattooWallpaper" value="tattoo-tattoo.png"<?php if ($_['tattooSelectedWallpaper']=='tattoo-tattoo.png') print_unescaped(' checked="checked"'); ?>/>
- </div>
- <div class="tattooTile">
- <div class="tattooTilePicture"><img src="<?php print_unescaped(OCP\image_path('tattoo', 'tattoo-cat.png')); ?>" width="71" height="71"></div>
- <input type="radio" name="tattooWallpaper" value="tattoo-cat.png"<?php if ($_['tattooSelectedWallpaper']=='tattoo-cat.png') print_unescaped(' checked="checked"'); ?>/>
- </div>
- <div class="tattooTile">
- <div class="tattooTilePicture"><img src="<?php print_unescaped(OCP\image_path('tattoo', 'tattoo-clouds.png')); ?>" width="71" height="71"></div>
- <input type="radio" name="tattooWallpaper" value="tattoo-clouds.png"<?php if ($_['tattooSelectedWallpaper']=='tattoo-clouds.png') print_unescaped(' checked="checked"'); ?>/>
- </div>
- <div class="tattooTile">
- <div class="tattooTilePicture"><img src="<?php print_unescaped(OCP\image_path('tattoo', 'tattoo-sun.png')); ?>" width="71" height="71"></div>
- <input type="radio" name="tattooWallpaper" value="tattoo-sun.png"<?php if ($_['tattooSelectedWallpaper']=='tattoo-sun.png') print_unescaped(' checked="checked"'); ?>/>
- </div>
- <br/>
- <input type="hidden" name="requesttoken" value="<?php p($_['requesttoken']); ?>">
- <input type="submit" name="tattooSetWallpaper" id="tattooSetWallpaper" value="Save"/>
- </fieldset>
-</form>
diff --git a/user_persona/COPYING-AGPL b/user_persona/COPYING-AGPL
deleted file mode 100644
index dba13ed2d..000000000
--- a/user_persona/COPYING-AGPL
+++ /dev/null
@@ -1,661 +0,0 @@
- GNU AFFERO GENERAL PUBLIC LICENSE
- Version 3, 19 November 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The GNU Affero General Public License is a free, copyleft license for
-software and other kinds of works, specifically designed to ensure
-cooperation with the community in the case of network server software.
-
- The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works. By contrast,
-our General Public Licenses are intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
- Developers that use our General Public Licenses protect your rights
-with two steps: (1) assert copyright on the software, and (2) offer
-you this License which gives you legal permission to copy, distribute
-and/or modify the software.
-
- A secondary benefit of defending all users' freedom is that
-improvements made in alternate versions of the program, if they
-receive widespread use, become available for other developers to
-incorporate. Many developers of free software are heartened and
-encouraged by the resulting cooperation. However, in the case of
-software used on network servers, this result may fail to come about.
-The GNU General Public License permits making a modified version and
-letting the public access it on a server without ever releasing its
-source code to the public.
-
- The GNU Affero General Public License is designed specifically to
-ensure that, in such cases, the modified source code becomes available
-to the community. It requires the operator of a network server to
-provide the source code of the modified version running there to the
-users of that server. Therefore, public use of a modified version, on
-a publicly accessible server, gives the public access to the source
-code of the modified version.
-
- An older license, called the Affero General Public License and
-published by Affero, was designed to accomplish similar goals. This is
-a different license, not a version of the Affero GPL, but Affero has
-released a new version of the Affero GPL which permits relicensing under
-this license.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- TERMS AND CONDITIONS
-
- 0. Definitions.
-
- "This License" refers to version 3 of the GNU Affero General Public License.
-
- "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
- "The Program" refers to any copyrightable work licensed under this
-License. Each licensee is addressed as "you". "Licensees" and
-"recipients" may be individuals or organizations.
-
- To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy. The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
- A "covered work" means either the unmodified Program or a work based
-on the Program.
-
- To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy. Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
- To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies. Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
- An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License. If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
- 1. Source Code.
-
- The "source code" for a work means the preferred form of the work
-for making modifications to it. "Object code" means any non-source
-form of a work.
-
- A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
- The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form. A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
- The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities. However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work. For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
- The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
- The Corresponding Source for a work in source code form is that
-same work.
-
- 2. Basic Permissions.
-
- All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met. This License explicitly affirms your unlimited
-permission to run the unmodified Program. The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work. This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
- You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force. You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright. Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
- Conveying under any other circumstances is permitted solely under
-the conditions stated below. Sublicensing is not allowed; section 10
-makes it unnecessary.
-
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
- No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
- When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
- 4. Conveying Verbatim Copies.
-
- You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
- You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
- 5. Conveying Modified Source Versions.
-
- You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
- a) The work must carry prominent notices stating that you modified
- it, and giving a relevant date.
-
- b) The work must carry prominent notices stating that it is
- released under this License and any conditions added under section
- 7. This requirement modifies the requirement in section 4 to
- "keep intact all notices".
-
- c) You must license the entire work, as a whole, under this
- License to anyone who comes into possession of a copy. This
- License will therefore apply, along with any applicable section 7
- additional terms, to the whole of the work, and all its parts,
- regardless of how they are packaged. This License gives no
- permission to license the work in any other way, but it does not
- invalidate such permission if you have separately received it.
-
- d) If the work has interactive user interfaces, each must display
- Appropriate Legal Notices; however, if the Program has interactive
- interfaces that do not display Appropriate Legal Notices, your
- work need not make them do so.
-
- A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit. Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
- 6. Conveying Non-Source Forms.
-
- You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
- a) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by the
- Corresponding Source fixed on a durable physical medium
- customarily used for software interchange.
-
- b) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by a
- written offer, valid for at least three years and valid for as
- long as you offer spare parts or customer support for that product
- model, to give anyone who possesses the object code either (1) a
- copy of the Corresponding Source for all the software in the
- product that is covered by this License, on a durable physical
- medium customarily used for software interchange, for a price no
- more than your reasonable cost of physically performing this
- conveying of source, or (2) access to copy the
- Corresponding Source from a network server at no charge.
-
- c) Convey individual copies of the object code with a copy of the
- written offer to provide the Corresponding Source. This
- alternative is allowed only occasionally and noncommercially, and
- only if you received the object code with such an offer, in accord
- with subsection 6b.
-
- d) Convey the object code by offering access from a designated
- place (gratis or for a charge), and offer equivalent access to the
- Corresponding Source in the same way through the same place at no
- further charge. You need not require recipients to copy the
- Corresponding Source along with the object code. If the place to
- copy the object code is a network server, the Corresponding Source
- may be on a different server (operated by you or a third party)
- that supports equivalent copying facilities, provided you maintain
- clear directions next to the object code saying where to find the
- Corresponding Source. Regardless of what server hosts the
- Corresponding Source, you remain obligated to ensure that it is
- available for as long as needed to satisfy these requirements.
-
- e) Convey the object code using peer-to-peer transmission, provided
- you inform other peers where the object code and Corresponding
- Source of the work are being offered to the general public at no
- charge under subsection 6d.
-
- A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
- A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling. In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage. For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product. A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
- "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source. The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
- If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information. But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
- The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed. Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
- Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
- 7. Additional Terms.
-
- "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law. If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
- When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it. (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.) You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
- Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
- a) Disclaiming warranty or limiting liability differently from the
- terms of sections 15 and 16 of this License; or
-
- b) Requiring preservation of specified reasonable legal notices or
- author attributions in that material or in the Appropriate Legal
- Notices displayed by works containing it; or
-
- c) Prohibiting misrepresentation of the origin of that material, or
- requiring that modified versions of such material be marked in
- reasonable ways as different from the original version; or
-
- d) Limiting the use for publicity purposes of names of licensors or
- authors of the material; or
-
- e) Declining to grant rights under trademark law for use of some
- trade names, trademarks, or service marks; or
-
- f) Requiring indemnification of licensors and authors of that
- material by anyone who conveys the material (or modified versions of
- it) with contractual assumptions of liability to the recipient, for
- any liability that these contractual assumptions directly impose on
- those licensors and authors.
-
- All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10. If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term. If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
- If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
- Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
- 8. Termination.
-
- You may not propagate or modify a covered work except as expressly
-provided under this License. Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
- However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
- Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
- Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License. If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
- 9. Acceptance Not Required for Having Copies.
-
- You are not required to accept this License in order to receive or
-run a copy of the Program. Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance. However,
-nothing other than this License grants you permission to propagate or
-modify any covered work. These actions infringe copyright if you do
-not accept this License. Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
- 10. Automatic Licensing of Downstream Recipients.
-
- Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License. You are not responsible
-for enforcing compliance by third parties with this License.
-
- An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations. If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
- You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License. For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
- 11. Patents.
-
- A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based. The
-work thus licensed is called the contributor's "contributor version".
-
- A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version. For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
- Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
- In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement). To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
- If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients. "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
- If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
- A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License. You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
- Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
- 12. No Surrender of Others' Freedom.
-
- If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all. For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
- 13. Remote Network Interaction; Use with the GNU General Public License.
-
- Notwithstanding any other provision of this License, if you modify the
-Program, your modified version must prominently offer all users
-interacting with it remotely through a computer network (if your version
-supports such interaction) an opportunity to receive the Corresponding
-Source of your version by providing access to the Corresponding Source
-from a network server at no charge, through some standard or customary
-means of facilitating copying of software. This Corresponding Source
-shall include the Corresponding Source for any work covered by version 3
-of the GNU General Public License that is incorporated pursuant to the
-following paragraph.
-
- Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU General Public License into a single
-combined work, and to convey the resulting work. The terms of this
-License will continue to apply to the part which is the covered work,
-but the work with which it is combined will remain governed by version
-3 of the GNU General Public License.
-
- 14. Revised Versions of this License.
-
- The Free Software Foundation may publish revised and/or new versions of
-the GNU Affero General Public License from time to time. Such new versions
-will be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Program specifies that a certain numbered version of the GNU Affero General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation. If the Program does not specify a version number of the
-GNU Affero General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
- If the Program specifies that a proxy can decide which future
-versions of the GNU Affero General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
- Later license versions may give you additional or different
-permissions. However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
- 15. Disclaimer of Warranty.
-
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. Limitation of Liability.
-
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
- 17. Interpretation of Sections 15 and 16.
-
- If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-Also add information on how to contact you by electronic and paper mail.
-
- If your software can interact with users remotely through a computer
-network, you should also make sure that it provides a way for users to
-get its source. For example, if your program is a web application, its
-interface could display a "Source" link that leads users to an archive
-of the code. There are many ways you could offer source, and different
-solutions will be better for different programs; see section 13 for the
-specific requirements.
-
- You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU AGPL, see
-<http://www.gnu.org/licenses/>.
diff --git a/user_persona/README b/user_persona/README
deleted file mode 100644
index 81ddc8e1c..000000000
--- a/user_persona/README
+++ /dev/null
@@ -1,42 +0,0 @@
-This application is distributed WITHOUT ANY WARRANTY; without even the implied
-warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-
-Your feedback is appreciated.
-
-Prerequisite:
-ownCloud 5+
-php-curl extension
-
-Installation:
-Upload the user_persona directory under the 'apps' directory of your ownCloud.
-Navigate to the 'Apps' page in Admin, click the 'Mozilla Persona user backend' in the
-application list. Then click the 'Enable' button.
-
-Configuration:
-1. Navigate to Admin page.
-2. Choose the action that should be performed if there are several matching users
-found on login.
-3. Adjust CSP header sent by ownCloud core in order to allow js execution from
-login.persona.org domain:
- a. open config/config.php
-
- b. if you have no 'custom_csp_policy' entry there find the line
- $CONFIG = array (
- and add after it:
- 'custom_csp_policy' =>
- "default-src 'self'; script-src 'self' login.persona.org 'unsafe-eval'; style-src 'self' 'unsafe-inline'; frame-src *; img-src *; font-src 'self' data:; media-src *",
-
- c. if you already have 'custom_csp_policy' entry, change its value by adding
- login.persona.org
- after
- script-src 'self'
-
-
-
-Usage:
-Register at https://persona.org/ and add any of your email addresses.
-
-Navigate to the 'Personal' page in your ownCloud. Enter the email address
-you connected to Persona to the password recovery input.
-
diff --git a/user_persona/ajax/save.php b/user_persona/ajax/save.php
deleted file mode 100644
index b3aa0e039..000000000
--- a/user_persona/ajax/save.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-
-/**
- * ownCloud - Persona plugin
- *
- * @author Victor Dubiniuk
- * @copyright 2012-2013 Victor Dubiniuk victor.dubiniuk@gmail.com
- *
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- */
-namespace OCA\User_persona;
-
-\OCP\User::checkAdminUser();
-
-$policy = intval(@$_POST['policy']);
-Policy::setSystemPolicy($policy);
diff --git a/user_persona/appinfo/app.php b/user_persona/appinfo/app.php
deleted file mode 100644
index 1db567f4f..000000000
--- a/user_persona/appinfo/app.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
-/**
- * ownCloud - Persona plugin
- *
- * @author Victor Dubiniuk
- * @copyright 2012-2013 Victor Dubiniuk victor.dubiniuk@gmail.com
- *
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- */
-namespace OCA\User_persona;
-
-class App{
- const APP_ID = 'user_persona';
- const APP_PATH = 'user_persona/';
-
- public static function init(){
- //check if curl extension installed
- if (!in_array('curl', get_loaded_extensions())) {
- \OCP\Util::writeLog(self::APP_ID, 'This app needs cUrl PHP extension', \OCP\Util::DEBUG);
- return false;
- }
-
- \OC::$CLASSPATH['OCA\User_persona\Policy'] = self::APP_PATH . 'lib/policy.php';
- \OCP\App::registerAdmin(self::APP_ID, 'settings');
-
- if (!\OCP\User::isLoggedIn()) {
- \OC::$CLASSPATH['OCA\User_persona\Validator'] = self::APP_PATH . 'lib/validator.php';
- \OC::$CLASSPATH['OC_USER_PERSONA'] = self::APP_PATH . 'user_persona.php';
-
- \OC_User::useBackend('persona');
- \OCP\Util::connectHook('OC_User', 'post_login', "OCA\User_persona\Validator", "postlogin_hook");
- \OCP\Util::addScript(self::APP_ID, 'utils');
- }
- }
-}
-
-if (\OCP\App::isEnabled(App::APP_ID)) {
- App::init();
-}
diff --git a/user_persona/appinfo/info.xml b/user_persona/appinfo/info.xml
deleted file mode 100644
index 6173ae38c..000000000
--- a/user_persona/appinfo/info.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0"?>
-<info>
- <id>user_persona</id>
- <name>Mozilla Persona user backend</name>
- <description>Allow login with Mozilla Persona (former browserId). Please check README otherwise it won't work ;) </description>
- <version>0.3.1</version>
- <licence>AGPL</licence>
- <author>Victor Dubiniuk</author>
- <requiremin>5.0</requiremin>
- <types>
- <authentication />
- <prelogin />
- </types>
-</info>
-
diff --git a/user_persona/changelog b/user_persona/changelog
deleted file mode 100644
index 72c9f0fc4..000000000
--- a/user_persona/changelog
+++ /dev/null
@@ -1,11 +0,0 @@
-v0.3.1
-* Owncloud 5.x support
-* Switch to Mozilla Persona
-v0.3
-* Refactored core
-v0.2
-* Multiple emails handling
-* SSL fix
-* Strict notice fix
-v0.1
-* BrowserID support \ No newline at end of file
diff --git a/user_persona/img/sign_in_blue.png b/user_persona/img/sign_in_blue.png
deleted file mode 100644
index 919a5c7a3..000000000
--- a/user_persona/img/sign_in_blue.png
+++ /dev/null
Binary files differ
diff --git a/user_persona/js/settings.js b/user_persona/js/settings.js
deleted file mode 100644
index 67858364d..000000000
--- a/user_persona/js/settings.js
+++ /dev/null
@@ -1,8 +0,0 @@
-$(document).ready(function(){
- $('#mozilla-persona-policy').change(function(){
- $.post(OC.filePath('user_persona', 'ajax', 'save.php'),
- { policy : $(this).val()},
- function(){}
- )
- });
-}); \ No newline at end of file
diff --git a/user_persona/js/utils.js b/user_persona/js/utils.js
deleted file mode 100644
index 3296e0478..000000000
--- a/user_persona/js/utils.js
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- * ownCloud - Persona plugin
- *
- * @author Victor Dubiniuk
- * @copyright 2012-2013 Victor Dubiniuk victor.dubiniuk@gmail.com
- *
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- */
-
-(function() {
- var Persona = document.createElement('script');
- Persona.type = 'text/javascript';
- Persona.async = true;
- Persona.src = 'https://login.persona.org/include.js';
- (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(Persona);
-})();
-
-var PersonaAuth = {
- gotAssertion : function(assertion){
- if (assertion !== null) {
- $.post(
- 'index.php',
- {
- 'authService' : 'MozillaPersona',
- 'user' : $('#user').val(),
- 'password' : assertion,
- sectoken : $('#sectoken').val()
- },
- PersonaAuth.authResponse
- );
- }
- },
- authResponse : function(data){
- if (data && data.status=='success'){
- //Logged in
- if (data.msg && data.msg=='Access granted'){
- window.location.reload();
- return;
- //List of users arrived
- } else if (data.list){
- var list = data.list || [];
- var offset = $('#login-persona').offset();
- $('<div id="hint-persona"></div>').css({
- position:'absolute',
- top:offset.top,
- left:offset.left + $('#login-persona').width(),
- background:'#ccc',
- padding:'10px'
- }).appendTo('body');
- for (var i=0;i<list.length;i++){
- $('<a href="#">'+list[i]+'</a><br />').appendTo($('#hint-persona'));
- }
- $('#hint-persona a').click(PersonaAuth.loginAs);
- }
- //Unknown reponse - login failed
- } else {
- OC.dialogs.alert(t('user_persona', 'Please try different method.'), t('user_persona', 'Failed to Login with Mozilla Persona'));
- }
- },
- loginAs : function(event){
- event.preventDefault();
- $('#user').val(this.innerHTML);
- $('#user').trigger('keydown');
- $('#hint-persona').remove();
- $('#login-persona').trigger('click');
- return false;
- }
-};
-
-$(document).ready(function(){
- var loginMsg = t('user_persona', 'Login with Mozilla Persona');
- $('<img id="login-persona" src="' + OC.imagePath('user_persona', 'sign_in_blue.png') + '" title="'+ loginMsg +'" alt="'+ loginMsg +'" />').css(
- {
- cursor : 'pointer',
- 'float' : 'right'
- }).appendTo('form');
-
- $('#login-persona').click(function() {
- navigator.id.get(PersonaAuth.gotAssertion);
- return false;
- });
-});
diff --git a/user_persona/lib/cacert.pem b/user_persona/lib/cacert.pem
deleted file mode 100644
index 1fccb3ddc..000000000
--- a/user_persona/lib/cacert.pem
+++ /dev/null
@@ -1,3331 +0,0 @@
-##
-## ca-bundle.crt -- Bundle of CA Root Certificates
-##
-## Certificate data from Mozilla as of: Wed Apr 25 15:02:13 2012
-##
-## This is a bundle of X.509 certificates of public Certificate Authorities
-## (CA). These were automatically extracted from Mozilla's root certificates
-## file (certdata.txt). This file can be found in the mozilla source tree:
-## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1
-##
-## It contains the certificates in PEM format and therefore
-## can be directly used with curl / libcurl / php_curl, or with
-## an Apache+mod_ssl webserver for SSL client authentication.
-## Just configure this file as the SSLCACertificateFile.
-##
-
-# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.83 $ $Date: 2012/04/25 14:49:29 $
-
-GTE CyberTrust Global Root
-==========================
------BEGIN CERTIFICATE-----
-MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg
-Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG
-A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz
-MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL
-Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0
-IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u
-sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql
-HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID
-AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW
-M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF
-NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
------END CERTIFICATE-----
-
-Thawte Server CA
-================
------BEGIN CERTIFICATE-----
-MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
-DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
-dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE
-AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j
-b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV
-BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u
-c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG
-A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0
-ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl
-/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7
-1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR
-MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J
-GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ
-GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc=
------END CERTIFICATE-----
-
-Thawte Premium Server CA
-========================
------BEGIN CERTIFICATE-----
-MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT
-DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
-dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE
-AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl
-ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT
-AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU
-VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2
-aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ
-cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2
-aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh
-Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/
-qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm
-SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf
-8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t
-UCemDaYj+bvLpgcUQg==
------END CERTIFICATE-----
-
-Equifax Secure CA
-=================
------BEGIN CERTIFICATE-----
-MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE
-ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
-MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT
-B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB
-nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR
-fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW
-8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG
-A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE
-CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG
-A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS
-spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB
-Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961
-zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB
-BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95
-70+sB3c4
------END CERTIFICATE-----
-
-Digital Signature Trust Co. Global CA 1
-=======================================
------BEGIN CERTIFICATE-----
-MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
-ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy
-MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
-IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA
-A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE
-NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i
-o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
-BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
-dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
-IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY
-MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM
-BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
-ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq
-kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4
-RbyhkwS7hp86W0N6w4pl
------END CERTIFICATE-----
-
-Digital Signature Trust Co. Global CA 3
-=======================================
------BEGIN CERTIFICATE-----
-MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
-ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy
-MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
-IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA
-A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD
-VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS
-xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
-BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
-dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
-IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY
-MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM
-BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
-AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi
-up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1
-mPnHfxsb1gYgAlihw6ID
------END CERTIFICATE-----
-
-Verisign Class 3 Public Primary Certification Authority
-=======================================================
------BEGIN CERTIFICATE-----
-MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx
-FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
-IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow
-XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
-IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
-f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
-hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA
-TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah
-WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf
-Tqj/ZA1k
------END CERTIFICATE-----
-
-Verisign Class 3 Public Primary Certification Authority - G2
-============================================================
------BEGIN CERTIFICATE-----
-MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
-MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
-eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
-biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
-dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
-MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
-eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
-biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
-dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO
-FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71
-lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB
-MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT
-1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD
-Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9
------END CERTIFICATE-----
-
-GlobalSign Root CA
-==================
------BEGIN CERTIFICATE-----
-MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
-GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
-b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
-BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
-VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
-DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
-THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
-Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
-c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
-gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
-AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
-Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
-j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
-hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
-X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
------END CERTIFICATE-----
-
-GlobalSign Root CA - R2
-=======================
------BEGIN CERTIFICATE-----
-MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
-YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
-bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
-aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
-bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
-ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
-s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
-S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
-TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
-ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
-FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
-YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
-BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
-9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
-01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
-9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
-TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
------END CERTIFICATE-----
-
-ValiCert Class 1 VA
-===================
------BEGIN CERTIFICATE-----
-MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
-b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
-YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
-bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy
-MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
-d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg
-UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
-LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi
-GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm
-DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG
-lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX
-icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP
-Orf1LXLI
------END CERTIFICATE-----
-
-ValiCert Class 2 VA
-===================
------BEGIN CERTIFICATE-----
-MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
-b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
-YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
-bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
-MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
-d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg
-UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
-LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC
-CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf
-ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ
-SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV
-UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8
-W9ViH0Pd
------END CERTIFICATE-----
-
-RSA Root Certificate 1
-======================
------BEGIN CERTIFICATE-----
-MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
-b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
-YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
-bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
-MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
-d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg
-UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
-LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td
-3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H
-BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs
-3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF
-V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r
-on+jjBXu
------END CERTIFICATE-----
-
-Verisign Class 3 Public Primary Certification Authority - G3
-============================================================
------BEGIN CERTIFICATE-----
-MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
-UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
-cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
-IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
-CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
-dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
-cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
-Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
-EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
-cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
-EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
-055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
-ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
-j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
-/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
-xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
-t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
------END CERTIFICATE-----
-
-Verisign Class 4 Public Primary Certification Authority - G3
-============================================================
------BEGIN CERTIFICATE-----
-MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
-UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
-cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
-IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
-CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
-dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
-cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg
-Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS
-tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM
-8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW
-Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX
-Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
-j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt
-mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
-fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd
-RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG
-UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
------END CERTIFICATE-----
-
-Entrust.net Secure Server CA
-============================
------BEGIN CERTIFICATE-----
-MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV
-BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg
-cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl
-ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv
-cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG
-A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi
-eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p
-dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ
-aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5
-gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw
-ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw
-CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l
-dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
-bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl
-cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
-dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw
-NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow
-HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA
-BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN
-Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9
-n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
------END CERTIFICATE-----
-
-Entrust.net Premium 2048 Secure Server CA
-=========================================
------BEGIN CERTIFICATE-----
-MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
-ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
-bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
-BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
-NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
-d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
-MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
-ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
-Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
-hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
-nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
-VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC
-AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER
-gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B
-AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo
-oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS
-o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z
-2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX
-OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ==
------END CERTIFICATE-----
-
-Baltimore CyberTrust Root
-=========================
------BEGIN CERTIFICATE-----
-MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
-ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
-ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
-SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
-dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
-uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
-UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
-G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
-XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
-l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
-VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
-BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
-cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
-hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
-Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
-RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
------END CERTIFICATE-----
-
-Equifax Secure Global eBusiness CA
-==================================
------BEGIN CERTIFICATE-----
-MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
-RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp
-bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx
-HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds
-b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV
-PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN
-qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn
-hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j
-BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs
-MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN
-I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY
-NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
------END CERTIFICATE-----
-
-Equifax Secure eBusiness CA 1
-=============================
------BEGIN CERTIFICATE-----
-MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
-RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB
-LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE
-ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz
-IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ
-1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a
-IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk
-MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW
-Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF
-AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5
-lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+
-KpYrtWKmpj29f5JZzVoqgrI3eQ==
------END CERTIFICATE-----
-
-Equifax Secure eBusiness CA 2
-=============================
------BEGIN CERTIFICATE-----
-MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE
-ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y
-MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT
-DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB
-nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn
-2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5
-BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG
-A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx
-JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG
-A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e
-uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB
-Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1
-jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia
-78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm
-V+GRMOrN
------END CERTIFICATE-----
-
-AddTrust Low-Value Services Root
-================================
------BEGIN CERTIFICATE-----
-MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
-QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU
-cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw
-CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO
-ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB
-AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6
-54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr
-oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1
-Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui
-GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w
-HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD
-AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT
-RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw
-HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt
-ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph
-iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
-eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr
-mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj
-ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
------END CERTIFICATE-----
-
-AddTrust External Root
-======================
------BEGIN CERTIFICATE-----
-MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
-QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
-VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
-NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
-cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
-Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
-+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
-Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
-aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
-2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
-7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
-BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
-VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
-VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
-IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
-j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
-6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
-e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
-G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
------END CERTIFICATE-----
-
-AddTrust Public Services Root
-=============================
------BEGIN CERTIFICATE-----
-MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
-QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU
-cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ
-BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l
-dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu
-nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i
-d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG
-Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw
-HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G
-A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
-/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux
-FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G
-A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4
-JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL
-+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
-GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9
-Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H
-EufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
------END CERTIFICATE-----
-
-AddTrust Qualified Certificates Root
-====================================
------BEGIN CERTIFICATE-----
-MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
-QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU
-cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx
-CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ
-IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG
-9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx
-64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3
-KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o
-L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR
-wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU
-MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/
-BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE
-BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y
-azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD
-ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG
-GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
-dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze
-RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB
-iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=
------END CERTIFICATE-----
-
-Entrust Root Certification Authority
-====================================
------BEGIN CERTIFICATE-----
-MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
-BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
-b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
-A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
-MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
-MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
-Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
-dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
-A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
-Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
-j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
-rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
-DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
-MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
-hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
-A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
-Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
-v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
-W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
-tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
------END CERTIFICATE-----
-
-RSA Security 2048 v3
-====================
------BEGIN CERTIFICATE-----
-MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK
-ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy
-MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb
-BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7
-Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb
-WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH
-KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP
-+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/
-MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E
-FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY
-v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj
-0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj
-VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395
-nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA
-pKnXwiJPZ9d37CAFYd4=
------END CERTIFICATE-----
-
-GeoTrust Global CA
-==================
------BEGIN CERTIFICATE-----
-MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
-Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw
-MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
-LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
-CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo
-BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet
-8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc
-T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU
-vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD
-AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk
-DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q
-zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4
-d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2
-mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p
-XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
-Mw==
------END CERTIFICATE-----
-
-GeoTrust Global CA 2
-====================
------BEGIN CERTIFICATE-----
-MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
-R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw
-MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
-LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/
-NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k
-LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA
-Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b
-HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF
-MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH
-K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7
-srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh
-ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL
-OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC
-x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF
-H4z1Ir+rzoPz4iIprn2DQKi6bA==
------END CERTIFICATE-----
-
-GeoTrust Universal CA
-=====================
------BEGIN CERTIFICATE-----
-MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
-R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1
-MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu
-Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
-ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t
-JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e
-RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs
-7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d
-8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V
-qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga
-Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB
-Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu
-KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08
-ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0
-XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB
-hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
-aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2
-qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL
-oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK
-xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF
-KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2
-DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK
-xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU
-p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI
-P/rmMuGNG2+k5o7Y+SlIis5z/iw=
------END CERTIFICATE-----
-
-GeoTrust Universal CA 2
-=======================
------BEGIN CERTIFICATE-----
-MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
-R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0
-MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg
-SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA
-A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0
-DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17
-j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q
-JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a
-QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2
-WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP
-20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn
-ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC
-SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG
-8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2
-+/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E
-BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
-dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ
-4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+
-mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq
-A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg
-Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP
-pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d
-FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp
-gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm
-X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
------END CERTIFICATE-----
-
-America Online Root Certification Authority 1
-=============================================
------BEGIN CERTIFICATE-----
-MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
-QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
-Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG
-A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
-T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG
-v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z
-DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh
-sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP
-8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T
-AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z
-o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf
-GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF
-VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft
-3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g
-Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds
-sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7
------END CERTIFICATE-----
-
-America Online Root Certification Authority 2
-=============================================
------BEGIN CERTIFICATE-----
-MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
-QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
-Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG
-A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
-T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD
-ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en
-fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8
-f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO
-qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN
-RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0
-gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn
-6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid
-FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6
-Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj
-B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op
-aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE
-AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY
-T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p
-+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg
-JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy
-zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO
-ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh
-1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf
-GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff
-Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP
-cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk=
------END CERTIFICATE-----
-
-Visa eCommerce Root
-===================
------BEGIN CERTIFICATE-----
-MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG
-EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug
-QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2
-WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm
-VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
-bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL
-F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b
-RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0
-TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI
-/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs
-GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
-MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc
-CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW
-YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz
-zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu
-YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
-398znM/jra6O1I7mT1GvFpLgXPYHDw==
------END CERTIFICATE-----
-
-Certum Root CA
-==============
------BEGIN CERTIFICATE-----
-MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK
-ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla
-Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u
-by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x
-wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL
-kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ
-89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K
-Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P
-NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq
-hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+
-GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg
-GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/
-0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS
-qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==
------END CERTIFICATE-----
-
-Comodo AAA Services root
-========================
------BEGIN CERTIFICATE-----
-MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
-R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
-TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
-MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
-c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
-BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
-C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
-i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
-Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
-Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
-Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
-BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
-cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
-LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
-7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
-Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
-8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
-12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
------END CERTIFICATE-----
-
-Comodo Secure Services root
-===========================
------BEGIN CERTIFICATE-----
-MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
-R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
-TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw
-MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu
-Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi
-BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
-ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP
-9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc
-rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC
-oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V
-p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E
-FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
-gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj
-YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm
-aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm
-4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
-Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL
-DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw
-pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H
-RR3B7Hzs/Sk=
------END CERTIFICATE-----
-
-Comodo Trusted Services root
-============================
------BEGIN CERTIFICATE-----
-MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
-R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
-TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw
-MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h
-bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw
-IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7
-3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y
-/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6
-juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS
-ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud
-DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
-/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp
-ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl
-cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw
-uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
-pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA
-BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l
-R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O
-9y5Xt5hwXsjEeLBi
------END CERTIFICATE-----
-
-QuoVadis Root CA
-================
------BEGIN CERTIFICATE-----
-MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
-ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
-eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
-MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
-cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
-EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
-J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
-F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
-YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
-AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
-PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
-ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
-MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
-YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
-ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
-Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
-Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
-BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
-FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
-tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
-fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
-LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
-gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
-5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
-5nrQNiOKSnQ2+Q==
------END CERTIFICATE-----
-
-QuoVadis Root CA 2
-==================
------BEGIN CERTIFICATE-----
-MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
-EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx
-ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
-aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC
-DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6
-XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk
-lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB
-lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy
-lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt
-66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn
-wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh
-D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy
-BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie
-J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud
-DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU
-a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
-ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv
-Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3
-UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm
-VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK
-+JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW
-IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1
-WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X
-f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II
-4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8
-VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
------END CERTIFICATE-----
-
-QuoVadis Root CA 3
-==================
------BEGIN CERTIFICATE-----
-MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
-EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
-OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
-aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
-DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
-DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
-KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
-DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
-BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
-p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
-nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
-MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
-Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
-uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
-BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
-YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
-aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
-BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
-VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
-ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
-AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
-qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
-hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
-POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
-Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
-8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
-bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
-g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
-vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
-qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
------END CERTIFICATE-----
-
-Security Communication Root CA
-==============================
------BEGIN CERTIFICATE-----
-MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
-U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
-HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
-U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
-ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
-8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
-DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
-5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
-DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
-JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
-DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
-0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
-mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
-s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
-6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
-FL39vmwLAw==
------END CERTIFICATE-----
-
-Sonera Class 2 Root CA
-======================
------BEGIN CERTIFICATE-----
-MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
-U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
-NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
-IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
-/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
-dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
-f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
-tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
-nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
-XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
-0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
-cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
-Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
-EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
-llpwrN9M
------END CERTIFICATE-----
-
-Staat der Nederlanden Root CA
-=============================
------BEGIN CERTIFICATE-----
-MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE
-ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g
-Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w
-HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh
-bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt
-vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P
-jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca
-C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth
-vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6
-22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV
-HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v
-dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN
-BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR
-EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw
-MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y
-nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR
-iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
------END CERTIFICATE-----
-
-TDC Internet Root CA
-====================
------BEGIN CERTIFICATE-----
-MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE
-ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx
-NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu
-ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j
-xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL
-znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc
-5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6
-otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI
-AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM
-VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM
-MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC
-AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe
-UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G
-CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m
-gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+
-2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb
-O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU
-Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l
------END CERTIFICATE-----
-
-TDC OCES Root CA
-================
------BEGIN CERTIFICATE-----
-MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJESzEMMAoGA1UE
-ChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5
-MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIB
-IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuH
-nEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0
-zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvV
-iGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBde
-dObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO
-3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB
-5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5k
-ay9yZXBvc2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBm
-cmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4xLiBDZXJ0aWZp
-Y2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x
-LjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEM
-MAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm
-aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy
-MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647
-+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6
-NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4
-A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYsc
-A+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9
-AOoBmbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1
-AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2LqL19iUw==
------END CERTIFICATE-----
-
-UTN DATACorp SGC Root CA
-========================
------BEGIN CERTIFICATE-----
-MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE
-BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
-IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ
-BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa
-MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w
-HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy
-dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys
-raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo
-wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA
-9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv
-33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud
-DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9
-BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD
-LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3
-DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft
-Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0
-I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx
-EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP
-DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI
------END CERTIFICATE-----
-
-UTN USERFirst Hardware Root CA
-==============================
------BEGIN CERTIFICATE-----
-MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE
-BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
-IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd
-BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx
-OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0
-eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz
-ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3
-DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI
-wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd
-tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8
-i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf
-Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw
-gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF
-lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF
-UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF
-BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
-//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW
-XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2
-lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn
-iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67
-nfhmqA==
------END CERTIFICATE-----
-
-Camerfirma Chambers of Commerce Root
-====================================
------BEGIN CERTIFICATE-----
-MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
-QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
-ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx
-NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp
-cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn
-MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC
-AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU
-xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH
-NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW
-DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV
-d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud
-EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v
-cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P
-AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh
-bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD
-VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
-aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi
-fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD
-L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN
-UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n
-ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1
-erfutGWaIZDgqtCYvDi1czyL+Nw=
------END CERTIFICATE-----
-
-Camerfirma Global Chambersign Root
-==================================
------BEGIN CERTIFICATE-----
-MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
-QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
-ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx
-NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt
-YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg
-MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw
-ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J
-1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O
-by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl
-6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c
-8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/
-BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j
-aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B
-Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj
-aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y
-ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
-bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA
-PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y
-gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ
-PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4
-IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes
-t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
------END CERTIFICATE-----
-
-NetLock Notary (Class A) Root
-=============================
------BEGIN CERTIFICATE-----
-MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI
-EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
-dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j
-ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX
-DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH
-EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD
-VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz
-cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM
-D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ
-z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC
-/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7
-tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6
-4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG
-A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC
-Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv
-bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu
-IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn
-LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0
-ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz
-IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh
-IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu
-b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh
-bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg
-Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp
-bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5
-ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP
-ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB
-CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr
-KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM
-8CgHrTwXZoi1/baI
------END CERTIFICATE-----
-
-NetLock Business (Class B) Root
-===============================
------BEGIN CERTIFICATE-----
-MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT
-CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
-BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg
-VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD
-VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv
-bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg
-VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
-iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S
-o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr
-1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV
-HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ
-RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh
-dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0
-ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv
-c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg
-YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh
-c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz
-Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA
-bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl
-IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2
-YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj
-cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM
-43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR
-stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI
------END CERTIFICATE-----
-
-NetLock Express (Class C) Root
-==============================
------BEGIN CERTIFICATE-----
-MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT
-CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
-BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD
-KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ
-BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
-dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j
-ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB
-jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z
-W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63
-euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw
-DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN
-RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn
-YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB
-IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i
-aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0
-ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs
-ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo
-dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y
-emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k
-IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ
-UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg
-YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2
-xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW
-gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A==
------END CERTIFICATE-----
-
-XRamp Global CA Root
-====================
------BEGIN CERTIFICATE-----
-MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
-BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
-dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
-dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
-HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
-U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
-dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
-IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
-foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
-zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
-AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
-xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
-EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
-oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
-AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
-/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
-qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
-nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
-8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
------END CERTIFICATE-----
-
-Go Daddy Class 2 CA
-===================
------BEGIN CERTIFICATE-----
-MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
-VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
-ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
-A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
-RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
-ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
-2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
-qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
-YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
-vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
-BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
-atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
-MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
-A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
-PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
-I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
-HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
-Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
-vZ8=
------END CERTIFICATE-----
-
-Starfield Class 2 CA
-====================
------BEGIN CERTIFICATE-----
-MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
-U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
-Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
-MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
-A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
-SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
-bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
-JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
-epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
-F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
-MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
-hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
-bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
-QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
-afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
-PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
-xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
-KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
-QBFGmh95DmK/D5fs4C8fF5Q=
------END CERTIFICATE-----
-
-StartCom Certification Authority
-================================
------BEGIN CERTIFICATE-----
-MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
-U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
-ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
-NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
-LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
-U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
-ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
-o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
-Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
-eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
-2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
-6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
-osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
-untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
-UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
-37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
-FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0
-Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj
-YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH
-AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw
-Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg
-U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5
-LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl
-cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh
-cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT
-dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC
-AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh
-3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm
-vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk
-fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3
-fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ
-EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
-yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl
-1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/
-lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro
-g14=
------END CERTIFICATE-----
-
-Taiwan GRCA
-===========
------BEGIN CERTIFICATE-----
-MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG
-EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X
-DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv
-dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD
-ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN
-w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5
-BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O
-1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO
-htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov
-J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7
-Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t
-B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB
-O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8
-lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV
-HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2
-09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
-TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj
-Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2
-Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU
-D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz
-DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk
-Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk
-7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ
-CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy
-+fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS
------END CERTIFICATE-----
-
-Firmaprofesional Root CA
-========================
------BEGIN CERTIFICATE-----
-MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT
-GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp
-Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA
-ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL
-MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT
-OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2
-ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB
-AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V
-j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH
-lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf
-3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8
-NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww
-KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG
-AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud
-DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD
-ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq
-u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf
-wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm
-7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG
-VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA=
------END CERTIFICATE-----
-
-Wells Fargo Root CA
-===================
------BEGIN CERTIFICATE-----
-MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV
-BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv
-cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
-MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl
-bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv
-MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX
-x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3
-E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5
-OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j
-sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj
-YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF
-BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD
-ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv
-m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R
-OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx
-x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023
-tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s=
------END CERTIFICATE-----
-
-Swisscom Root CA 1
-==================
------BEGIN CERTIFICATE-----
-MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG
-EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy
-dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4
-MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln
-aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC
-IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM
-MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF
-NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe
-AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC
-b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn
-7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN
-cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp
-WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5
-haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY
-MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw
-HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j
-BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9
-MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn
-jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ
-MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H
-VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl
-vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl
-OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3
-1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq
-nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy
-x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW
-NY6E0F/6MBr1mmz0DlP5OlvRHA==
------END CERTIFICATE-----
-
-DigiCert Assured ID Root CA
-===========================
------BEGIN CERTIFICATE-----
-MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
-EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
-IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
-MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
-ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
-ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
-9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
-UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
-/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
-oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
-GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
-66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
-hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
-EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
-SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
-8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
-+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
------END CERTIFICATE-----
-
-DigiCert Global Root CA
-=======================
------BEGIN CERTIFICATE-----
-MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
-EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
-HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
-MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
-dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
-hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
-TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
-BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
-4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
-7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
-o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
-8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
-BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
-EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
-tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
-UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
-CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
------END CERTIFICATE-----
-
-DigiCert High Assurance EV Root CA
-==================================
------BEGIN CERTIFICATE-----
-MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
-EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
-KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
-MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
-MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
-Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
-Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
-OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
-MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
-NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
-h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
-Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
-JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
-V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
-myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
-mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
-vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
------END CERTIFICATE-----
-
-Certplus Class 2 Primary CA
-===========================
------BEGIN CERTIFICATE-----
-MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE
-BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN
-OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy
-dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
-ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR
-5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ
-Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO
-YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e
-e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME
-CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ
-YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t
-L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD
-P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R
-TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+
-7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW
-//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
-l7+ijrRU
------END CERTIFICATE-----
-
-DST Root CA X3
-==============
------BEGIN CERTIFICATE-----
-MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
-ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
-DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
-cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
-rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
-UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
-xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
-utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
-AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
-MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
-dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
-GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
-RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
-fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
------END CERTIFICATE-----
-
-DST ACES CA X6
-==============
------BEGIN CERTIFICATE-----
-MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG
-EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT
-MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha
-MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE
-CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI
-DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa
-pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow
-GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy
-MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud
-EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu
-Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy
-dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU
-CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2
-5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t
-Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
-nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs
-vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3
-oKfN5XozNmr6mis=
------END CERTIFICATE-----
-
-TURKTRUST Certificate Services Provider Root 1
-==============================================
------BEGIN CERTIFICATE-----
-MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
-bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP
-MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0
-acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx
-MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg
-U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB
-TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC
-aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX
-yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i
-Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ
-8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4
-W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME
-BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46
-sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE
-q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy
-B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY
-nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H
------END CERTIFICATE-----
-
-TURKTRUST Certificate Services Provider Root 2
-==============================================
------BEGIN CERTIFICATE-----
-MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF
-bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
-MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
-QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN
-MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr
-dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G
-A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
-acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe
-LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI
-x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g
-QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr
-5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB
-AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G
-A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt
-Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4
-Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+
-hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P
-9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5
-UrbnBEI=
------END CERTIFICATE-----
-
-SwissSign Gold CA - G2
-======================
------BEGIN CERTIFICATE-----
-MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw
-EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN
-MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp
-c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B
-AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq
-t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C
-jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg
-vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF
-ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR
-AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend
-jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO
-peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR
-7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi
-GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw
-AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64
-OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
-L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm
-5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr
-44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf
-Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m
-Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp
-mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk
-vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf
-KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br
-NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj
-viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
------END CERTIFICATE-----
-
-SwissSign Silver CA - G2
-========================
------BEGIN CERTIFICATE-----
-MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT
-BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X
-DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3
-aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG
-9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644
-N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm
-+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH
-6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu
-MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h
-qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5
-FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs
-ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc
-celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X
-CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
-BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB
-tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
-cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P
-4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F
-kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L
-3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx
-/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa
-DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP
-e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu
-WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ
-DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub
-DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
------END CERTIFICATE-----
-
-GeoTrust Primary Certification Authority
-========================================
------BEGIN CERTIFICATE-----
-MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG
-EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD
-ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx
-CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ
-cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
-CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN
-b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9
-nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge
-RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt
-tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
-AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI
-hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K
-Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN
-NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa
-Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
-1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
------END CERTIFICATE-----
-
-thawte Primary Root CA
-======================
------BEGIN CERTIFICATE-----
-MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE
-BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
-aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
-cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3
-MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg
-SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv
-KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT
-FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs
-oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ
-1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc
-q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K
-aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p
-afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
-VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF
-AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
-uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
-xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89
-jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH
-z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
------END CERTIFICATE-----
-
-VeriSign Class 3 Public Primary Certification Authority - G5
-============================================================
------BEGIN CERTIFICATE-----
-MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
-BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
-ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
-IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
-ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
-yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
-biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
-dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
-YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
-j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
-Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
-Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
-fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
-BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
-Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
-aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
-SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
-X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
-KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
-Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
-ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
------END CERTIFICATE-----
-
-SecureTrust CA
-==============
------BEGIN CERTIFICATE-----
-MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
-EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
-dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
-BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
-ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
-OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
-DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
-GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
-01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
-ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
-BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
-aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
-KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
-SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
-mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
-nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
-3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
------END CERTIFICATE-----
-
-Secure Global CA
-================
------BEGIN CERTIFICATE-----
-MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
-EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
-bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
-MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
-Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
-YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
-bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
-8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
-HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
-0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
-EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
-oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
-MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
-OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
-CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
-3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
-f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
------END CERTIFICATE-----
-
-COMODO Certification Authority
-==============================
------BEGIN CERTIFICATE-----
-MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
-BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
-A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
-dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
-MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
-T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
-+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
-xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
-4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
-1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
-rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
-BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
-b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
-AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
-OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
-RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
-IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
-+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
------END CERTIFICATE-----
-
-Network Solutions Certificate Authority
-=======================================
------BEGIN CERTIFICATE-----
-MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
-EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
-IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
-MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
-MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
-jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
-aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
-crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
-/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
-AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
-BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
-bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
-A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
-4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
-GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
-wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
-ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
------END CERTIFICATE-----
-
-WellsSecure Public Root Certificate Authority
-=============================================
------BEGIN CERTIFICATE-----
-MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM
-F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw
-NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
-MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl
-bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD
-VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1
-iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13
-i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8
-bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB
-K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB
-AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu
-cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm
-lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB
-i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww
-GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
-Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI
-K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0
-bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj
-qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es
-E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ
-tylv2G0xffX8oRAHh84vWdw+WNs=
------END CERTIFICATE-----
-
-COMODO ECC Certification Authority
-==================================
------BEGIN CERTIFICATE-----
-MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
-R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
-ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
-dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
-GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
-Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
-b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
-4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
-wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
-BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
-FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
-U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
------END CERTIFICATE-----
-
-IGC/A
-=====
------BEGIN CERTIFICATE-----
-MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD
-VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE
-Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy
-MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI
-EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT
-STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB
-IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2
-TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW
-So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy
-HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd
-frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ
-tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB
-egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC
-iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK
-q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q
-MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg
-Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI
-lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF
-0mBWWg==
------END CERTIFICATE-----
-
-Security Communication EV RootCA1
-=================================
------BEGIN CERTIFICATE-----
-MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
-U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh
-dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE
-BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl
-Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO
-/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX
-WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z
-ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4
-bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK
-9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
-SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm
-iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG
-Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW
-mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW
-T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
------END CERTIFICATE-----
-
-OISTE WISeKey Global Root GA CA
-===============================
------BEGIN CERTIFICATE-----
-MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
-BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
-A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
-bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
-VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
-IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
-IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
-Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
-Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
-d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
-/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
-LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
-AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
-KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
-MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
-+vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
-hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
-okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
------END CERTIFICATE-----
-
-Microsec e-Szigno Root CA
-=========================
------BEGIN CERTIFICATE-----
-MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE
-BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL
-EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0
-MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz
-dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT
-GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
-AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG
-d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N
-oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc
-QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ
-PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb
-MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG
-IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD
-VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3
-LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A
-dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn
-AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA
-4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg
-AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA
-egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6
-Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO
-PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv
-c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h
-cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw
-IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT
-WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV
-MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER
-MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp
-Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal
-HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT
-nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE
-aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a
-86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK
-yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB
-S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=
------END CERTIFICATE-----
-
-Certigna
-========
------BEGIN CERTIFICATE-----
-MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
-EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
-MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
-Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
-XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
-GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
-ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
-DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
-Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
-tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
-BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
-SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
-hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
-ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
-PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
-1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
-WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
------END CERTIFICATE-----
-
-AC Ra\xC3\xADz Certic\xC3\xA1mara S.A.
-======================================
------BEGIN CERTIFICATE-----
-MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT
-AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg
-LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w
-HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+
-U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh
-IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B
-AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN
-yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU
-2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3
-4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP
-2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm
-8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf
-HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa
-Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK
-5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b
-czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
-AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g
-ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF
-BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug
-cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf
-AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX
-EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v
-/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3
-MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4
-3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk
-eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f
-/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h
-RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU
-Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ==
------END CERTIFICATE-----
-
-TC TrustCenter Class 2 CA II
-============================
------BEGIN CERTIFICATE-----
-MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
-REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
-IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw
-MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
-c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE
-AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw
-IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2
-xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ
-Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u
-SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB
-/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB
-7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
-Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
-cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
-SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
-TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G
-dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ
-KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj
-TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP
-JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk
-vQ==
------END CERTIFICATE-----
-
-TC TrustCenter Class 3 CA II
-============================
------BEGIN CERTIFICATE-----
-MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
-REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
-IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw
-MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
-c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE
-AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W
-yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo
-6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ
-uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk
-2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB
-/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB
-7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
-Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
-cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
-SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
-TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE
-O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8
-yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9
-IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal
-092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc
-5A==
------END CERTIFICATE-----
-
-TC TrustCenter Universal CA I
-=============================
------BEGIN CERTIFICATE-----
-MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC
-REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
-IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN
-MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg
-VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw
-JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC
-qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv
-xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw
-ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O
-gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j
-BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG
-1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy
-vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3
-ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT
-ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a
-7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY
------END CERTIFICATE-----
-
-Deutsche Telekom Root CA 2
-==========================
------BEGIN CERTIFICATE-----
-MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT
-RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG
-A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5
-MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G
-A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS
-b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5
-bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI
-KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY
-AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK
-Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV
-jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV
-HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr
-E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy
-zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8
-rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G
-dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
-Cm26OWMohpLzGITY+9HPBVZkVw==
------END CERTIFICATE-----
-
-ComSign Secured CA
-==================
------BEGIN CERTIFICATE-----
-MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE
-AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w
-NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD
-QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs
-49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH
-7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB
-kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1
-9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw
-AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t
-U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA
-j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC
-AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a
-BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp
-FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP
-51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz
-OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw==
------END CERTIFICATE-----
-
-Cybertrust Global Root
-======================
------BEGIN CERTIFICATE-----
-MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
-ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
-MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
-ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
-+Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
-0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
-AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
-89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
-8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
-BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
-MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
-A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
-lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
-5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
-hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
-X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
-WL1WMRJOEcgh4LMRkWXbtKaIOM5V
------END CERTIFICATE-----
-
-ePKI Root Certification Authority
-=================================
------BEGIN CERTIFICATE-----
-MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG
-EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg
-Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx
-MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq
-MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B
-AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs
-IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi
-lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv
-qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX
-12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O
-WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+
-ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao
-lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/
-vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi
-Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi
-MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
-ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0
-1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq
-KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV
-xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP
-NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r
-GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE
-xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx
-gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy
-sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD
-BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=
------END CERTIFICATE-----
-
-T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3
-=============================================================================================================================
------BEGIN CERTIFICATE-----
-MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH
-DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q
-aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry
-b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV
-BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg
-S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4
-MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl
-IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF
-n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl
-IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft
-dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl
-cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B
-AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO
-Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1
-xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR
-6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
-hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd
-BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
-MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4
-N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT
-y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh
-LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M
-dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=
------END CERTIFICATE-----
-
-Buypass Class 2 CA 1
-====================
------BEGIN CERTIFICATE-----
-MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
-QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2
-MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
-c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M
-cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83
-0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4
-0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R
-uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC
-MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P
-AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV
-1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt
-7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2
-fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w
-wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho
------END CERTIFICATE-----
-
-Buypass Class 3 CA 1
-====================
------BEGIN CERTIFICATE-----
-MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
-QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1
-MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
-c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx
-ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0
-n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia
-AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c
-1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC
-MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P
-AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7
-pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA
-EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5
-htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj
-el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915
------END CERTIFICATE-----
-
-EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1
-==========================================================================
------BEGIN CERTIFICATE-----
-MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF
-bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg
-QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe
-Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p
-ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt
-IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG
-SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by
-X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b
-gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr
-eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ
-TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy
-Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn
-uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI
-qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm
-ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0
-Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
-/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW
-Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t
-FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm
-zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k
-XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT
-bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU
-RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK
-1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt
-2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ
-Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9
-AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT
------END CERTIFICATE-----
-
-certSIGN ROOT CA
-================
------BEGIN CERTIFICATE-----
-MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
-VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
-Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
-CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
-JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
-rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
-ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
-0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
-AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
-Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
-AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
-SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
-x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
-vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
-TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
------END CERTIFICATE-----
-
-CNNIC ROOT
-==========
------BEGIN CERTIFICATE-----
-MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE
-ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw
-OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw
-ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD
-o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz
-VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT
-VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or
-czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK
-y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC
-wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S
-lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5
-Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM
-O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8
-BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2
-G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m
-mxE=
------END CERTIFICATE-----
-
-ApplicationCA - Japanese Government
-===================================
------BEGIN CERTIFICATE-----
-MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT
-SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw
-MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl
-cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
-CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4
-fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN
-wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE
-jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu
-nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU
-WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV
-BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD
-vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs
-o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g
-/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD
-io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW
-dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL
-rosot4LKGAfmt1t06SAZf7IbiVQ=
------END CERTIFICATE-----
-
-GeoTrust Primary Certification Authority - G3
-=============================================
------BEGIN CERTIFICATE-----
-MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE
-BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0
-IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy
-eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz
-NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo
-YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT
-LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j
-K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE
-c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C
-IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu
-dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC
-MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr
-2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9
-cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE
-Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
-AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s
-t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt
------END CERTIFICATE-----
-
-thawte Primary Root CA - G2
-===========================
------BEGIN CERTIFICATE-----
-MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC
-VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu
-IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg
-Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV
-MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG
-b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt
-IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS
-LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5
-8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
-mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN
-G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K
-rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
------END CERTIFICATE-----
-
-thawte Primary Root CA - G3
-===========================
------BEGIN CERTIFICATE-----
-MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE
-BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
-aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
-cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w
-ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
-d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD
-VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG
-A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At
-P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC
-+BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY
-7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW
-vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E
-BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ
-KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK
-A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
-t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC
-8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm
-er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=
------END CERTIFICATE-----
-
-GeoTrust Primary Certification Authority - G2
-=============================================
------BEGIN CERTIFICATE-----
-MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
-VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
-Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
-ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
-OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
-MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
-b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
-BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
-KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
-VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
-EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
-ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
-npaqBA+K
------END CERTIFICATE-----
-
-VeriSign Universal Root Certification Authority
-===============================================
------BEGIN CERTIFICATE-----
-MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
-BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
-ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
-IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
-IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
-UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
-cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
-IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
-1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
-MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
-9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
-AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
-tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
-CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
-a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
-DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
-Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
-Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
-P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
-wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
-mJO37M2CYfE45k+XmCpajQ==
------END CERTIFICATE-----
-
-VeriSign Class 3 Public Primary Certification Authority - G4
-============================================================
------BEGIN CERTIFICATE-----
-MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
-VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
-b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
-ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
-YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
-MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
-cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
-b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
-IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
-Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
-rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
-/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
-HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
-Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
-A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
-AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
------END CERTIFICATE-----
-
-NetLock Arany (Class Gold) Főtanúsítvány
-============================================
------BEGIN CERTIFICATE-----
-MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
-A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
-dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
-cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
-MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
-ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
-biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
-c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
-0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
-/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
-H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
-fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
-neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
-BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
-qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
-YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
-bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
-NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
-dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
------END CERTIFICATE-----
-
-Staat der Nederlanden Root CA - G2
-==================================
------BEGIN CERTIFICATE-----
-MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
-CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
-Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC
-TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
-ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ
-5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn
-vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj
-CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil
-e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR
-OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI
-CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65
-48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi
-trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737
-qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB
-AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC
-ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
-HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA
-A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz
-+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj
-f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN
-kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk
-CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF
-URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb
-CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h
-oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV
-IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm
-66+KAQ==
------END CERTIFICATE-----
-
-CA Disig
-========
------BEGIN CERTIFICATE-----
-MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK
-QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw
-MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz
-bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3
-DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm
-GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD
-Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo
-hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt
-ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w
-gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P
-AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz
-aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff
-ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa
-BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t
-WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3
-mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/
-CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K
-ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA
-4Z7CRneC9VkGjCFMhwnN5ag=
------END CERTIFICATE-----
-
-Juur-SK
-=======
------BEGIN CERTIFICATE-----
-MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA
-c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw
-DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG
-SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy
-aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf
-TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC
-+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw
-UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa
-Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF
-MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD
-HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh
-AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA
-cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr
-AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw
-cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE
-FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G
-A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo
-ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL
-abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678
-IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh
-Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2
-yyqcjg==
------END CERTIFICATE-----
-
-Hongkong Post Root CA 1
-=======================
------BEGIN CERTIFICATE-----
-MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
-DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
-NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
-IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
-ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
-auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
-qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
-V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
-HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
-h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
-l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
-IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
-T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
-c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
------END CERTIFICATE-----
-
-SecureSign RootCA11
-===================
------BEGIN CERTIFICATE-----
-MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi
-SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS
-b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw
-KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1
-cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL
-TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO
-wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq
-g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP
-O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA
-bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX
-t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh
-OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r
-bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ
-Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01
-y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
-lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
------END CERTIFICATE-----
-
-ACEDICOM Root
-=============
------BEGIN CERTIFICATE-----
-MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD
-T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4
-MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG
-A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF
-AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk
-WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD
-YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew
-MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb
-m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk
-HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT
-xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2
-3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9
-2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq
-TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz
-4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU
-9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv
-bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg
-aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP
-eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk
-zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1
-ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI
-KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq
-nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE
-I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp
-MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o
-tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA==
------END CERTIFICATE-----
-
-Verisign Class 3 Public Primary Certification Authority
-=======================================================
------BEGIN CERTIFICATE-----
-MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx
-FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
-IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow
-XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
-IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
-f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
-hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky
-CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX
-bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/
-D/xwzoiQ
------END CERTIFICATE-----
-
-Microsec e-Szigno Root CA 2009
-==============================
------BEGIN CERTIFICATE-----
-MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER
-MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv
-c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
-dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE
-BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt
-U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw
-DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA
-fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG
-0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA
-pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm
-1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC
-AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf
-QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE
-FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o
-lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX
-I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
-tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02
-yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
-LXpUq3DDfSJlgnCW
------END CERTIFICATE-----
-
-E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi
-===================================================
------BEGIN CERTIFICATE-----
-MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
-EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz
-ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3
-MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0
-cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u
-aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY
-8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y
-jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI
-JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk
-9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD
-AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG
-SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d
-F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq
-D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4
-Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq
-fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX
------END CERTIFICATE-----
-
-GlobalSign Root CA - R3
-=======================
------BEGIN CERTIFICATE-----
-MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv
-YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
-bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
-aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
-bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt
-iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ
-0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3
-rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl
-OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2
-xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
-FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7
-lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8
-EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E
-bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18
-YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
-kpeDMdmztcpHWD9f
------END CERTIFICATE-----
-
-TC TrustCenter Universal CA III
-===============================
------BEGIN CERTIFICATE-----
-MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC
-REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
-IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe
-Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU
-QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex
-KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB
-AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt
-QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO
-juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut
-CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1
-M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G
-A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
-BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA
-g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+
-KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK
-BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV
-CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq
-woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg==
------END CERTIFICATE-----
-
-Autoridad de Certificacion Firmaprofesional CIF A62634068
-=========================================================
------BEGIN CERTIFICATE-----
-MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
-BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
-MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
-QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
-NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
-Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
-B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
-7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
-ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
-plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
-MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
-LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
-bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
-vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
-EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
-DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
-cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
-bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
-ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
-51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
-R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
-T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
-Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
-osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
-crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
-saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
-KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
-6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
------END CERTIFICATE-----
-
-Izenpe.com
-==========
------BEGIN CERTIFICATE-----
-MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG
-EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz
-MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu
-QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ
-03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK
-ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU
-+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC
-PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT
-OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK
-F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK
-0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+
-0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB
-leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID
-AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+
-SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG
-NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
-MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
-BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l
-Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga
-kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q
-hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs
-g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5
-aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5
-nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC
-ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo
-Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z
-WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
------END CERTIFICATE-----
-
-Chambers of Commerce Root - 2008
-================================
------BEGIN CERTIFICATE-----
-MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD
-MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
-bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
-QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy
-Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl
-ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF
-EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl
-cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
-AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA
-XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj
-h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/
-ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk
-NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g
-D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331
-lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ
-0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
-ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2
-EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI
-G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ
-BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh
-bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh
-bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC
-CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH
-AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1
-wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH
-3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU
-RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6
-M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1
-YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF
-9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK
-zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG
-nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
-OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ
------END CERTIFICATE-----
-
-Global Chambersign Root - 2008
-==============================
------BEGIN CERTIFICATE-----
-MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD
-MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
-bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
-QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx
-NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg
-Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ
-QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
-aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf
-VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf
-XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0
-ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB
-/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA
-TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M
-H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe
-Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF
-HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
-wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB
-AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT
-BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE
-BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm
-aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm
-aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp
-1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0
-dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG
-/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6
-ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s
-dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg
-9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH
-foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du
-qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr
-P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq
-c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
-09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
------END CERTIFICATE-----
-
-Go Daddy Root Certificate Authority - G2
-========================================
------BEGIN CERTIFICATE-----
-MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
-B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
-MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
-MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
-b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
-A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
-9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
-+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
-fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
-NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
-MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
-BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
-vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
-5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
-N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
-LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
------END CERTIFICATE-----
-
-Starfield Root Certificate Authority - G2
-=========================================
------BEGIN CERTIFICATE-----
-MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
-B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
-b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
-eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
-DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
-VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
-dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
-W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
-bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
-N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
-ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
-JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
-TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
-4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
-F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
-pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
-c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
------END CERTIFICATE-----
-
-Starfield Services Root Certificate Authority - G2
-==================================================
------BEGIN CERTIFICATE-----
-MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
-B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
-b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
-IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
-BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
-dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
-Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
-h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
-hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
-LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
-rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
-AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
-SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
-E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
-xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
-iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
-YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
------END CERTIFICATE-----
-
-AffirmTrust Commercial
-======================
------BEGIN CERTIFICATE-----
-MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
-BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
-MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
-bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
-DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
-C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
-BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
-MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
-HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
-hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
-qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
-0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
-sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
------END CERTIFICATE-----
-
-AffirmTrust Networking
-======================
------BEGIN CERTIFICATE-----
-MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
-BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
-MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
-bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
-Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
-dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
-/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
-h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
-HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
-UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
-12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
-WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
-/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
------END CERTIFICATE-----
-
-AffirmTrust Premium
-===================
------BEGIN CERTIFICATE-----
-MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS
-BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy
-OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy
-dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
-MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn
-BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV
-5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs
-+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd
-GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R
-p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI
-S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04
-6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5
-/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo
-+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB
-/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv
-MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
-Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC
-6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S
-L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK
-+4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV
-BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg
-IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60
-g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb
-zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==
------END CERTIFICATE-----
-
-AffirmTrust Premium ECC
-=======================
------BEGIN CERTIFICATE-----
-MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
-BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
-MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
-cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
-IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
-N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
-BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
-BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
-57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
-eQ==
------END CERTIFICATE-----
-
-Certum Trusted Network CA
-=========================
------BEGIN CERTIFICATE-----
-MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
-ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
-biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
-MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
-ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
-MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
-l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
-J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
-fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
-cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
-Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
-DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
-jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
-mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
-Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
-03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
------END CERTIFICATE-----
-
-Certinomis - Autorité Racine
-=============================
------BEGIN CERTIFICATE-----
-MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK
-Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg
-LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG
-A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw
-JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD
-ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa
-wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly
-Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw
-2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N
-jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q
-c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC
-lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb
-xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g
-530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna
-4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
-A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ
-KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x
-WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva
-R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40
-nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B
-CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv
-JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE
-qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b
-WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE
-wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/
-vgt2Fl43N+bYdJeimUV5
------END CERTIFICATE-----
-
-Root CA Generalitat Valenciana
-==============================
------BEGIN CERTIFICATE-----
-MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE
-ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290
-IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3
-WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE
-CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2
-F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B
-ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ
-D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte
-JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB
-AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n
-dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB
-ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl
-AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA
-YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy
-AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA
-aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt
-AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA
-YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu
-AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA
-OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0
-dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV
-BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G
-A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S
-b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh
-TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz
-Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63
-NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH
-iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt
-+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=
------END CERTIFICATE-----
-
-A-Trust-nQual-03
-================
------BEGIN CERTIFICATE-----
-MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE
-Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy
-a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R
-dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw
-RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0
-ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1
-c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA
-zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n
-yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE
-SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4
-iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V
-cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV
-eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40
-ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr
-sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd
-JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS
-mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6
-ahq97BvIxYSazQ==
------END CERTIFICATE-----
-
-TWCA Root Certification Authority
-=================================
------BEGIN CERTIFICATE-----
-MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ
-VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG
-EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB
-IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
-AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx
-QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC
-oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP
-4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r
-y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB
-BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG
-9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC
-mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW
-QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY
-T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny
-Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
------END CERTIFICATE-----
-
-Security Communication RootCA2
-==============================
------BEGIN CERTIFICATE-----
-MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
-U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh
-dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC
-SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy
-aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++
-+T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R
-3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV
-spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K
-EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8
-QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
-CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj
-u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk
-3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q
-tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
-mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
------END CERTIFICATE-----
-
-EC-ACC
-======
------BEGIN CERTIFICATE-----
-MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE
-BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w
-ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD
-VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE
-CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT
-BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7
-MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt
-SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl
-Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh
-cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK
-w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT
-ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4
-HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a
-E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw
-0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
-BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD
-VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0
-Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l
-dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ
-lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa
-Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe
-l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2
-E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D
-5EI=
------END CERTIFICATE-----
diff --git a/user_persona/lib/policy.php b/user_persona/lib/policy.php
deleted file mode 100644
index 9ac8c036e..000000000
--- a/user_persona/lib/policy.php
+++ /dev/null
@@ -1,123 +0,0 @@
-<?php
-
-/**
- * ownCloud - Persona plugin
- *
- * @author Victor Dubiniuk
- * @copyright 2012-2013 Victor Dubiniuk victor.dubiniuk@gmail.com
- *
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- */
-
-namespace OCA\User_persona;
-
-class Policy {
- const CONFIG_KEY = 'persona_multiple_user';
-
- const MULTIPLE_USERS_DENY = 0;
- const MULTIPLE_USERS_FIRST = 10;
- const MULTIPLE_USERS_LIST = 20;
-
- /**
- * Check if we have a user to login
- * @param String $email
- * @param String $uid
- * @return String
- */
- public static function apply($email, $uid = '') {
-
- //Get list of matching users
- $list = array();
-
- $query = \OCP\DB::prepare('SELECT userid FROM *PREFIX*preferences WHERE appid = ? AND configkey = ? AND configvalue = ?');
- $result = $query->execute(array('settings', 'email', $email));
-
- while ($userid = $result->fetchOne()) {
- $list[] = $userid;
- }
- $qtyUser = count($list);
-
- //No users found
- if (!$qtyUser) {
- \OCP\Util::writeLog(App::APP_ID, 'No users found. Deny login.', \OCP\Util::DEBUG);
- return false;
- }
-
- //One user found
- if ($qtyUser == 1) {
- \OCP\Util::writeLog(App::APP_ID, 'Single user found. Entering the open space.', \OCP\Util::DEBUG);
- return $list[0];
- }
-
- //Multiple users found
- $currentPolicy = self::getSystemPolicy();
- $isValidUid = in_array($uid, $list);
-
- if ($currentPolicy == self::MULTIPLE_USERS_LIST) {
- //Do we have correct uid?
- if ($isValidUid){
- \OCP\Util::writeLog(App::APP_ID, 'Multiple users found. Entering the open space.', \OCP\Util::DEBUG);
- return $uid;
- } else {
- \OCP\Util::writeLog(App::APP_ID, 'Multiple users found. List them all.', \OCP\Util::DEBUG);
- \OCP\JSON::success(array('list' => $list));
- exit();
- }
- } elseif ($currentPolicy == self::MULTIPLE_USERS_FIRST) {
- \OCP\Util::writeLog(App::APP_ID, 'Multiple users found. Use first.', \OCP\Util::DEBUG);
-
- //not first but the best matching ;)
- $userid = $isValidUid ? $uid : $list[0];
- return $userid;
- }
-
- \OCP\Util::writeLog(App::APP_ID, 'Multiple users found. Deny login.', \OCP\Util::DEBUG);
- return Validator::setAmbigous();
- }
-
- /**
- * Get all available policies
- * @return array
- */
- public static function getAllPolicies() {
- return array(
- self::MULTIPLE_USERS_DENY => 'Login none of them',
- self::MULTIPLE_USERS_FIRST => 'Login first matching user',
- self::MULTIPLE_USERS_LIST => 'Show matches',
- );
- }
-
- /**
- * Set system settings
- * @param int $policy
- */
- public static function setSystemPolicy($policy) {
- $policy = self::_validatePolicy($policy);
- \OCP\Config::setAppValue(App::APP_ID, self::CONFIG_KEY, $policy);
- }
-
- /**
- * Get system settings
- * @return int
- */
- public static function getSystemPolicy() {
- $policy = \OCP\Config::getAppValue(App::APP_ID, self::CONFIG_KEY);
- return self::_validatePolicy($policy);
- }
-
- /**
- * Check if the value is allowed
- * @param int $policy
- * @return int
- */
- protected static function _validatePolicy($policy) {
- $policies = self::getAllPolicies();
- if (!in_array($policy, array_keys($policies))) {
- $policy = self::MULTIPLE_USERS_DENY;
- }
-
- return $policy;
- }
-
-}
diff --git a/user_persona/lib/validator.php b/user_persona/lib/validator.php
deleted file mode 100644
index e835647d5..000000000
--- a/user_persona/lib/validator.php
+++ /dev/null
@@ -1,107 +0,0 @@
-<?php
-
-/**
- * ownCloud - Persona plugin
- *
- * @author Victor Dubiniuk
- * @copyright 2012-2013 Victor Dubiniuk victor.dubiniuk@gmail.com
- *
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- */
-
-namespace OCA\User_persona;
-
-class Validator {
- const VALIDATION_URL = 'https://verifier.login.persona.org/verify';
- const STATUS_SUCCESS = 'okay';
-
- protected static $_isPersona = false;
- protected static $_isAmbigous = false;
-
- /**
- * Send JSON response on successful login
- * @param String $uid
- */
- public static function postlogin_hook($uid){
- if (!self::$_isPersona){
- return;
- }
- \OCP\Util::writeLog(App::APP_ID, 'Check ambigous ' , \OCP\Util::DEBUG);
- if (self::$_isAmbigous){
- //Reply with error and logout
- \OCP\User::logout();
- \OCP\JSON::error(array('msg'=>'More than one user found'));
- exit();
-
- } else {
- \OCP\JSON::success(array('msg'=>'Access granted'));
- exit();
- }
- }
-
- /**
- * Sets multiple users flag
- * @return false
- */
- public static function setAmbigous(){
- self::$_isAmbigous = true;
- return false;
- }
-
- /**
- * Validates an assertion
- * @param String $assertion
- * @return String
- */
- public static function Validate($assertion) {
- self::$_isPersona = true;
- $data = array(
- 'assertion' => $assertion,
- 'audience' => \OCP\Util::getServerProtocol() . '://' . \OCP\Util::getServerHostName()
- );
- $response = self::_query($data);
- return self::_parseResponse($response);
- }
-
- /**
- * Check if response has an email
- * @param string $response
- * @return string
- */
- protected static function _parseResponse($response) {
- $email = false;
- $parsedResponse = json_decode($response, true);
- if (isset($parsedResponse['status']) && $parsedResponse['status'] == self::STATUS_SUCCESS) {
- $email = @$parsedResponse['email'];
- }
- \OCP\Util::writeLog(App::APP_ID, 'Mozilla Persona login with email ' . ($email ? $email : 'empty'), \OCP\Util::DEBUG);
- return $email;
- }
-
- /**
- * cUrl request
- * @param String $data
- * @return String
- */
- protected static function _query($data) {
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL, self::VALIDATION_URL);
- curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
- curl_setopt($ch, CURLOPT_POST, 1);
- curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . DIRECTORY_SEPARATOR . 'cacert.pem');
- curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
- $response = curl_exec($ch);
-
- $error = curl_errno($ch);
- if ($error) {
- \OCP\Util::writeLog(App::APP_ID, 'Curl reports the error: ' . curl_error($ch), \OCP\Util::WARN);
- }
-
- curl_close($ch);
-
- return $response;
- }
-
-} \ No newline at end of file
diff --git a/user_persona/settings.php b/user_persona/settings.php
deleted file mode 100644
index 53bac23ae..000000000
--- a/user_persona/settings.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-
-/**
- * ownCloud - Persona plugin
- *
- * @author Victor Dubiniuk
- * @copyright 2012-2013 Victor Dubiniuk victor.dubiniuk@gmail.com
- *
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- */
-
-namespace OCA\User_persona;
-
-\OCP\User::checkAdminUser();
-
-\OCP\Util::addScript(App::APP_ID, 'settings');
-
-$tmpl = new \OCP\Template(App::APP_ID, 'settings');
-$tmpl->assign('allPolicies', Policy::getAllPolicies());
-$tmpl->assign('currentPolicy', Policy::getSystemPolicy());
-
-return $tmpl->fetchPage(); \ No newline at end of file
diff --git a/user_persona/templates/settings.php b/user_persona/templates/settings.php
deleted file mode 100644
index c4f614ad6..000000000
--- a/user_persona/templates/settings.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-/**
- * ownCloud - Persona plugin
- *
- * @author Victor Dubiniuk
- * @copyright 2012-2013 Victor Dubiniuk victor.dubiniuk@gmail.com
- *
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- */
-?>
-<div class="section">
- <h2><?php p($l->t('Mozilla Persona login settings')) ?>:</h2>
- <?php p($l->t('IF more than one user has email provided by Persona THEN')); ?>
- <select id="mozilla-persona-policy">
- <?php foreach ($_['allPolicies'] as $pValue => $pTitle) { ?>
- <?php $isCurrent = $pValue == $_['currentPolicy']; ?>
- <option <?php print_unescaped($isCurrent ? 'selected="selected"' : '') ?> value="<?php p($pValue) ?>">
- <?php p($l->t($pTitle)); ?>
- </option>
- <?php } ?>
- </select>
-</div>
diff --git a/user_persona/user_persona.php b/user_persona/user_persona.php
deleted file mode 100644
index 4004ad24a..000000000
--- a/user_persona/user_persona.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-
-/**
- * ownCloud - Persona plugin
- *
- * @author Victor Dubiniuk
- * @copyright 2012-2013 Victor Dubiniuk victor.dubiniuk@gmail.com
- *
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- */
-
-class OC_USER_PERSONA extends OC_User_Backend {
-
- protected $_isPersonaRequest;
-
- public function __construct() {
- $this->_isPersonaRequest = @$_POST['authService'] == 'MozillaPersona';
- }
-
- public function createUser($uid, $password) {
- //We can't create user
- return false;
- }
-
- public function deleteUser($uid) {
- //We can't delete user
- return false;
- }
-
- public function setPassword($uid, $password) {
- // We can't change user password
- return false;
- }
-
- public function checkPassword($uid, $assertion) {
- if ($this->_isPersonaRequest) {
- $email = OCA\User_persona\Validator::Validate($assertion);
- if ($email) {
- return OCA\User_persona\Policy::apply($email, $uid);
- }
-
- //we've got incorrect assertion
- OCP\Util::writeLog('OC_USER_PERSONA', 'Validation failed. Incorrect Assertion.', OCP\Util::DEBUG);
- OCP\JSON::error(array('msg'=>'Incorrect Assertion'));
- exit();
- }
-
- return false;
- }
-
- public function userExists($uid) {
- // We dunno
- return false;
- }
-
- public function getUsers($search = '', $limit = null, $offset = null){
- // We don't support user listing
- return array();
- }
-}
diff --git a/user_saml/CHANGELOG.txt b/user_saml/CHANGELOG.txt
deleted file mode 100644
index b39d6ce51..000000000
--- a/user_saml/CHANGELOG.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-CHANGELOG
-=========
-
-Version 0.4 (Tested with OwnCloud 5.0.8)
-----------------------------------------
-
-* Add csrf protection on setting form
-* Add a config param to force the saml login
-* Use openssl_random_pseudo_bytes instead of mt_rand (if available)
-* Support displayName
-* Support multiple values for mapping username, groups, mail and displayName
-
-
-Version 0.3 (Tested with OwnCloud 4.5.2)
-----------------------------------------
-
-* Fix login Issue: Javascript features +
-* RewriteRule of the .httaccess avoid to redirect to apps/user_saml/auth.php. Now appinfo/ap.php do all the work and load the logic
- of the auth.php
-
-
-
-Version 0.2
------------
-
-* BugFix a 500 error that appeared when saml config values were not set
-* Some bugfixes (typos, default settings handler) [from alenkovich]
-* Code style improved [from DeepDiver1975]
-
-
-
-Version 0.1
------------
-
-* Initial plugin
diff --git a/user_saml/README.md b/user_saml/README.md
deleted file mode 100644
index a746da9b4..000000000
--- a/user_saml/README.md
+++ /dev/null
@@ -1,57 +0,0 @@
-INTRODUCTION
-============
-
-This App provide SAML authentication support based on the simpleSAMLphp SP software.
-
-
-INSTALLATION
-============
-
-PREVIOUS DEPENDENCE
--------------------
-
-This App require a simpleSAMLphp SP installed, configured and connected to an IdP.
-To learn how to do this check this documentation:
-
-* `SimpleSAMLphp installation <http://simplesamlphp.org/docs/stable/simplesamlphp-install>`_
-* `SimpleSAMLphp configuration as an SP <http://simplesamlphp.org/docs/stable/simplesamlphp-sp>`_
-
-
-STEPS
------
-
-1. Copy the `user_saml` folder inside the ownCloud's apps folder and give to apache server privileges on whole the folder.
-2. Access to ownCloud web with an user with admin privileges.
-3. Access to the Appications pannel and enable the SAML app.
-4. Access to the Administration pannel and configure the SAML app.
-5. Take care of session issue. ownCloud 4.5.5 and after version set for ownCloud its own session cookiename and that makes conflicts with simpleSAMLphp. There are 2 solutions for this problem:
-
-* Set the same cookiename to simpleSAMLphp and ownCloud. Check the value of the 'instanceid' at config/config.php in ownCloud, and set the same value to the 'session.phpsession.cookiename' var of the config/config.php of simpleSAMLphp
-
-* Use different session handler for ownCloud and simpleSAMLphp, Use memcache or SQL backend in simpleSAMLphp (http://simplesamlphp.org/docs/stable/simplesamlphp-maintenance#section_2)
-
-EXTRA INFO
-==========
-
-* If you enable the "Autocreate user after saml login" option, then if an user does not exist, will be created. If this option is disabled and the user does not existed then the user will be not allowed to log in ownCloud.
-
-* If you enable the "Update user data" option, when an existed user enter, then his email and groups will be updated.
-
- By default the SAML App will unlink all the groups from a user and will provide the group defined at the groupMapping attribute. If the groupMapping is not defined
- the value of the defaultGroup field will be used instead. If both are undefined, then the user will be set with no groups.
- But if you configure the "protected groups" field, those groups will not be unlinked from the user.
-
-* If you want to redirect to any specific app after force the login you can set the url param linktoapp. Also you can pass extra args to build the target url using the param linktoargs (the value must be urlencoded).
- Ex. ?app=user_saml&linktoapp=files&linktoargs=file%3d%2ftest%2ftest_file.txt%26getfile%3ddownload.php
- ?app=user_saml&linktoapp=files&linktoargs=dir%3d%2ftest
-
-* There is a parameter in the settings named `force_saml_login` to avoid the login form, redirecting directly to the IdP when accesing owncloud.
- If you are an admin and you want to log in using the login form, then use the GET param `admin_login` to deactivate the forced redirection.
-
-NOTES
-=====
-
-If you had an older version of this plugin installed and the SAML link no appears at the main view, edit the index.php and set the $RUNTIME_NOAPPS to FALSE;
-
-
-
diff --git a/user_saml/appinfo/app.php b/user_saml/appinfo/app.php
deleted file mode 100644
index 2e280f998..000000000
--- a/user_saml/appinfo/app.php
+++ /dev/null
@@ -1,101 +0,0 @@
-<?php
-
-/**
-* ownCloud - user_saml
-*
-* @author Sixto Martin <smartin@yaco.es>
-* @copyright 2012 Yaco Sistemas // CONFIA
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the License, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library. If not, see <http://www.gnu.org/licenses/>.
-*
-*/
-
-
-if (OCP\App::isEnabled('user_saml')) {
- $ocVersion = implode('.',OCP\Util::getVersion());
- if (version_compare($ocVersion,'5.0','<')) {
- if ( ! function_exists('p')) {
- function p($string) {
- print(OC_Util::sanitizeHTML($string));
- }
- }
- }
-
- require_once 'user_saml/user_saml.php';
-
- OCP\App::registerAdmin('user_saml', 'settings');
-
- // register user backend
- OC_User::useBackend( 'SAML' );
-
- OC::$CLASSPATH['OC_USER_SAML_Hooks'] = 'user_saml/lib/hooks.php';
- OCP\Util::connectHook('OC_User', 'post_createUser', 'OC_USER_SAML_Hooks', 'post_createUser');
- OCP\Util::connectHook('OC_User', 'post_login', 'OC_USER_SAML_Hooks', 'post_login');
- OCP\Util::connectHook('OC_User', 'logout', 'OC_USER_SAML_Hooks', 'logout');
-
- $forceLogin = OCP\Config::getAppValue('user_saml', 'saml_force_saml_login', false)
- && shouldEnforceAuthentication();
-
-
- if( (isset($_GET['app']) && $_GET['app'] == 'user_saml') || (!OCP\User::isLoggedIn() && $forceLogin && !isset($_GET['admin_login']) )) {
-
- require_once 'user_saml/auth.php';
-
- if (!OC_User::login('', '')) {
- $error = true;
- OCP\Util::writeLog('saml','Error trying to authenticate the user', OCP\Util::DEBUG);
- }
-
- if (isset($_GET["linktoapp"])) {
- $path = OC::$WEBROOT . '/?app='.$_GET["linktoapp"];
- if (isset($_GET["linktoargs"])) {
- $path .= '&'.urldecode($_GET["linktoargs"]);
- }
- header( 'Location: ' . $path);
- exit();
- }
-
- OC::$REQUESTEDAPP = '';
- OC_Util::redirectToDefaultPage();
- }
-
- if (!OCP\User::isLoggedIn()) {
- // Load js code in order to render the SAML link and to hide parts of the normal login form
- OCP\Util::addScript('user_saml', 'utils');
- }
-}
-
-
-/*
- * Checks if requiring SAML authentication on current URL makes sense when
- * forceLogin is set.
- *
- * Disables it when using the command line too
- */
-function shouldEnforceAuthentication()
-{
- if (OC::$CLI) {
- return false;
- }
-
- $script = basename($_SERVER['SCRIPT_FILENAME']);
- return !in_array($script,
- array(
- 'cron.php',
- 'public.php',
- 'remote.php',
- 'status.php',
- )
- );
-}
diff --git a/user_saml/appinfo/info.xml b/user_saml/appinfo/info.xml
deleted file mode 100644
index c47b876be..000000000
--- a/user_saml/appinfo/info.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0"?>
-<info>
- <id>user_saml</id>
- <name>SAML user and group backend</name>
- <description>Authenticate Users by SAML</description>
- <licence>AGPL</licence>
- <author>Sixto Martin @ Yaco Sistemas</author>
- <requiremin>5</requiremin>
- <types>
- <prelogin/>
- <authentication/>
- </types>
-</info>
diff --git a/user_saml/appinfo/version b/user_saml/appinfo/version
deleted file mode 100644
index bd73f4707..000000000
--- a/user_saml/appinfo/version
+++ /dev/null
@@ -1 +0,0 @@
-0.4
diff --git a/user_saml/auth.php b/user_saml/auth.php
deleted file mode 100644
index d99b4c123..000000000
--- a/user_saml/auth.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-
-/**
- * ownCloud - user_saml
- *
- * @author Sixto Martin <smartin@yaco.es>
- * @copyright 2012 Yaco Sistemas // CONFIA
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
- *
- * You should have received a copy of the GNU Affero General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
- OCP\App::checkAppEnabled('user_saml');
-
- $sspPath = OCP\Config::getAppValue('user_saml', 'saml_ssp_path', '');
- $spSource = OCP\Config::getAppValue('user_saml', 'saml_sp_source', '');
- $autocreate = OCP\Config::getAppValue('user_saml', 'saml_autocreate', false);
-
- if (!empty($sspPath) && !empty($spSource)) {
- include_once $sspPath."/lib/_autoload.php";
- $auth = new SimpleSAML_Auth_Simple($spSource);
- $auth->requireAuth();
- }
diff --git a/user_saml/css/saml.css b/user_saml/css/saml.css
deleted file mode 100644
index 020ed003b..000000000
--- a/user_saml/css/saml.css
+++ /dev/null
@@ -1,26 +0,0 @@
-
-#samlSettings fieldset{
-
- border-bottom: 1px solid #DDD;
- border-left: 1px solid #DDD;
- border-right: 1px solid #DDD;
- margin-bottom: 10px;
-}
-
-#samlSettings input[type="text"] {
- margin-left: 15px;
- width: 25em;
-}
-
-#samlSettings input[name="saml_ssp_path"] {
- width: 30em;
-}
-
-#samlSettings input[name="saml_sp_source"] {
- width: 15em;
-}
-
-#samlSettings input[name="saml_default_group"] {
- width: 15em;
-}
-
diff --git a/user_saml/img/logo.jpg b/user_saml/img/logo.jpg
deleted file mode 100644
index cdea3bf9d..000000000
--- a/user_saml/img/logo.jpg
+++ /dev/null
Binary files differ
diff --git a/user_saml/js/settings.js b/user_saml/js/settings.js
deleted file mode 100644
index 215dab9ba..000000000
--- a/user_saml/js/settings.js
+++ /dev/null
@@ -1,3 +0,0 @@
-$(document).ready(function() {
- $('#samlSettings').tabs();
-});
diff --git a/user_saml/js/utils.js b/user_saml/js/utils.js
deleted file mode 100644
index 94f0cc63e..000000000
--- a/user_saml/js/utils.js
+++ /dev/null
@@ -1,66 +0,0 @@
-(function() {
-
- var saml = document.createElement('script');
- saml.type = 'text/javascript';
- (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(saml);
-})();
-
-$(document).ready(function(){
-
- var loginMsg = t('user_saml', 'Login with SAML');
-
- $('<div id="login-saml"></div>').css({
- 'text-align': 'center',
- }).appendTo('form');
-
- $('<p>or</p>').css(
- {
- 'text-align': 'center',
- 'font-weight': 'bolder',
- 'font-size' : '110%'
- }).appendTo('#login-saml');
-
- if ($('#user').val() == "") {
- $('#password').parent().hide();
- $('#remember_login').hide();
- $('#remember_login+label').hide();
- $('#submit').hide();
- }
-
- $('#user').change( function() {
- if ($(this).val() !== "") {
- $('#password').parent().show();
- $('#remember_login').show();
- $('#remember_login+label').show();
- $('#submit').show();
- }
- else {
- $('#password').parent().hide();
- $('#remember_login').hide();
- $('#remember_login+label').hide();
- $('#submit').hide();
- }
- });
-
- $('<p>Access using SAML authentication</p>').css(
- {
- 'text-align': 'center',
- 'font-weight': 'bolder',
- 'font-size' : '110%'
- }).appendTo('#login-saml');
-
-
- $('<a id="login-saml-action" href="?app=user_saml" ></a>').css(
- {
- 'text-decoration': 'none'
- }).appendTo('#login-saml');
-
-
- $('<img id="login-saml-img" src="' + OC.imagePath('user_saml', 'logo.jpg') + '" title="'+ loginMsg +'" alt="'+ loginMsg +'" />').css(
- {
- cursor : 'pointer',
- border : '1px solid #777'
- }).appendTo('#login-saml-action');
-
-
-});
diff --git a/user_saml/lib/hooks.php b/user_saml/lib/hooks.php
deleted file mode 100644
index 7ed5e2263..000000000
--- a/user_saml/lib/hooks.php
+++ /dev/null
@@ -1,196 +0,0 @@
-<?php
-/**
- * ownCloud - user_saml
- *
- * @author Sixto Martin <smartin@yaco.es>
- * @copyright 2012 Yaco Sistemas // CONFIA
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
- *
- * You should have received a copy of the GNU Affero General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-/**
- * This class contains all hooks.
- */
-class OC_USER_SAML_Hooks {
-
- static public function post_login($parameters) {
- $uid = '';
- $userid = $parameters['uid'];
- $samlBackend = new OC_USER_SAML();
-
- if ($samlBackend->auth->isAuthenticated()) {
- $attributes = $samlBackend->auth->getAttributes();
-
- $usernameFound = false;
- foreach($samlBackend->usernameMapping as $usernameMapping) {
- if (array_key_exists($usernameMapping, $attributes) && !empty($attributes[$usernameMapping][0])) {
- $usernameFound = true;
- $uid = $attributes[$usernameMapping][0];
- OCP\Util::writeLog('saml','Authenticated user '.$uid,OCP\Util::DEBUG);
- break;
- }
- }
-
- if ($usernameFound && $uid == $userid) {
- if ($samlBackend->updateUserData) {
- $attrs = get_user_attributes($uid, $samlBackend);
- update_user_data($uid, $attrs);
- }
- return true;
- }
- }
- return false;
- }
-
- static public function post_createUser($parameters) {
- $uid = $parameters['uid'];
- $samlBackend = new OC_USER_SAML();
- if (!$samlBackend->updateUserData) {
- // Ensure that user data will be filled atleast once
- $attrs = get_user_attributes($uid, $samlBackend);
- update_user_data($uid, $attrs, true);
- }
- }
-
- static public function logout($parameters) {
- $samlBackend = new OC_USER_SAML();
- if ($samlBackend->auth->isAuthenticated()) {
- OCP\Util::writeLog('saml', 'Executing SAML logout', OCP\Util::DEBUG);
- unset($_COOKIE["SimpleSAMLAuthToken"]);
- setcookie('SimpleSAMLAuthToken', '', time()-3600, \OC::$WEBROOT);
- setcookie('SimpleSAMLAuthToken', '', time()-3600, \OC::$WEBROOT . '/');
- $samlBackend->auth->logout();
- }
- return true;
- }
-}
-
-function get_user_attributes($uid, $samlBackend) {
- $attributes = $samlBackend->auth->getAttributes();
- $result = array();
-
- $result['email'] = '';
- foreach ($samlBackend->mailMapping as $mailMapping) {
- if (array_key_exists($mailMapping, $attributes) && !empty($attributes[$mailMapping][0])) {
- $result['email'] = $attributes[$mailMapping][0];
- break;
- }
- }
-
- $result['display_name'] = '';
- foreach ($samlBackend->displayNameMapping as $displayNameMapping) {
- if (array_key_exists($displayNameMapping, $attributes) && !empty($attributes[$displayNameMapping][0])) {
- $result['display_name'] = $attributes[$displayNameMapping][0];
- break;
- }
- }
-
- $result['groups'] = array();
- foreach ($samlBackend->groupMapping as $groupMapping) {
- if (array_key_exists($groupMapping, $attributes) && !empty($attributes[$groupMapping])) {
- $result['groups'] = array_merge($result['groups'], $attributes[$groupMapping]);
- }
- }
- if (empty($result['groups']) && !empty($samlBackend->defaultGroup)) {
- $result['groups'] = array($samlBackend->defaultGroup);
- OCP\Util::writeLog('saml','Using default group "'.$samlBackend->defaultGroup.'" for the user: '.$uid, OCP\Util::DEBUG);
- }
- $result['protected_groups'] = $samlBackend->protectedGroups;
-
- $result['quota'] = '';
- if (!empty($samlBackend->quotaMapping)) {
- foreach ($samlBackend->quotaMapping as $quotaMapping) {
- if (array_key_exists($quotaMapping, $attributes) && !empty($attributes[$quotaMapping][0])) {
- $result['quota'] = $attributes[$quotaMapping][0];
- break;
- }
- }
- OCP\Util::writeLog('saml','Current quota: "'.$result['quota'].'" for user: '.$uid, OCP\Util::DEBUG);
- }
- if (empty($result['quota']) && !empty($samlBackend->defaultQuota)) {
- $result['quota'] = $samlBackend->defaultQuota;
- OCP\Util::writeLog('saml','Using default quota ('.$result['quota'].') for user: '.$uid, OCP\Util::DEBUG);
- }
-
- return $result;
-}
-
-
-function update_user_data($uid, $attributes=array(), $just_created=false) {
- OC_Util::setupFS($uid);
- OCP\Util::writeLog('saml','Updating data of the user: '.$uid, OCP\Util::DEBUG);
- if(isset($attributes['email'])) {
- update_mail($uid, $attributes['email']);
- }
- if (isset($attributes['groups'])) {
- update_groups($uid, $attributes['groups'], $attributes['protected_groups'], $just_created);
- }
- if (isset($attributes['display_name'])) {
- update_display_name($uid, $attributes['display_name']);
- }
- if (isset($attributes['quota'])) {
- update_quota($uid, $attributes['quota']);
- }
-}
-
-
-function update_mail($uid, $email) {
- $config = \OC::$server->getConfig();
- if ($email != $config->getUserValue($uid, 'settings', 'email', '')) {
- $config->setUserValue($uid, 'settings', 'email', $email);
- OCP\Util::writeLog('saml','Set email "'.$email.'" for the user: '.$uid, OCP\Util::DEBUG);
- }
-}
-
-
-function update_groups($uid, $groups, $protectedGroups=array(), $just_created=false) {
-
- if(!$just_created) {
- $old_groups = OC_Group::getUserGroups($uid);
- foreach($old_groups as $group) {
- if(!in_array($group, $protectedGroups) && !in_array($group, $groups)) {
- OC_Group::removeFromGroup($uid,$group);
- OCP\Util::writeLog('saml','Removed "'.$uid.'" from the group "'.$group.'"', OCP\Util::DEBUG);
- }
- }
- }
-
- foreach($groups as $group) {
- if (preg_match( '/[^a-zA-Z0-9 _\.@\-]/', $group)) {
- OCP\Util::writeLog('saml','Invalid group "'.$group.'", allowed chars "a-zA-Z0-9" and "_.@-" ',OCP\Util::DEBUG);
- }
- else {
- if (!OC_Group::inGroup($uid, $group)) {
- if (!OC_Group::groupExists($group)) {
- OC_Group::createGroup($group);
- OCP\Util::writeLog('saml','New group created: '.$group, OCP\Util::DEBUG);
- }
- OC_Group::addToGroup($uid, $group);
- OCP\Util::writeLog('saml','Added "'.$uid.'" to the group "'.$group.'"', OCP\Util::DEBUG);
- }
- }
- }
-}
-
-
-function update_display_name($uid, $displayName) {
- OC_User::setDisplayName($uid, $displayName);
-}
-
-function update_quota($uid, $quota) {
- if (!empty($quota)) {
- \OCP\Config::setUserValue($uid, 'files', 'quota', \OCP\Util::computerFileSize($quota));
- }
-}
diff --git a/user_saml/settings.php b/user_saml/settings.php
deleted file mode 100644
index 36d7cd629..000000000
--- a/user_saml/settings.php
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-
-/**
- * ownCloud - user_saml
- *
- * @author Sixto Martin <smartin@yaco.es>
- * @copyright 2012 Yaco Sistemas // CONFIA
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
- *
- * You should have received a copy of the GNU Affero General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-OC_Util::checkAdminUser();
-
-$params = array('saml_ssp_path', 'saml_sp_source', 'saml_force_saml_login', 'saml_autocreate', 'saml_update_user_data', 'saml_protected_groups', 'saml_default_group', 'saml_username_mapping', 'saml_email_mapping', 'saml_quota_mapping', 'saml_default_quota', 'saml_displayname_mapping', 'saml_group_mapping');
-
-OCP\Util::addscript('user_saml', 'settings');
-
-if ($_POST) {
- // CSRF check
- OCP\JSON::callCheck();
-
- foreach($params as $param) {
- if (isset($_POST[$param])) {
- OCP\Config::setAppValue('user_saml', $param, $_POST[$param]);
- }
- elseif ('saml_force_saml_login' == $param) {
- OCP\Config::setAppValue('user_saml', $param, 0);
- }
- elseif ('saml_autocreate' == $param) {
- // unchecked checkboxes are not included in the post paramters
- OCP\Config::setAppValue('user_saml', $param, 0);
- }
- elseif ('saml_update_user_data' == $param) {
- OCP\Config::setAppValue('user_saml', $param, 0);
- }
- }
-}
-
-// fill template
-$tmpl = new OCP\Template( 'user_saml', 'settings');
-foreach ($params as $param) {
- $value = htmlentities(OCP\Config::getAppValue('user_saml', $param,''));
- $tmpl->assign($param, $value);
-}
-
-// settings with default values
-$tmpl->assign( 'saml_ssp_path', OCP\Config::getAppValue('user_saml', 'saml_ssp_path', '/var/www/sp/simplesamlphp'));
-$tmpl->assign( 'saml_sp_source', OCP\Config::getAppValue('user_saml', 'saml_sp_source', 'default-sp'));
-$tmpl->assign( 'saml_force_saml_login', OCP\Config::getAppValue('user_saml', 'saml_force_saml_login', 0));
-$tmpl->assign( 'saml_autocreate', OCP\Config::getAppValue('user_saml', 'saml_autocreate', 0));
-$tmpl->assign( 'saml_update_user_data', OCP\Config::getAppValue('user_saml', 'saml_update_user_data', 0));
-$tmpl->assign( 'saml_protected_groups', OCP\Config::getAppValue('user_saml', 'saml_protected_groups', ''));
-$tmpl->assign( 'saml_default_group', OCP\Config::getAppValue('user_saml', 'saml_default_group', ''));
-$tmpl->assign( 'saml_username_mapping', OCP\Config::getAppValue('user_saml', 'saml_username_mapping', 'uid'));
-$tmpl->assign( 'saml_email_mapping', OCP\Config::getAppValue('user_saml', 'saml_email_mapping', 'mail'));
-$tmpl->assign( 'saml_displayname_mapping', OCP\Config::getAppValue('user_saml', 'saml_displayname_mapping', 'displayName'));
-$tmpl->assign( 'saml_quota_mapping', OCP\Config::getAppValue('user_saml', 'saml_quota_mapping', ''));
-$tmpl->assign( 'saml_default_quota', OCP\Config::getAppValue('user_saml', 'saml_default_quota', ''));
-$tmpl->assign( 'saml_group_mapping', OCP\Config::getAppValue('user_saml', 'saml_group_mapping', ''));
-
-return $tmpl->fetchPage();
diff --git a/user_saml/templates/settings.php b/user_saml/templates/settings.php
deleted file mode 100644
index eb09e468b..000000000
--- a/user_saml/templates/settings.php
+++ /dev/null
@@ -1,32 +0,0 @@
-
-<link rel="stylesheet" type="text/css" href="../apps/user_saml/css/saml.css" />
-
-<form id="saml" action="#" method="post">
- <div id="samlSettings" class="personalblock">
- <strong><?php p($l->t('SAML Authentication backend'));?></strong>
- <ul>
- <li><a href="#samlSettings-1"><?php p($l->t('Basic'));?></a></li>
- <li><a href="#samlSettings-2"><?php p($l->t('Mapping'));?></a></li>
- </ul>
- <fieldset id="samlSettings-1">
- <p><label for="saml_ssp_path"><?php p($l->t('SimpleSAMLphp path'));?></label><input type="text" id="saml_ssp_path" name="saml_ssp_path" value="<?php p($_['saml_ssp_path']); ?>"></p>
- <p><label for="saml_sp_source"><?php p($l->t('SimpleSAMLphp SP source'));?></label><input type="text" id="saml_sp_source" name="saml_sp_source" value="<?php p($_['saml_sp_source']); ?>"></p>
- <p><label for="saml_force_saml_login"><?php p($l->t('Force SAML login?'));?></label><input type="checkbox" id="saml_force_saml_login" name="saml_force_saml_login" <?php p((($_['saml_force_saml_login'] != false) ? 'checked="checked"' : '')); ?>></p>
- <p><label for="saml_autocreate"><?php p($l->t('Autocreate user after saml login?'));?></label><input type="checkbox" id="saml_autocreate" name="saml_autocreate" <?php p((($_['saml_autocreate'] != false) ? 'checked="checked"' : '')); ?>></p>
- <p><label for="saml_update_user_data"><?php p($l->t('Update user data after login?'));?></label><input type="checkbox" id="saml_update_user_data" name="saml_update_user_data" <?php p((($_['saml_update_user_data'] != false) ? 'checked="checked"' : '')); ?>></p>
- <p><label for="saml_protected_groups"><?php p($l->t('Groups that will not be unlinked from the user when sync the IdP and the owncloud'));?></label><input type="text" id="saml_protected_groups" name="saml_protected_groups" value="<?php p($_['saml_protected_groups']); ?>" /></p> <?php p($l->t('(protected group are multivalued, use comma to separate the values)')); ?>
- <p><label for="saml_default_group"><?php p($l->t('Default group when autocreating users and not group data found for the user'));?></label><input type="text" id="saml_default_group" name="saml_default_group" value="<?php p($_['saml_default_group']); ?>"></p>
- </fieldset>
- <fieldset id="samlSettings-2">
- <p><label for="saml_username_mapping"><?php p($l->t('Username'));?></label><input type="text" id="saml_username_mapping" name="saml_username_mapping" value="<?php p($_['saml_username_mapping']); ?>" /></p>
- <p><label for="saml_email_mapping"><?php p($l->t('Email'));?></label><input type="text" id="saml_email_mapping" name="saml_email_mapping" value="<?php p($_['saml_email_mapping']); ?>" /></p>
- <p><label for="saml_displayname_mapping"><?php p($l->t('DisplayName'));?></label><input type="text" id="saml_displayname_mapping" name="saml_displayname_mapping" value="<?php p($_['saml_displayname_mapping']); ?>" /></p>
- <p><label for="saml_quota_mapping"><?php p($l->t('Quota'));?></label><input type="text" id="saml_quota_mapping" name="saml_quota_mapping" value="<?php p($_['saml_quota_mapping']); ?>" /></p>
- <p><label for="saml_default_quota"><?php p($l->t('Quota Default'));?></label><input type="text" id="saml_default_quota" name="saml_default_quota" value="<?php p($_['saml_default_quota']); ?>" title="<?php echo $l->t('in bytes');?>" /></p>
- <p><label for="saml_group_mapping"><?php p($l->t('Group'));?></label><input type="text" id="saml_group_mapping" name="saml_group_mapping" value="<?php p($_['saml_group_mapping']); ?>" /></p>
- </fieldset>
- <input type="hidden" name="requesttoken" value="<?php echo $_['requesttoken'] ?>" id="requesttoken">
- <input type="submit" value="Save" />
- </div>
-
-</form>
diff --git a/user_saml/user_saml.php b/user_saml/user_saml.php
deleted file mode 100644
index 847be3b28..000000000
--- a/user_saml/user_saml.php
+++ /dev/null
@@ -1,110 +0,0 @@
-<?php
-
-/**
- * ownCloud - user_saml
- *
- * @author Sixto Martin <smartin@yaco.es>
- * @copyright 2012 Yaco Sistemas // CONFIA
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
- *
- * You should have received a copy of the GNU Affero General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-class OC_USER_SAML extends OC_User_Backend {
-
- // cached settings
- protected $sspPath;
- protected $spSource;
- public $forceLogin;
- public $autocreate;
- public $updateUserData;
- public $protectedGroups;
- public $defaultGroup;
- public $usernameMapping;
- public $mailMapping;
- public $displayNameMapping;
- public $quotaMapping;
- public $defaultQuota;
- public $groupMapping;
- public $auth;
-
-
- public function __construct() {
- $this->sspPath = OCP\Config::getAppValue('user_saml', 'saml_ssp_path', '');
- $this->spSource = OCP\Config::getAppValue('user_saml', 'saml_sp_source', '');
- $this->forceLogin = OCP\Config::getAppValue('user_saml', 'saml_force_saml_login', false);
- $this->autocreate = OCP\Config::getAppValue('user_saml', 'saml_autocreate', false);
- $this->updateUserData = OCP\Config::getAppValue('user_saml', 'saml_update_user_data', false);
- $this->defaultGroup = OCP\Config::getAppValue('user_saml', 'saml_default_group', '');
- $this->protectedGroups = explode (',', preg_replace('/\s+/', '', OCP\Config::getAppValue('user_saml', 'saml_protected_groups', '')));
- $this->usernameMapping = explode (',', preg_replace('/\s+/', '', OCP\Config::getAppValue('user_saml', 'saml_username_mapping', '')));
- $this->mailMapping = explode (',', preg_replace('/\s+/', '', OCP\Config::getAppValue('user_saml', 'saml_email_mapping', '')));
- $this->displayNameMapping = explode (',', preg_replace('/\s+/', '', OCP\Config::getAppValue('user_saml', 'saml_displayname_mapping', '')));
- $this->quotaMapping = explode (',', preg_replace('/\s+/', '', OCP\Config::getAppValue('user_saml', 'saml_quota_mapping', '')));
- $this->defaultQuota = OCP\Config::getAppValue('user_saml', 'saml_default_quota', '');
- $this->groupMapping = explode (',', preg_replace('/\s+/', '', OCP\Config::getAppValue('user_saml', 'saml_group_mapping', '')));
-
- if (!empty($this->sspPath) && !empty($this->spSource)) {
- include_once $this->sspPath."/lib/_autoload.php";
-
- $this->auth = new SimpleSAML_Auth_Simple($this->spSource);
-
- if (isset($_COOKIE["user_saml_logged_in"]) AND $_COOKIE["user_saml_logged_in"] AND !$this->auth->isAuthenticated()) {
- unset($_COOKIE["user_saml_logged_in"]);
- setcookie("user_saml_logged_in", null, -1);
- OCP\User::logout();
- }
- }
- }
-
-
- public function checkPassword($uid, $password) {
-
- if(!$this->auth->isAuthenticated()) {
- return false;
- }
-
- $attributes = $this->auth->getAttributes();
-
- foreach($this->usernameMapping as $usernameMapping) {
- if (array_key_exists($usernameMapping, $attributes) && !empty($attributes[$usernameMapping][0])) {
- $uid = $attributes[$usernameMapping][0];
- OCP\Util::writeLog('saml','Authenticated user '.$uid, OCP\Util::DEBUG);
- if(!OCP\User::userExists($uid) && $this->autocreate) {
- return $this->createUser($uid);
- }
- return $uid;
- }
- }
-
- OCP\Util::writeLog('saml','Not found attribute used to get the username at the requested saml attribute assertion', OCP\Util::DEBUG);
- $secure_cookie = OC_Config::getValue("forcessl", false);
- $expires = time() + OC_Config::getValue('remember_login_cookie_lifetime', 60*60*24*15);
- setcookie("user_saml_logged_in", "1", $expires, '', '', $secure_cookie);
-
- return false;
- }
-
- private function createUser($uid) {
- if (preg_match( '/[^a-zA-Z0-9 _\.@\-]/', $uid)) {
- OCP\Util::writeLog('saml','Invalid username "'.$uid.'", allowed chars "a-zA-Z0-9" and "_.@-" ',OCP\Util::DEBUG);
- return false;
- } else {
- $random_password = OCP\Util::generateRandomBytes(64);
- OCP\Util::writeLog('saml','Creating new user: '.$uid, OCP\Util::DEBUG);
- \OC::$server->getUserManager()->createUser($uid, $random_password);
- return $uid;
- }
- }
-}